簡述
以前也是用過這個東西的,但是一直都不是很清楚原理。
後來了解了牛頓法了之後,發現這個東西,就是牛頓法的一個簡單的應用而已。
代碼
target: 就是目标數
x T + 1 = x T − f ( x T ) f ′ ( x T ) x_{T+1} = x_{T} - \frac{f(x_T)}{f'(x_T)} xT+1=xT−f′(xT)f(xT)
若收斂,則
x ∗ = x ∗ − f ( x ∗ ) f ′ ( x ∗ ) x_{*} = x_{*} - \frac{f(x_*)}{f'(x_*)} x∗=x∗−f′(x∗)f(x∗)
即,隻有當 f ( x ∗ ) f(x_*) f(x∗)為0即可。
是以,求根号時,選擇的方程為
f ( x ) = x 2 − N f(x) = x^2 - N f(x)=x2−N
用牛頓法就可以計算出根号N
from sympy import *
x = symbols("x")
target = 10
func = x ** 2 - target
ffunc = diff(func, x)
MAXSTEP = 100
step_count = 0
x0 = target / 2
temp = func.subs(x, x0)
while step_count < MAXSTEP and abs(temp) > 1e-10:
x0 = x0 - (temp / (ffunc.subs(x, x0)))
temp = func.subs(x, x0)
step_count += 1
print(x0)
print(step_count)