Untitled

mail@pastecode.io avatar
unknown
python
21 days ago
2.0 kB
0
Indexable
Never
def bisection_method(f, a, b, epsi):
    c = 0
    while (b - a) / 2.0 > epsi:
        c += 1
        midpoint = (a + b) / 2.0
        if (f(midpoint) == 0):
            break
        elif f(a) * f(midpoint) < 0:
            b = midpoint
        else:
            a = midpoint
    
    print("Метод половинного деления: x = ", round((a + b) / 2.0, 6), "; Число итераций: ", c, ";")

def secant_method(f, f_p2, a, b, epsi):

    fa = f(a)
    fp2a = f_p2(a)

    if fa * fp2a > 0:
        x_0 = a
    else:
        x_0 = b
    
    x_1 = a if x_0 == b else b
    c = 0
    for _ in range(1000):
        c += 1
        fx_0 = f(x_0)
        fx_1 = f(x_1)
        x_new = x_1 - fx_1 * (x_1 - x_0) / (fx_1 - fx_0)
        if abs(x_new - x_1) < epsi:
            break
        x_0, x_1 = x_1, x_new

    print("Метод секущих: x = ", round(x_new, 6), "; Число итераций: ", c, ";")

def simple_iteration_method(f, fi, fi_p, a, b, x0, epsi):
    if abs(fi_p(a)) >= 1 or abs(fi_p(b)) >= 1:
        print("Метод простой итерации расходится на интервале.")
        return
    else:
        x_prev = x0
        x_curr = fi(x_prev)
        c = 0

        while abs(x_curr - x_prev) > epsi and abs(f(x_curr)) > epsi:

            x_prev = x_curr
            x_curr = fi(x_prev)
            c += 1

            if abs(fi_p(x_curr)) >= 1:
                print("Метод может не сойтись на шаге", c)
                return
            if (x_curr < a or x_curr > b):
                print("Новое приближение метода простой итерации выходит за пределы интервала на шаге", c)
                return
            
    print("Метод простой итерации: x = ", round(x_curr, 6), "; Число итераций: ", c, ";")
Leave a Comment