牛頓法是求解最優問題的一種常用方法。
本文主要在實現使用牛頓法進行開平方操作,**使用python實現。在開平方求解中,更多的可以參考這篇文章。牛頓法是一種最優化求解方法,在迭代過程中求取到最接近解的值,類似的還有梯度下降等等。
這裡主要講解我對該方法的推導,有錯誤之處麻煩指出。
首先針對開根號求解,可用以下式子描述:
x =n
x=\sqrt
x=n
將該式換成:
x 2=
nx^=n
x2=n
移項得x2−
n=0x^ - n = 0
x2−n=0
要求出n的開跟結果,其實就是求出該式的解,對於該式,可以描述為:
x 2−
n=yx^ - n = y
x2−n=y
也就是求出該拋物線與x軸的交點,因為實數範圍內求出的開根號結果大於0,因此只需要計算大於零的一邊。對於該式的求解,牛頓法的迭代速度較快。
圖中,首先給定初始的值,這個值可以隨便給,圖中選的是x=4,如紅色豎線所示。牛頓法的精髓就在於,給定初始值之後,能夠快速下降到目標解。在x=4這一點,獲取該點的切線,如圖紫色斜線所示。求出該點切線與x軸交點即為下次迭代的x值,最後迭代多次之後,如果在誤差範圍內,輸出結果。
令給定乙個初始值x1x_
x1。
在式中:
x 2−
n=yx^ - n = y
x2−n=y
其對應的點為(x1
,x12
−n)(x_,x_^ - n)
(x1,x
12−
n),該點對應的斜率為 2x1,斜率公式為:
2 x=
y2x = y
2x=y
斜率公式可通過對x求導得出。將點和斜率帶入斜線公式:
a x+
b=yax+b=y
ax+b=y
求得下乙個迭代的點為:
x 2=
−ba=
n2x1
+x12
x_=\frac=\frac}+\frac}
x2=a−
b=2
x1n
+2x
1迭代多次,知道求出xn−
xn−1
<
δx_-x_
xn−xn−1
\delta
δ為自定的誤差範圍。
**如下:
def squareroot(n):
tx = 100
lstx = tx
for i in range(10):
tx = (n / tx / 2 + tx / 2)
if (abs(tx - lstx) < 0.0000001):
break
lstx = tx
return tx
測試了本方法與系統自帶方法運算效率:
可能是因為python的原因,結果雖然正確,但是時間上時系統自帶方法的兩倍。但是就算如此,該方法也比二分法好。
github link:
利用牛頓迭代法求解開平方
牛頓迭代法是用來求函式零點的一種方法,求得的結果為數值解,速度較快。如圖所示,從 x n 開始迭代,過 x n,f x n 點作曲線 f x 的切線 圖中的紅色虛線 該切線的方程為 y f x n f x n x x n 令y等於0,此時x的值即為 x 的值 0 f x n f x n x x n ...
基於 8086 組合語言 減奇數法開平方
用減奇數法,可以求近似平方根。那位大俠能給個匯程式設計序啊,感激不盡!最佳答案 程式如下 data segment num dw 12345 被開方數 0 65535 mes i db srqt is 用於提示.data ends code segment assume cs code,ds dat...
C C 二分法實現開平方
1.數學原理 求乙個數c的平方等價於求方程 x2 cx c x2 c 的解,方程解的問題可以轉換為函式零點問題。即求函式 f x x2 c f x x c f x x 2 c的零點。零點定理 若f a f b 0則 m in a,b 有f m 0 由零點定理可知,只需估計a,b的值,令m a b 2...