SciPy的牛顿函数找不到交点

2024-10-03 17:15:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解为什么下面的代码不返回-1.17,而是返回-6.67e-09。这个数字到底告诉了我什么

如果我将估计值从0改为-1,则确实正确地计算了-1.17。但是,如果我必须对100多个不同的函数执行此操作,我必须为每个函数编写一个while循环,这使得计算过程非常缓慢

这是简单的计算方法,还是我缺少这个案例的特定参数

from scipy.optimize import newton


def f(x):
    return x**2-3


def g(x):
    return x**3

def insection():
    def difference(x):
        return g(x) - f(x)
    insection_point_value = newton(difference, 0)

    return insection_point_value 

print(insection())
Returns: -6.665555511432543e-09
Has to be: -1.1745594102929802

Plot


Tags: 函数代码returnvalue过程def估计值数字
3条回答

Newton-Raphson方法是找到实值函数根的良好近似值的一种方法(在您的例子中:f(x) =x**3 - x**2 + 3)。这是一个迭代算法,严重依赖于起点(x0,我的意思是)

因此,我建议使用多个起点,然后获得最常见的根。这段代码解释了我的意思:

>>> from scipy.optimize import newton
>>> from collections import Counter


>>> # using [-10, -9, -8, ..., 8, 9, 10] as starting point(s)
>>> roots = newton(lambda x: x**3 - x**2 +3, range(-11, 11))

>>> # find the most common root
>>> root, count = Counter(roots).most_common(1)[0]
>>> root
-1.17455941029298
>>> count
17

这意味着在22个起点中,有17个收敛到-1.17

牛顿-拉斐逊法(NR)对您提供的初始值非常敏感

检查差分函数的图形: graph
函数在x = 0处的导数是0NR作为一种迭代方法,无法使用零导数从初始点x0 = 0开始。这就是为什么,它继续停留在那里,而不是向预定的点收敛。试试x0 = -0.1它就行了,或者其他比这更有效的方法。
任何x > 0都将继续失败,因为x = 0.667处还有另一个零导数,迭代方法将滑入山谷,使用外行语言

您得到的奇怪的十进制值(而不是0)是浮点数学的产物、函数的离散化值或两者的组合

您可以提供函数导数:fprime-请参见docs。这将使搜索更加稳定

相关问题 更多 >