根据实值参数对Sympify字符串表达式进行处理

时间:2015-09-25 12:56:25

标签: python sympy

我希望以下代码评估sin(t)

的衍生产品
import sympy as sy

t = sy.Symbol('t', real=True)
expr = sy.sympify('sin(t)')
dexpr = sy.diff(expr, t)
print dexpr

但实际上它会打印0。如果我按t = sy.Symbol('t')更改第一行,则效果很好。看起来同情心认为有2种不同的t

问题:如何说,我的字符串表达式取决于真正有价值的参数t,以及如何正确地理解这个字符串?

1 个答案:

答案 0 :(得分:0)

如果您将 t 声明为实数变量,它将被视为与符号(' t')不同的变量(没有假设)

尝试这种方式:

In [1]: treal = Symbol('t', real=True)

In [2]: t = Symbol('t')

In [3]: expr = sympify('sin(t)')

In [4]: expr.diff(treal)
Out[4]: 0

In [5]: expr.diff(t)
Out[5]: cos(t)

In [6]: treal == t
Out[6]: False

In [7]: expr_real = expr.subs(t, treal)

In [8]: expr_real.diff(treal)
Out[8]: cos(t)

在输入[6]中,您可能会看到两个变量被认为是不同的,即使两个变量都打印为 t 。如果用实际变量区分你的同义表达式(输入[4]),你的表达式将被视为常量,因为两个 t 不能识别为同一个变量。

在输入[7]中,我用 treal 替换了 t ,因此在输入[8]中我能够正确地导出表达式。

修改

要导入的快速表单是在 sympify 中指定字符串变量和局部变量之间的映射:

In [1]: t = Symbol('t', real=True)

In [2]: expr = sympify('sin(t)', locals={'t': t})

In [3]: expr
Out[3]: sin(t)

In [4]: expr.diff(t)
Out[4]: cos(t)

这样, t 将被设置为输入[1]中定义的变量。