基础知识
- [步骤1] 准备:选定初始近似值 x 0 x_0 x0,计算 f 0 = f ( x 0 ) , f 0 ′ = f ′ ( x 0 ) f_0=f(x_0),f_0'=f'(x_0) f0=f(x0),f0′=f′(x0)
- [步骤2] 迭代:按公式:
x 1 = x 0 − f 0 / f 0 ′ x_1=x_0-f_0/f_0' x1=x0−f0/f0′
迭代一次,得到新的近似值 x 1 x_1 x1,计算 f 1 = f ( x 1 ) , f 1 ′ = f ( x 1 ) f_1=f(x_1),f_1'=f(x_1) f1=f(x1),f1′=f(x1) - [步骤3]
控制:如果 x 1 x_1 x1满足 ∣ δ ∣ < ε 1 |\delta|<\varepsilon_1 ∣δ∣<ε1或 ∣ δ ∣ < ε 2 |\delta|<\varepsilon_2 ∣δ∣<ε2,则终止迭代,以 x 1 x_1 x1作为所求的根;否则转步骤4。此处 ε 1 , ε 2 \varepsilon_1,\varepsilon_2 ε1,ε2是允许误差,而
δ = { ∣ x 1 − x 0 ∣ , ∣ x 1 ∣ < C ∣ x 1 − x 0 ∣ ∣ x 1 ∣ , ∣ x 1 ∣ ≥ C \delta= \left\{ \begin{aligned} |x_1-x_0|,|x_1|<C\\ \frac{|x_1-x_0|}{|x_1|},|x_1|\geq C\\ \end{aligned} \right. δ=⎩⎪⎨⎪⎧∣x1−x0∣,∣x1∣<C∣x1∣∣x1−x0∣,∣x1∣≥C
其中C是取绝对误差或相对误差的控制常熟,一般可取 C = 1 C=1 C=1 - [步骤4]
修改:如果迭代次数达到预先指定的次数N,或者 f 1 ′ = 0 f_1'=0 f1′=0,则方法失败;否则以 ( x 1 , f 1 , f 1 ′ ) (x_1,f_1,f_1') (x1,f1,f1′)代替 ( x 0 , f 0 , f 0 ′ ) (x_0,f_0,f_0') (x0,f0,f0′)转步骤2继续迭代。
代码部分
import math
import numpy as np
import sympy
from sympy import *
x = symbols("x")
x_value=[]
x_iteration=[]
x_diff_iteration=[]
def function_value():
return x*exp(x)-1
def Newton_Methods(x0,f): #此处x0为初值,f为函数方程
k=0 #记录迭代次数
x_value.append(x0)
x_iteration.append(f.subs(x,x0))
x_diff_iteration.append(diff(f,x).subs(x,x0))
while(k<10): #小于规定迭代次数
x_value.append(x_value[k]-(x_iteration[k]/x_diff_iteration[k]))
x_iteration.append(f.subs(x,x_value[k+1]))
x_diff_iteration.append(diff(f,x).subs(x,x_value[k+1]))
if(x_iteration[-1]==x_iteration[-2]): #终止迭代条件
break
k=k+1
return x_value
result=Newton_Methods(0.5,function_value())
#格式化输出
for i in range(len(result)):
print('When k=%d,the x value is %.10f'%(i,result[i]))
运行结果
使用课本P223页例题7验证程序结果
用牛顿法解方程:
x
e
x
−
1
=
0
xe^x-1=0
xex−1=0
结果如下: