Python 用SymPy对方程进行一般解析和求解

Python 用SymPy对方程进行一般解析和求解,python,sympy,Python,Sympy,我希望能够解析字符串方程(等于0),然后使用我可以访问的变量字典来解决它们 例如: s = '(x/z)-y' eq = parse(s) eq.solve({'x': 10, 'y': 5}) print(eq) >>> {'z': 2} 现在我在一个月前写了这样的代码,但我就是找不到。但我确实记得我使用了SymPy及其sympify函数和solve函数。我已经查阅了这些函数的文档,但是我还没有弄清楚如何让它们按我所希望的那样工作 还有一个问题: 有没有可能以某种方式包装这

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

例如:

s = '(x/z)-y'
eq = parse(s)
eq.solve({'x': 10, 'y': 5})
print(eq)
>>> {'z': 2}
现在我在一个月前写了这样的代码,但我就是找不到。但我确实记得我使用了SymPy及其sympify函数和solve函数。我已经查阅了这些函数的文档,但是我还没有弄清楚如何让它们按我所希望的那样工作

还有一个问题: 有没有可能以某种方式包装这些变量,这样我就可以使用一些不仅仅是一个字母的东西? 示例:我可以使用“{myvar-42}”,而不只是“x”

编辑:

好吧,我终于成功地编写了一些代码,实现了我想要的:

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

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

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

为了回答您的另一个问题,符号名可以是任何东西,但是
sympify
只会将有效的Python标识符解析为符号名。但你能做到

>>> Symbol('{myvar-42}') + 1
{myvar-42} + 1
请注意,有效的Python标识符不必是单个字母。它们可以是不以数字开头的字母、数字和下划线的任意组合,如
x_2
abc123

如果您仍然需要进行字符串解析,但希望使用无效的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

'myvar-42'
-只需解析字符串。@alKid如何?如果我在一个包含括号的字符串上使用sympify,它会给我错误(因为它认为它是一本字典或其他东西)。不过我想出了一个解决方案:我可以用正则表达式替换所有{*}并用字母替换它们,然后在求解完成后,我可以使用替换时创建的词典将它们放回原处。我相信它会捕获名称错误,并用定义为符号的未定义名称重新运行表达式。