用户定义函数的牛顿方法

时间:2017-01-22 20:50:24

标签: python newtons-method

我试图使用牛顿方法找到方程的根。这可能是一个非常明显的错误,但我不断收到一条错误,指出:“TypeError:无法确定Relational的真值”。有没有我忘记导入/包含的东西?对不起,我是python的新手。

import sympy

from sympy import *
x, y, z = symbols('x y z')
init_printing(use_unicode=True)

def newton(f, n, eps):
    y = f(n)
    delta = diff(eps, x)
    while abs(y) > eps:
        dy = (f(n + delta) - y) / delta
        n = n - y/dy
        y = f(n)
    return n

def f(n):
    return 5 * n + 10

eps = input("input function:")

print(newton(f, 0, eps))

2 个答案:

答案 0 :(得分:1)

您的代码未实现Newton的方法。你想在初始猜测时估计切线,用y = 0截取它以得到一个新的猜测,并继续这样做,直到猜测值的函数足够接近0.见下面的代码。

Welcome

通过文本提供的用户提供的功能并不容易。我们通常做的是提供上述功能的数值实现。

如果你想在符号级别上操作,你需要解析字符串并在你的代码中构造一个合适的函数,这实际上并不是微不足道的。您可能想要检查库是否可用。

实际上,如果有人在没有root的函数上运行迭代,你可能希望实现最大迭代次数。

答案 1 :(得分:1)

总结:用户定义的函数可以用SymPy表示,它的导数几乎可以自动获得,目标函数及其导数的数值函数可以由lambdify检索。通过使用lambdify ed Python函数,您无法通过符号评估来交换效率。此外,我们可以使用包含牛顿方法的SciPy优化包。

scipy.optimize.minimize提供牛顿法。您可以使用您的目标函数及其衍生物来提供它并获得结果。

在原始代码中使用符号数学对我来说没有意义,因为它涉及特定的数学公式。使用NumPy可以获得更好的执行性能。

如果您正在考虑为各种数学公式提供通用数学界面,SymPy非常棒,因为我们可以享受其衍生功能。

几个月前,我使用SymPy和SciPy优化的组合来做一个弹簧连接体的物理模型。

https://github.com/wakita/symdoc/blob/master/kk.ipynb

  • 目标函数的公式在In [9]中给出。
  • 在In [10]中获得与目标函数对应的Python函数。
  • 目标函数的导数在In [14]中获得。
  • 基于牛顿的最小化在In [19]中进行。它利用了目标函数的一阶和二阶导数。

使用SymPy的美妙之处在于,正如您在我的示例中所看到的,我根本不会混淆衍生物的复杂计算,另一方面,该解决方案处理在SymPy中表达的任何公式。