0

错误在于lambdify 函数。由于某种原因,它说语法错误。这就是确切地说:

文件“D:\Anaconda\lib\site-packages\sympy\utilities\lambdify.py”,第 434 行,在 lambdify func = eval(lstr, namespace) 中。

程序在用户输入容差后立即崩溃。这是一个牛顿法程序(或者至少是我的尝试)。任何有关如何改进此代码的建议也将不胜感激。

我输入fdfdx内容如下:

x**3 + 3*x + 5 

3*x**2 + 3 

分别。至于v0and eps,我分别输入1and 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)
4

1 回答 1

1

AFAIU 你的狡猾计划是首先使用 Python 解释器从用户的字符串(使用input)构建一个函数,然后使用 SymPy 从中构建一个可重用的函数。您的代码存在一些问题,最重要的可能是您错误地获取了 SymPy 方法的签名。

提供dfdx作为输入的想法对我来说也不好看。如果原始函数f具有可以计算的良好导数,SymPy 可能可以自行计算。

所以如果你修复了一些明显的错误,你可能会得到这样的代码:

Python 3.x

import sympy
import sys

v0 = int(input("Please enter the v0 value: "))
eps = float(input("Please enter the tolerance: "))
f_inp = lambda x: eval(input("Enter the function: "))
x = sympy.symbols('x')
f_symb = f_inp(x)
func = sympy.lambdify(x, f_symb)
deriv = sympy.lambdify(x, sympy.diff(f_symb, 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

print (Newton(func, deriv, v0, eps))

Python 2.x

import sympy
import sys

v0 = int(input("Please enter the v0 value: "))
eps = float(input("Please enter the tolerance: "))
f_inp = lambda x: input("Enter the function: ")
x = sympy.symbols('x')
f_symb = f_inp(x)
func = sympy.lambdify(x, f_symb)
deriv = sympy.lambdify(x, sympy.diff(f_symb, 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

print Newton(func, deriv, v0, eps)

哪个供您输入

1
0.000001
x**3 + 3*x + 5 

产生以下输出:

(-1.154171557329764, 5)

2.x 和 3.x 版本之间的主要区别在于,input在 2.x 中调用eval内部,而input在 3.x中没有。

于 2018-02-09T23:48:17.110 回答