如何让sympy.sympify使用预定义符号?

时间:2018-10-17 08:21:53

标签: python sympy

很容易理解

from sympy import *

x = symbols('x', real=True)

y = sin(x)
dy = y.diff(x)
ddy = y.diff(x, 2)

print(y.subs(x, pi/2), dy.subs(x, pi/2), ddy.subs(x, pi/2), )

将输出1 0 -1

例如,现在是否y的表达式不是预定义的,而是需要用户输入的

y = input('please input expression about x: ')
y = sympify(y)
dy = y.diff(x)
ddy = y.diff(x, 2)

但是如果用户再次输入sin(x)

print(y.subs(x, pi/2), dy.subs(x, pi/2), ddy.subs(x, pi/2), )

sin(x) 0 0

print(y.subs('x', pi/2), dy.subs('x', pi/2), ddy.subs('x', pi/2), )

1 0 0

因此sympify不像x那样将sympy.sin(x)视为符号。那么我们该如何解决呢?谢谢

1 个答案:

答案 0 :(得分:1)

这就是为什么在sympify中有一个参数locals的原因:

y = sympify(y, locals={'x': x})

如果您的x没有假设real=True,则没有必要。如果符号具有相同的属性(名称和假设),则认为它们相同。从字符串sin(x)获得的符号不假设它是真实的。所以  名称与您的x匹配,但假设不匹配。

另一种方法是不将用户限制为变量名x;只需使用他们使用的任何符号即可。

y = sympify(y)
x = next(iter(y.free_symbols))  # get the first (and hopefully only) symbol in the formula
dy = y.diff(x)
# and so on