贝尔斯托法求根

版权声明:博主的博客不值钱随便转载但要注明出处 https://blog.csdn.net/easylovecsdn/article/details/84404490

先上总结,紧跟代码,后上讲解

总结

之前总结不完整,完整的以后敬上

Python代码(重修订)

注:代码中的下标正好与上面推论中的相反

import cmath
import math


def f(x):
    return x ** 5 - 3.5 * x ** 4 + 2.75 * x ** 3 + 2.125 * x ** 2 - 3.875 * x + 1.25


rate = 0.01

r = s = -1

a = [1, -3.5, 2.75, 2.125, -3.875, 1.25]
b = []
c = []

def deal() :
    for i in range(len(b)) :
        a[i] = b[i]
    del a[len(a) - 2 : len(a)]

flag= 0

for k in range(9999):

    size = len(a)

    del b[0: len(b)]
    b.append(a[0])
    b.append(a[1] + r * b[0])

    for i in range(2, size):
        b.append(a[i] + r * b[i - 1] + s * b[i - 2])

    del c[0: len(c)]
    c.append(b[0])
    c.append(b[1] + r * c[0])

    for i in range(2, size - 1):
        c.append(b[i] + r * c[i - 1] + s * c[i - 2])


    R = (b[size - 2] * c[size - 3] - b[size - 1] * c[size - 4]) / (c[size - 2] * c[size - 4] - c[size - 3] * c[size - 3])
    S = (b[size - 1] * c[size - 3] - b[size - 2] * c[size - 2]) / (c[size - 2] * c[size - 4] - c[size - 3] * c[size - 3])

    r += R
    s += S

    er = math.fabs(R / r)
    es = math.fabs(S / s)




    if er <= rate and es <= rate:

        x = (r + cmath.sqrt(r * r + 4 * s)) / 2
        print(x)

        x = (r - cmath.sqrt(r * r + 4 * s)) / 2
        print(x)


        if flag == 1 :

            print(-b[1] / b[0])

            break

        deal()
        flag = 1


输出结果

与答案正好匹配

讲解

猜你喜欢

转载自blog.csdn.net/easylovecsdn/article/details/84404490