牛顿迭代法

牛顿迭代法解决的是已知f(x)=0,求x的问题。
首先我们需要猜一个解,\(x=x_{0}\)

然后,不停地计算\(x_{0}=x_0-\frac{f(x_0)}{f'(x_0)}\)
直到\(f(x_0)=0\)
这时\(x_{0}\)就是所求的解。
对于多根的方程,最开始猜的值不同,可能会得到不同的解。

例如,我需要解\(a(t)=t^{2}+t=5\)的解,对应的python代码是

def aoft(t):
        return t**2+t
def tofa(a):
            t = a**.5 #猜值
            def func(t):
                return aoft(t)-a
            for i in range(40):
                if(abs(func(t))<1e-6):break
                t = t-func(t)**2/(func(t+func(t))-func(t))
                if(i==39):print("for a: ",a,", the t_a finder does not converge\n") 
            return t
print(tofa(5),tofa(5)**2+tofa(5))

如果想输入一系列的a得到对应的t,可以这样写

def tofan(a):
    def aoft(t):
        return t**2+t
    def tofa(a):
            t = -1 #猜值
            def func(t):
                return aoft(t)-a
            for i in range(40):
                if(abs(func(t))<1e-6):
                    #print("for a: ",a,", the t_a : ",t," finder is convergent")
                    break
                t = t-func(t)**2/(func(t+func(t))-func(t))
                if(i==39):
                    print("for a: ",a,", the t_a: ",t,", finder does not converge!\n") 
            return t
    if(type(a)==np.ndarray):
        tofa = [tofa(an) for an in a]
        return(np.array(tofa))
    else:
        return tofa(a)
a = np.linspace(0,10,1000)
plt.plot(a,tofan(a))

t的猜值大于0和小于0的图不一样,大家可以试试。
例子的函数很简单,我们直接画图比较一下

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-5,4,0.01)
y=np.arange(-1,10,0.01)# 转化为网格
x,y=np.meshgrid(x,y)
z=x**2+x-y
plt.contour(y,x,z,0)
Smilie Vote is loading.
✿ 阅读数:56  分类:其他

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Captcha Code