二分法
二分法是最簡單的求根算法。
對于方程 f ( x ) = 0 f(x)=0 f(x)=0,如果 f ( a ) ? f ( b ) < 0 f(a)\cdot f(b)<0 f(a)?f(b)<0,則說明 a , b a,b a,b之間必有根,如果按照某個步長對其進行搜索,那么最終一定能夠不斷縮小根的取值范圍,不斷精確化。
二分法就是基于這種思想的一種算法,其實質是對區(qū)間進行快速選取。如果已知 f ( a ) ? f ( b ) < 0 f(a)\cdot f(b)<0 f(a)?f(b)<0,則快速選取 c = a + b 2 c=\frac{a+b}{2} c=2a+b?,如果 f ( a ) ? f ( c ) < 0 f(a)\cdot f(c)<0 f(a)?f(c)<0,則說明根在 ( a , c ) (a,c) (a,c)之間,否則即說明根在 ( a , b ) (a,b) (a,b)之間,然后不斷迭代下去。
scipy
提供了二分求根算法bisect
,測試如下
from scipy.optimize import bisect
def func(x):
return x*x - 2
bisect(func, 0, 2)
# 1.4142135623715149
其中,func
為待求函數(shù),0,2
為下限和上限。
牛頓法
如果 f ( x ) f(x) f(x)=0可以寫成 x = φ ( x ) x=\varphi(x) x=φ(x)的形式,則可以將這個方程的根理解為 y = φ ( x ) y=\varphi(x) y=φ(x)與 y = x y=x y=x的交點。現(xiàn)給定一個初值 x 0 x_0 x0?,將其代入 φ ( x ) \varphi(x) φ(x)中,則 φ ( x 0 ) \varphi(x_0) φ(x0?)對應一個新的 x x x,記為 x 1 x_1 x1?。
如果數(shù)列 { x n } \{x_n\} {xn?}收斂,那么必有 x = lim ? k → ∞ x k x=\lim_{k\to\infty}x_k x=limk→∞?xk?即為方程的根。所以,問題的關鍵在構造合適的 φ ( x ) \varphi(x) φ(x)使得數(shù)列能夠快速收斂。
其最簡單的形式莫過于 x k + 1 = x k + f ( x k ) x_{k+1}=x_k+f(x_k) xk+1?=xk?+f(xk?),不過這種迭代公式看起來十分危險,如果$f(x_k)是一個大于0的單調遞增函數(shù),那么結果就爆炸了。
所以,最好為 f ( x k ) f(x_k) f(xk?)乘以一個系數(shù),當 f ( x k ) f(x_k) f(xk?)增加時使之變小,當其遞減時使之變大。所以一個比較好的形式為
x k + 1 = x k ? f ( x k ) f ′ ( x k ) x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)} xk+1?=xk??f′(xk?)f(xk?)?
此即Newton公式。
除了迭代形式,Newton公式也可以作為二分法的一個升級版本, x k ? f ( x k ) f ′ ( x k ) x_k-\frac{f(x_k)}{f'(x_k)} xk??f′(xk?)f(xk?)?可以表示過 ( x k , f ( x k ) ) (x_k,f(x_k)) (xk?,f(xk?))做切線與 x x x軸的交點,通過切線選取新的 x x x值取代了二分法的盲動性,示例如下
from scipy.optimize import newton
newton(func, 0)
# 1.4142135623715149
函數(shù)定義
二分法和牛頓法的參數(shù)定義如下文章來源:http://www.zghlxwxcb.cn/news/detail-433407.html
bisect(f, a, b, args=(), xtol=2e-12, rtol=8.881784197001252e-16, maxiter=100, full_output=False, disp=True)
newton(func, x0, fprime=None, args=(), tol=1.48e-08, maxiter=50, fprime2=None, x1=None, rtol=0.0, full_output=False, disp=True)
其中,f, a, b
以及func, x0
已經(jīng)在演示的時候調用了,分別是求根函數(shù)和初值;args
為待求根函數(shù)中可能包含的其他參數(shù);maxiter
為最大迭代步長。文章來源地址http://www.zghlxwxcb.cn/news/detail-433407.html
到了這里,關于Python調用二分法和牛頓法求方程的根的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!