网站建设相关推荐百度首页推广
参考书籍:数值分析 第五版 李庆杨 王能超 易大义编 第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^* k→∞limxk=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)∣≤L∣x−y∣,则 φ ( 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 xex−1=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=xk−f′(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=xk−f′(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 xex−1=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 xex−1=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}")
算了,开摆。就这样吧,不想写了。