2014-01-12 41 views
6

我想能够解析字符串方程(等于0),然后通过使用我有权访问的变量字典来解决它们。使用SymPy来一般地解析和求解方程

例如:

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

现在我写的代码,一个月前做了这样的事情,但我无法找到它。不过我记得我使用了SymPy及其sympify函数,以及它的求解函数。我已经检查过关于这些功能的文档,但是我一直无法围绕如何让他们按照我的意愿工作。

还有一个额外的问题: 是否有可能以某种方式包装变量,以便我可以使用更多的东西而不仅仅是一封信给他们? 实例:不 '{MYVAR-42}' 的是 'x' 我能有

编辑:

好吧,我终于成功地写一些代码,做了什么,我想:

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

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

+0

''MYVAR-42'' - 只是解析字符串。 – aIKid

+0

@alKid如何?如果我在包含括号的字符串上使用sympify,它会给我错误(因为它认为它是字典或其他东西)。我想出了一个解决方案:我可以用正则表达式代替所有{*}并用字母替换它们,然后在解决完成后,我可以使用替换时创建的字典将它们放回去。 – fgblomqvist

回答

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参数sympify,因为你所做的一切,或者,如果你想以后取代它们,使用潜艇:

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

这正是我一直在寻找的,谢谢! – fgblomqvist

+0

这是如何与auto_symbol一起使用的? – denfromufa

+0

我相信它会捕获NameErrors,并将未定义名称定义为符号的表达式重新运行。 – asmeurer