用 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']
.
进行比较,在字符串中搜索出现的典型变量名称,例如 x
、y
和 z
计算
一旦解析干净,只需将所有内容插入 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=True
和 dict=True
便于强制执行特定形式的输出。
我必须求解 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']
.
x
、y
和 z
计算
一旦解析干净,只需将所有内容插入 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=True
和 dict=True
便于强制执行特定形式的输出。