使用SymPy来泛化解析和求解方程式

时间:2014-01-12 15:00:13

标签: python sympy

我希望能够解析字符串方程式(等于0),然后使用我有权访问的变量字典来解决它们。

例如:

s = '(x/z)-y'
eq = parse(s)
eq.solve({'x': 10, 'y': 5})
print(eq)
>>> {'z': 2}

现在我编写的代码在一个月前做了类似的事情,但我找不到它。我确实记得我使用了SymPy及其症状功能,以及它的求解功能。我已经检查过这些功能的文档,但是我无法解决如何让它们按照我的意愿工作。

还有一个问题: 是否有可能以某种方式包装变量,以便我可以使用更多的东西而不仅仅是一个字母? 示例:而不仅仅是'x'我可以拥有'{myvar-42}'

编辑:

好吧,我终于成功编写了一些符合我想要的代码:

eq = sympify('(x/y)-z', locals={'x': 10, 'z': 5})
solution = solve(eq, dict=True)
print(solution)
>>> [{'z': 2}]

但我的“额外”问题仍然存在。

1 个答案:

答案 0 :(得分:5)

正如您所发现的,sympify将字符串转换为SymPy表达式。

要回答您的其他问题,符号名称可以是任何内容,但sympify只会将有效的Python标识符解析为符号名称。但你可以做到

>>> Symbol('{myvar-42}') + 1
{myvar-42} + 1

请注意,有效的Python标识符不必是单个字母。它们可以是不以数字开头的字母,数字和下划线的任意组合,例如x_2abc123

如果你仍然需要进行字符串解析但希望将非有效的Python标识符作为符号名称,那么最简单的方法可能是使用普通名称并将其替换为其他名称,例如

>>> expr = sympify('x + 1')
>>> expr.subs(Symbol('x'), Symbol('{myvar-42}')
{myvar-42} + 1

最后,要用符号替换符号,您可以使用locals参数来表达您的意见,或者,如果您想稍后替换它们,请使用subs:

>>> x, y, z = symbols('x y z')
>>> expr = sympify('x/z - y')
>>> expr.subs({x: 10, y: 5})
10/z - 5