我希望能够解析字符串方程(等于0),然后使用我有权访问的变量字典来解决它们.
例如:
s = '(x/z)-y'
eq = parse(s)
eq.solve({'x': 10, 'y': 5})
print(eq)
>>> {'z': 2}
Run Code Online (Sandbox Code Playgroud)
现在我编写的代码在一个月前做了类似的事情,但我找不到它.我确实记得我使用了SymPy及其症状功能,以及它的求解功能.我已经查看了这些函数的文档,但是我无法解决如何让它们按照我的意愿工作.
还有一个额外的问题:是否有可能以某种方式包装变量,以便我可以使用更多的东西而不仅仅是一个字母?示例:而不仅仅是'x'我可以拥有'{myvar-42}'
编辑:
好吧,我终于成功编写了一些符合我想要的代码:
eq = sympify('(x/y)-z', locals={'x': 10, 'z': 5})
solution = solve(eq, dict=True)
print(solution)
>>> [{'z': 2}]
Run Code Online (Sandbox Code Playgroud)
但我的"额外"问题仍然存在.
正如您所发现的,sympify将字符串转换为SymPy表达式.
要回答您的其他问题,符号名称可以是任何内容,但sympify只会将有效的Python标识符解析为符号名称.但你可以做到
>>> Symbol('{myvar-42}') + 1
{myvar-42} + 1
Run Code Online (Sandbox Code Playgroud)
请注意,有效的Python标识符不必是单个字母.它们可以是字母,数字和下划线的任意组合,不以数字开头,如x_2或abc123.
如果你仍然需要进行字符串解析但是想要将无效的Python标识符作为符号名称,那么最简单的方法可能是使用普通名称并将其替换为其他名称,例如
>>> expr = sympify('x + 1')
>>> expr.subs(Symbol('x'), Symbol('{myvar-42}')
{myvar-42} + 1
Run Code Online (Sandbox Code Playgroud)
最后,要用符号替换符号,您可以像使用的locals那样使用参数来表示同意,或者,如果您想稍后替换它们,请使用subs:
>>> x, y, z = symbols('x y z')
>>> expr = sympify('x/z - y')
>>> expr.subs({x: 10, y: 5})
10/z - 5
Run Code Online (Sandbox Code Playgroud)