sympy solveset 无法求解方程组,而 solve 没有问题
sympy solveset fails to solve set of equations, while solve has no problem
按照建议,我尝试使用 sympy.solveset 而不是 sympy.solve 来求解一组两个方程。
from sympy import *
a1, a1dot, pa1, pa1dot, a2, a2dot, pa2, pa2dot, m, l = symbols('a1, a1dot, pa1, pa1dot, a2, a2dot, pa2, pa2dot, m, l')
eq1 = 2*m*l**2*a1dot + m*l**2*a2dot*cos(a1 - a2) - pa1 #equation one
eq2 = m*l**2*a2dot + m*l**2*a1dot*cos(a1 - a2) - pa2 #equation two
使用 solveset([eq1, eq2], (a1dot, a2dot))
给我一个“[eq1, eq1] 不是有效的 SymPy 表达式”错误(eq1, eq2 被扩展为它们在错误消息中代表的完整表达式)。
但是使用 solve([eq1, eq2], (a1dot, a1dot))
工作得很好并且给出了正确的结果。但是,我想遵循 SympPy 文档中给出的建议,改用 solveset。那我错过了什么?
文档应该修复说如果你想用solve
就可以了。
您不能使用 solveset
求解方程组,因为它仅用于求解单个单变量方程。较新的方程组求解器是 linsolve
和 nonlinsolve
。这些中的任何一个都适用于这个系统,但使用 solve
:
也没有错
In [2]: solve([eq1, eq2], [a1dot, a2dot])
Out[2]:
⎧ -pa₁ + pa₂⋅cos(a₁ - a₂) pa₁⋅cos(a₁ - a₂) - 2⋅pa₂ ⎫
⎪a1̇: ───────────────────────────, a2̇: ───────────────────────────⎪
⎨ 2 2 2 2 2 2 ⎬
⎪ l ⋅m⋅cos (a₁ - a₂) - 2⋅l ⋅m l ⋅m⋅cos (a₁ - a₂) - 2⋅l ⋅m⎪
⎩ ⎭
In [3]: linsolve([eq1, eq2], [a1dot, a2dot])
Out[3]:
⎧⎛ -pa₁ + pa₂⋅cos(a₁ - a₂) pa₁⋅cos(a₁ - a₂) - 2⋅pa₂ ⎞⎫
⎪⎜───────────────────────────, ───────────────────────────⎟⎪
⎨⎜ 2 2 2 2 2 2 ⎟⎬
⎪⎝l ⋅m⋅cos (a₁ - a₂) - 2⋅l ⋅m l ⋅m⋅cos (a₁ - a₂) - 2⋅l ⋅m⎠⎪
⎩ ⎭
In [4]: nonlinsolve([eq1, eq2], [a1dot, a2dot])
Out[4]:
⎧⎛-pa₁ + pa₂⋅cos(a₁ - a₂) pa₁⋅cos(a₁ - a₂) - 2⋅pa₂⎞⎫
⎪⎜────────────────────────, ────────────────────────⎟⎪
⎨⎜ 2 ⎛ 2 ⎞ 2 ⎛ 2 ⎞⎟⎬
⎪⎝l ⋅m⋅⎝cos (a₁ - a₂) - 2⎠ l ⋅m⋅⎝cos (a₁ - a₂) - 2⎠⎠⎪
⎩ ⎭
按照建议,我尝试使用 sympy.solveset 而不是 sympy.solve 来求解一组两个方程。
from sympy import *
a1, a1dot, pa1, pa1dot, a2, a2dot, pa2, pa2dot, m, l = symbols('a1, a1dot, pa1, pa1dot, a2, a2dot, pa2, pa2dot, m, l')
eq1 = 2*m*l**2*a1dot + m*l**2*a2dot*cos(a1 - a2) - pa1 #equation one
eq2 = m*l**2*a2dot + m*l**2*a1dot*cos(a1 - a2) - pa2 #equation two
使用 solveset([eq1, eq2], (a1dot, a2dot))
给我一个“[eq1, eq1] 不是有效的 SymPy 表达式”错误(eq1, eq2 被扩展为它们在错误消息中代表的完整表达式)。
但是使用 solve([eq1, eq2], (a1dot, a1dot))
工作得很好并且给出了正确的结果。但是,我想遵循 SympPy 文档中给出的建议,改用 solveset。那我错过了什么?
文档应该修复说如果你想用solve
就可以了。
您不能使用 solveset
求解方程组,因为它仅用于求解单个单变量方程。较新的方程组求解器是 linsolve
和 nonlinsolve
。这些中的任何一个都适用于这个系统,但使用 solve
:
In [2]: solve([eq1, eq2], [a1dot, a2dot])
Out[2]:
⎧ -pa₁ + pa₂⋅cos(a₁ - a₂) pa₁⋅cos(a₁ - a₂) - 2⋅pa₂ ⎫
⎪a1̇: ───────────────────────────, a2̇: ───────────────────────────⎪
⎨ 2 2 2 2 2 2 ⎬
⎪ l ⋅m⋅cos (a₁ - a₂) - 2⋅l ⋅m l ⋅m⋅cos (a₁ - a₂) - 2⋅l ⋅m⎪
⎩ ⎭
In [3]: linsolve([eq1, eq2], [a1dot, a2dot])
Out[3]:
⎧⎛ -pa₁ + pa₂⋅cos(a₁ - a₂) pa₁⋅cos(a₁ - a₂) - 2⋅pa₂ ⎞⎫
⎪⎜───────────────────────────, ───────────────────────────⎟⎪
⎨⎜ 2 2 2 2 2 2 ⎟⎬
⎪⎝l ⋅m⋅cos (a₁ - a₂) - 2⋅l ⋅m l ⋅m⋅cos (a₁ - a₂) - 2⋅l ⋅m⎠⎪
⎩ ⎭
In [4]: nonlinsolve([eq1, eq2], [a1dot, a2dot])
Out[4]:
⎧⎛-pa₁ + pa₂⋅cos(a₁ - a₂) pa₁⋅cos(a₁ - a₂) - 2⋅pa₂⎞⎫
⎪⎜────────────────────────, ────────────────────────⎟⎪
⎨⎜ 2 ⎛ 2 ⎞ 2 ⎛ 2 ⎞⎟⎬
⎪⎝l ⋅m⋅⎝cos (a₁ - a₂) - 2⎠ l ⋅m⋅⎝cos (a₁ - a₂) - 2⎠⎠⎪
⎩ ⎭