牛頓單點線割迭代法求解非線性方程

ThinkZtoA發表於2021-01-03
from matplotlib import pyplot as plt
import numpy as np


def fun(x):
    return x**3-2*x-5


def dfun(x):
    return 3*x*x-2


def newton(fun,dfun,a,b,eps):
    err = 1
    x = b
    k = 0
    lada = 1
    x_r = []
    x_r.append(x)
    x = x - fun(x) / dfun(x)
    k = k + 1
    while err > eps:
        x_r.append(x)
        x = x - fun(x)*(x-x_r[0])/(fun(x)-fun(x_r[0]))
        err = fun(x)
        k = k + 1
    print('牛頓單點線割法的迭代次數為{:d}次'.format(k))
    print('x的迭代過程:')
    num = 0
    for i in x_r:
        print('{:.7f}'.format(i), end='  ')
        num = num+1
        if num%5 == 0:
            print(' ')
    print(' ')
    return x


x = newton(fun, dfun, 0, 10, 0.0000001)
print('牛頓單點線割迭代法的求解結果為{:.7}'.format(x))
x1 = np.linspace(-10, 10, 1000)
y1 = fun(x1)
plt.plot(x1, y1)
plt.show()

在這裡插入圖片描述
在這裡插入圖片描述

相關文章