使用python的牛顿法

问题描述 投票:0回答:1
p= lambda x: 3 * x**3 - 5.03 * x**2 - 1.95 * x + 0.02

dp = lambda x: 9 * x**2 - 10.06 * x - 1.95
x0 = -1
tol = 10**-4
max_iter = 100

def newton_method(f, df, x0, tol, max_iter=100):
    for i in range(max_iter):
        fx = f(x0)
        dfx = df(x0)
        if df==0 and dfx!=0 :
            raise Exception('division by 0')
        
        elif fx==0:
            return i, x0
        
        x = x0 - fx/dfx
        
        if abs(x-x0) <=tol:
              return i, x0
        x0 = x
    raise ValueError("The newton method doesn't converge after {} iterations".format(max_iter))

c,r = newton_method(p, dp , x0, tol, max_iter)
print("Approssimazione:", r,c)

如果我将起始点设置为 -1 或 0,该函数看起来效果很好,但如果我将一个值设置为接近 5(另一个零约为 5.3),则该函数“收敛”到 2,这远不是一个解决方案。

如果我输入

x_0=2
,那就更奇怪了,因为无论我输入哪个容差,该函数都会执行0次迭代并将2视为解决方案,就像函数在检查绝对值是否小于或等于容差时关闭一样,但是如果我尝试计算
x
处的
i=0
项,结果不小于或等于任何容差,有人可以帮助我理解算法出了什么问题吗?

python numerical-methods newtons-method
1个回答
0
投票

函数 𝑓(𝑥)=3𝑥³−5.03𝑥²−1.95𝑥+0.02 的图形如下所示(由 Wolfram 生成):

根位于:

  • 𝑥 = −1/3
  • 𝑥 = 1/100
  • 𝑥 = 2

运行函数得到的结果符合预期。

值得注意的是,当您从 5 开始时,预计该过程会收敛到 2,这一个解决方案。另一方面,5.3 不是该函数的零点。

© www.soinside.com 2019 - 2024. All rights reserved.