【发布时间】:2018-07-20 15:53:23
【问题描述】:
错误在于lambdify 函数。由于某种原因,它说语法错误。 这正是它所说的:
文件“D:\Anaconda\lib\site-packages\sympy\utilities\lambdify.py”,第 434 行,在 lambdify func = eval(lstr, namespace) 中。
程序在用户输入容差后立即崩溃。这是一个牛顿法程序(或者至少是我的尝试)。任何有关如何改进此代码的建议也将不胜感激。
我为f 和dfdx 输入的内容如下:
x**3 + 3*x + 5
和
3*x**2 + 3
分别。至于v0和eps,我分别输入1和0.000001。无论我输入什么,程序都会以上述错误终止(假设它使用 x 作为变量,否则它会显示未定义,仅此而已)。
import sympy
import sys
v0 = int(input("Please enter the v0 value: "))
eps = float(input("Please enter the tolerance: "))
f = lambda x : eval('input("Enter the function: ")')
dfdx = lambda x : eval('input("Enter the derivative: ")')
x=sympy.symbols('x')
func = sympy.lambdify(f,x)
deriv = sympy.lambdify(f,x)
def Newton(func, deriv, v0, eps):
f_value = func(v0)
iteration_counter = 0
while abs(f_value) > eps and iteration_counter < 100:
try:
v0 = v0 - float(f_value)/deriv(v0)
except ZeroDivisionError:
print ("Error! - derivative zero for x = ", v0)
sys.exit(1) # Abort with error
f_value = func(v0)
iteration_counter += 1
# Here, either a solution is found, or too many iterations
if abs(f_value) > eps:
iteration_counter = -1
return v0, iteration_counter
Newton(func,deriv,v0,eps)
【问题讨论】:
-
我不认为那些
eval()电话正在做你认为他们正在做的事情。在 REPL 中尝试它们。 -
这里没有minimal reproducible example。我们不知道在响应所有这些输入提示时输入了什么。
-
@Victor Reaver 您可能对正在进行的工作感兴趣,这些工作将允许 SymPy 直接从符号表达式生成牛顿方法的代码:github.com/sympy/sympy/pull/13100/…
标签: python-3.x math sympy newtons-method lambdify