数值分析第七章节 用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^* 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}")
算了,开摆。就这样吧,不想写了。