不動點迭代法求方程的根(Python實現)

不動點迭代法

將原先的
f(x)=0 f(x) = 0
轉化成
x=h(x) x = h(x)
的方式進行求解。

不動點的存在性定理

定理1

如果 f(x)f(x) 爲區間[a,b][a, b]上的連續函數,且滿足下面兩個條件:

  1. 壓縮性:對於 x[a,b]x \in [a, b], af(x)ba \leq f(x) \leq b

  2. 大L性質:存在正常數L<1, 使得,對於任意的x,y[a,b]x, y \in [a, b] 都有,
    f(x)f(y)Lxy |f(x) - f(y)| \leq L|x-y|

則存在有唯一的不動點。

構造h(x)=f(x)xh(x) = f(x) - x,再用連續函數的介值定理就可以證明存在性,唯一性代入就可證明。

局部收斂定理:

若有這樣的不動點 xx^* ,如果存在有在不動點附近的某個領域,滿足有h(x)<1h'(x) < 1,則迭代法:
xt+1=h(xt) x_{t+1} = h(x_t)
局部收斂。

  • h(x)h'(x^*)數值越接近0,收斂速度越快。
  • 如果對於小於n次的導數在不動點出都爲0,且h(n)(x)h^{(n)}(x) 不一定爲0,則稱爲n階收斂

舉列子

  • 求根號數的迭代(不妨取根號3)

迭代方式有很多種比如:
x23=0x=xλ(x23)λ[0,1]xk+1=xkλ(xk23) \begin{aligned} x^2 - 3 =& 0 \\ x =& x - \lambda (x^2 - 3) & \lambda \in [0, 1] \\ x_{k+1} =& x_{k} - \lambda (x_{k}^2 - 3)\\ \end{aligned}

代碼:

x = 1
for i in range(100):
    x = x - 0.1 * (x ** 2 - 3)
print(x)

輸出:

1.7320508075688772

x23=0nx2=(n1)x2+3nNx=(n1)xn+3nxxk+1=(n1)xkn+3nxk \begin{aligned} x^2 - 3 =& 0 \\ nx^2 =& (n-1)x^2 + 3 & n \in N \\ x =& \frac{(n-1)x}{n} + \frac{3}{nx} \\ x_{k+1} =& \frac{(n-1)x_k}{n} + \frac{3}{nx_k}\\ \end{aligned}

代碼:

x, n = 2, 2
for i in range(100):
    x = (n - 1) / n * x + 3 / (n * x)
print(x)

輸出:

1.7320508075688772
  • 實際上的3\sqrt{3}
import math
math.sqrt(3)
  • 輸出:1.7320508075688772

尾記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章