使用sympy评估具有数值表达式的字符串?

4

我编写了一个函数来评估拉格朗日插值多项式的数字表达式:

#!/usr/bin/env python
#coding: utf8 
from sympy import *
import json


def polinomioLagrange(Xs, Ys, t):

    x = Symbol('x')
    expresion = ''
    for k in range(len(Xs)):

        if k >0: #Si no es el primero ni el último término de la sumatoria
            expresion = expresion + '+' + str(Ys[k]) + '*'
        elif k==0:
            expresion = expresion + str(Ys[k]) + '*'

        expresion = expresion + '('

        for i in range(len(Xs)):
            if k==i:
                continue # Si i==k saltamos esta iteración para eliminar división sobre cero

            expresion = expresion + '(' + '3' + '-' + str(Xs[i]) + ')'

            if k != len(Xs)-1 and i!= len(Xs)-1:
                expresion=expresion+'*'

            #expresion = expresion + '(' + str(a) + '-' + str(Xs[i]) +' )' + '/' + '(' + str(Xs[k]) + '-' + str(Xs[i]) + ')'

        expresion = expresion + '/'

        for i in range(len(Xs)):
            if k==i:
                continue # Si i==k saltamos esta iteración para eliminar división sobre cero        
            expresion = expresion + '(' + str(Xs[k]) + '-' + str(Xs[i]) + ')'

            if i != len(Xs)-1 and k != len(Xs)-1:
                expresion=expresion+'*'             
            print expresion
            print k, i
            ewa = raw_input('Prompt :')
        expresion = expresion + ')'

    print expresion

当我使用 lagrange([0,1,2,4],[-1,0,7,63],3) 调用该函数时,输出如下:
7*((3-1)*(3-2)*(3-4)/(0-1)*(0-2)*(0-4))+0*((3-0)*(3-2)*(3-4)/(1-0)*(1-2)*(1-4))+-1*((3-0)*(3-1)*(3-4)/(2-0)*(2-1)*(2-4))+63*((3-0)(3-1)(3-2)/(4-0)(4-1)(4-2))

实际上这没什么问题,但是当我尝试使用sympify(expresion)时,会出现错误输出:

  code, global_dict, local_dict)  # take local objects in preference
  File "<string>", line 1, in <module>
TypeError: 'NegativeOne' object is not callable

我理解这可能是由于字符串中有一个-1的原因,但是...我怎样才能简单地得到表达式的计算结果呢?


构建字符串存在问题是什么意思? - diegoaguilar
SymPy 不太擅长将字符串转为符号表达式。例如,它无法将通用的 LaTeX 数学表达式转为符号表达式。您确定需要它吗?如果您留下最少量的可复现代码,那么对于其他人来说帮助会更加简单。 - Adobe
只是字符串必须以正确的格式呈现。它无法读取LaTEX,这是一个缺点。不过我认为它可以输出LaTEX? - diegoaguilar
是的,LaTeX 输出有效。 - Adobe
1个回答

1

这一切都与表达式(目前为string)的正确格式有关:

我的算法不正确

因此得到了:

7*((3-1)*(3-2)*(3-4)/(0-1)*(0-2)*(0-4))+0*((3-0)*(3-2)*(3-4)/(1-0)*(1-2)*(1-4))+-1*((3-0)*(3-1)*(3-4)/(2-0)*(2-1)*(2-4))+63*((3-0)(3-1)(3-2)/(4-0)(4-1)(4-2))

上个学期有一些缺失的*

如果我这样做:

from sympy import *

expression = '7*((3-1)*(3-2)*(3-4)/(0-1)*(0-2)*(0-4))+0*((3-0)*(3-2)*(3-4)/(1-0)*(1-2)*(1-4))+-1*((3-0)*(3-1)*(3-4)/(2-0)*(2-1)*(2-4))+63*((3-0)*(3-1)*(3-2)/(4-0)*(4-1)*(4-2))'
y = S(expression)
siympify(y)

那将简单地运作,我将得到我想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接