用 Python 求解每个符号的方程式(字符串)

Solve Equation (String) with Python to every Symbol

我必须求解 python 中的方程式,我将其作为字符串输入获得。我不知道等式中有多少个符号,也不知道它们的签名是什么。典型的 Symbol 可以是 "mm"、"cm"、"x" 或类似的东西。该函数应该 return 某种 array/json 与求解的方程。

小例子它应该是什么样子:

solve("x/2=4")
>> ["x=8"]
>>
solve("x + 2 = y - 1")
>> ["x=y-3", "y=x+3"]

我尝试为此使用 SymPy-Module,但我没有找到像上面那样输入动态字符串的方法。 SymPy 似乎只接受 "hardcoded" 符号。

注意:字符串来自 "sys.argv" 参数。

答案很可能是两个不同的部分。

正在解析:

解析意味着将一些输入转换为可用的输出,在您的情况下,输入是一些字符串,输出是 sympy 可以使用的东西。例如,一个简单的解析步骤是通过 int(your_string) 将字符串转换为整数。在您的情况下,您应该遍历字符串并查找变量、单位等,例如通过与字典或字符串列表进行比较。解析任意输入非常困难,所以最好的办法是从一小组选项开始,例如通过与列表 variables=['x','y','z'].

进行比较,在字符串中搜索出现的典型变量名称,例如 xyz

计算

一旦解析干净,只需将所有内容插入 sympy 使用的数字运算/求解器。

要了解如果正确完成这样的系统如何工作,您可以查看 wolfram alpha。他们做了很好的解析/自然语言处理,并尝试从那里猜测要做什么。

SymPy 可以用 sympify 解析字符串,但它的方程格式是 Eq(x/2, 4) 而不是 x/2 = 4。因此需要进行一些预处理:用 Eq( ) 将字符串括起来,并用逗号替换“=”。

eq = "x/2=4"
sympy_eq = sympify("Eq(" + eq.replace("=", ",") + ")")
solve(sympy_eq)   # [8]

eq = "x + 2 = y - 1"
sympy_eq = sympify("Eq(" + eq.replace("=", ",") + ")")
solve(sympy_eq)   # [{x: y - 3}]

在后一种情况下,SymPy 选择了一个变量来求解。要选择它应该是哪一个,您可以提供一个符号:

solve(sympy_eq, Symbol('y'))   # [x + 3]

或者,求解每个符号:

[solve(sympy_eq, sym, dict=True) for sym in sympy_eq.free_symbols] 

returns[[{y: x + 3}], [{x: y - 3}]]。该列表是嵌套的,因为每个符号可能出现多个解决方案。如有必要,展平嵌套列表。

solve 的选项 list=Truedict=True 便于强制执行特定形式的输出。