简述
以前也是用过这个东西的,但是一直都不是很清楚原理。
后来理解了牛顿法了之后,发现这个东西,就是牛顿法的一个简单的应用而已。
代码
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)