使用Python解决方程(字符串)到每个符号

时间:2018-04-26 12:37:44

标签: python sympy equation

我必须在python中解决一个方程式,我得到它作为字符串输入。我不知道等式中有多少符号或它们的签名是什么。典型的符号可以是" mm"," cm"," x"或类似的东西。该函数应该用求解的方程返回某种数组/ json。

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

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

我尝试使用SymPy-Module,但我找不到像上面那样输入动态字符串的方法。 SymPy似乎只接受"硬编码"符号。

注意:字符串来自" sys.argv" -Parameter。

2 个答案:

答案 0 :(得分:4)

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] 

返回[[{y: x + 3}], [{x: y - 3}]]。该列表是嵌套的,因为每个符号都可以显示多个解决方案。如有必要,展平嵌套列表。

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

答案 1 :(得分:2)

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

<强>解析:

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

<强>计算

解析完成后,只需将所有内容插入到sympy使用的数字运算/求解器中即可。

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