我必须在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。
答案 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=True
和solve
便于强制执行特定形式的输出。
答案 1 :(得分:2)
答案很可能是两个不同的部分。
<强>解析:强>
解析意味着将一些输入转换为可用的输出,在这种情况下输入是一些字符串,输出是一些东西,sympy可以使用。例如,一个简单的解析步骤是通过执行int(your_string)
将字符串转换为整数。在您的情况下,您应该遍历您的字符串并查找变量,单位等,例如通过与字典或字符串列表进行比较。解析任意输入是相当困难的,所以最好的想法是从一小组选项开始,例如:通过与列表x
进行比较,在字符串中搜索y
,z
和variables=['x','y','z']
等典型变量名的出现。
<强>计算强>
解析完成后,只需将所有内容插入到sympy使用的数字运算/求解器中即可。
要了解如果正确完成这样的系统如何工作,您可以查看wolfram alpha。他们做了很好的解析/自然语言处理,并尝试猜测从那里做什么。