数值分析第七章节 用Python实现非线性方程与方程组的数值解法

参考书籍:数值分析 第五版 李庆杨 王能超 易大义编 第7章 非线性方程与方程组的数值解法
文章声明:如有发现错误,欢迎批评指正


7.1方程求根与二分法:太简单了(程序设计竞赛这些都是基本)。直接跳过。注意一下一些概念。
7.2不动点迭代法及其收敛性:7.2.1不动点与不动点迭代法: f ( x ) = 0 f(x)=0 f(x)=0恒等变为 x = φ ( x ) x=\varphi(x) x=φ(x)。用迭代方程 x k + 1 = φ ( x k ) x_{k+1}=\varphi(x_k) xk+1=φ(xk) x ( 0 ) x_{(0)} x(0)随便选。如 lim ⁡ k → ∞ x k = x ∗ \lim\limits_{k\rightarrow\infty}x_k=x^* klimxk=x,则称迭代方程收敛;反之,发散。7.2.2不动点的存在性与迭代法的收敛性:定理1 设 φ ( x ) ∈ C [ a , b ] \varphi(x)\in C[a,b] φ(x)C[a,b]满足以下两个条件:(1)对任意的 x ∈ [ a , b ] x\in[a,b] x[a,b] a ≤ φ ( x ) ≤ b a\leq\varphi(x)\leq b aφ(x)b(2)存在正常数 L < 1 L<1 L<1,使对任意 x , y ∈ [ a , b ] x,y\in[a,b] x,y[a,b]都有 ∣ φ ( x ) − φ ( y ) ∣ ≤ L ∣ x − y ∣ |\varphi(x)-\varphi(y)|\leq L|x-y| φ(x)φ(y)Lxy,则 φ ( x ) \varphi(x) φ(x) [ a , b ] [a,b] [a,b]上存在唯一的不动点 x ∗ x^* x。证明可以看下,不是特别困难。7.2.3局部收敛性与收敛阶:不作讨论。

迭代法求解 x e x − 1 = 0 xe^x-1=0 xex1=0

from math import e
x=0.5
print(f"k={0:02d},{x:.10f}")
for i in range(10):
    x=1/pow(e,x)
    print(f"k={i+1:02d},{x:.10f}")

在这里插入图片描述

7.3迭代收敛的加速方法:不作讨论
7.4牛顿法:7.4.1牛顿法及其收敛性:牛顿法 x k + 1 = x k − f ( x k ) f ′ ( x k ) , k = 0 , 1 , … , x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)},k=0,1,\dots, xk+1=xkf(xk)f(xk),k=0,1,,(又切线法)
7.4.2牛顿法的应用举例:不作讨论。7.4.3简化牛顿法与牛顿下山法。牛顿法的优点是收敛快,缺点是每步迭代要计算 f ( x k ) f(x_k) f(xk) f ′ ( x k ) f'(x_k) f(xk),计算量较大且有时 f ′ ( x k ) f'(x_k) f(xk)计算较困难;二是初始近似 x 0 x_0 x0只在根 x ∗ x^* x附近才能保证收敛,如 x 0 x_0 x0给的不合适可能不收敛。为克服这两个缺点,通常可用下述方法。简化牛顿法 x k + 1 = x k − 1 f ′ ( x 0 ) f ( x k ) x_{k+1}=x_k-\frac{1}{f'(x_0)}f(x_k) xk+1=xkf(x0)1f(xk);牛顿下山法 x k + 1 = x k − λ f ( x k ) x_{k+1}=x_k-\lambda f(x_k) xk+1=xkλf(xk) λ \lambda λ为下山因子,从1开取,逐次减半,直到满足条件 ∣ f ( x k + 1 ) ∣ < ∣ f ( x k ) ∣ |f(x_{k+1})|<|f(x_k)| f(xk+1)<f(xk)止。

牛顿法求解 x e x − 1 = 0 xe^x-1=0 xex1=0

from math import e
def func(x):
    return x-(x*pow(e,x)-1)/(pow(e,x)*(1+x))
x=0.5
print(f"k={0:02d},{x:.10f}")
for i in range(10):
    x=func(x)
    print(f"k={i+1:02d},{x:.10f}")

在这里插入图片描述

简化牛顿法求解 x e x − 1 = 0 xe^x-1=0 xex1=0

from math import e
def func(x):
    return x*pow(e,x)-1
x=0.5
print(f"k={0:02d},{x:.10f}")
C=1/(pow(e,x)*(1+x))
for i in range(10):
    x=x-C*func(x)
    print(f"k={i+1:02d},{x:.10f}")

在这里插入图片描述
算了,开摆。就这样吧,不想写了。