天天看点

牛顿法求根号数(Python)

简述

以前也是用过这个东西的,但是一直都不是很清楚原理。

后来理解了牛顿法了之后,发现这个东西,就是牛顿法的一个简单的应用而已。

代码

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)