我希望能够解析字符串方程(等于 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
参数来进行 sympify,正如您所做的那样,或者,如果您以后想替换它们,请使用 subs:
>>> x, y, z = symbols('x y z')
>>> expr = sympify('x/z - y')
>>> expr.subs({x: 10, y: 5})
10/z - 5
关于python - 使用 SymPy 一般解析和求解方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21076132/