我试图使用牛顿方法找到方程的根。这可能是一个非常明显的错误,但我不断收到一条错误,指出:“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))
答案 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
使用SymPy的美妙之处在于,正如您在我的示例中所看到的,我根本不会混淆衍生物的复杂计算,另一方面,该解决方案处理在SymPy中表达的任何公式。