1. 數值求根法 :牛頓迭代法 (一)
求根步驟:
1. 設定容許誤差 tol > 0
2. 猜測起始近似根為 a
3. 計算 f(a) 與 f’(a)
4. 計算 b = a −
5. 如果 |f(b)| < tol ,則 b 為近似根,輸出 b 後停止計算
6. 更新 a = b ,回到步驟 3
152國立中央大學數學系
不良的起始近似根 a 可能造成求根步驟無法收斂,此時要變更起始近似根。
起始近似根可透過函數圖形來估算。
2. 153
數值求根法 :牛頓迭代法 (二)
以上兩種求根法是否收斂都跟起始設定有關,二分逼近法起始求根範圍
(a,b) 如果不滿足 f(a)f(b) < 0,則演算步驟不成立。牛頓法的起
始根 a 若不靠近函數根 r ,往往造成近似根不收斂。為了確保兩個方
法都能收斂,可先用畫圖法畫出函數圖形,由中觀察根的大概位置,然
後找出二分逼近法的起始範圍 (a,b) 或是牛頓法的起始點 a 。
一般來說,二分逼近法是最緩慢的求根法,牛頓求根法的收斂速度則是
相當快,幾次迭代就可快速逼近函數根。
本程式利用函式來設定求根函數與其一次微分函數,此範例的求根函數為
f(x) = − 2,函數根 r 為 ,一次微分則為 f(x) = 2x 。
函數根 r 用來計算根的誤差,決定近似根的品質。兩種求根法都以近似
根的函數值是否小於容忍值 tol 來決定是否跳離迴圈結束迭代。
國立中央大學數學系
3. 154
import math
# 函數 : x**2 - 2 與一次微分: 2x
def f(x) : x**2 - 2
def df(x) : 2*x
# 根
r = math.sqrt(2)
# 牛頓迭代法
a , k , tol = 2 , 0 , 1.e-14
err = abs(a-r)
print( "> 牛頓迭代法:" )
print( "{:<2} : {:<10e} {:<10e}".format(k,a,err) , sep="" )
while True :
b = a - f(a)/df(a)
err = abs(b-r)
k += 1
# 迭代次數 近似根 誤差,以下 10e 代表以 10 格與科學記號呈現數字
print( "{:<2} : {:<10e} {:<10e}".format(k,b,err) , sep="" )
# 函數絕對值小於 tol 才跳離迭代
if abs(f(b)) < tol : break
a = b
數值求根法 :牛頓迭代法 (三)
國立中央大學數學系