求解具有三角函数的非线性方程组
Solve a system of nonlinear equations with trigonometric functions
我有以下等式:
q1dd,b1,q2,q3,v1,q2dd,a1,a2,b2 = symbols('\ddot{q}_1 b1 q2 q3 v1 \ddot{q}_2 a1 a2 b2')
eq1 = -q1dd+b1*cos(q2)*sin(q3)*v1
eq2 = -q2dd+a1*sin(q2)+a2*cos(q2) + b2*cos(q3)*v1
display(eq1)
display(eq2)
根据 sympy 规则,它们是 -lhs+rhs=0。因此,两个方程都等于零。
我想解决 sympy
中的集合
sol1 = nonlinsolve([eq1,eq2],[v1,q3])
sol2 = solve([eq1,eq2],[v1,q3])
然而,结果超级复杂。 trigsimp
和 simplify
也不会更改解决方案。
我可以手动除以 eq1/eq2 = 0 并求解 tan(q3) 并求解 v1 的 eq1。这是一个非常简短的解决方案。
我的问题是:我做错了什么(其他求解器、参数化形式、处理等),还是 sympy 还没有准备好优雅地解决这些问题?
你的做法没有错。 SymPy 或其他程序不会取代具有一些数学知识的人。在这种情况下,非线性求解器错过了将 sin(q3)/cos(q3) 简化为 tan(q3) 的机会,从而将 q3 的出现次数减少为一次。如果他们被迫遵循特定策略 - 例如,"solve for v1 from the first, sub into the second, simplify and solve for q3" - 解决方案就不会大惊小怪。
v1sol = solve(eq1, v1)[0]
q3sol = solve(simplify(eq2.subs(v1, v1sol)), q3)[0]
print([v1sol, q3sol])
这输出
[\ddot{q}_1/(b1*sin(q3)*cos(q2)), -atan(\ddot{q}_1*b2/(b1*(-\ddot{q}_2 + a1*sin(q2) + a2*cos(q2))*cos(q2)))]
我有以下等式:
q1dd,b1,q2,q3,v1,q2dd,a1,a2,b2 = symbols('\ddot{q}_1 b1 q2 q3 v1 \ddot{q}_2 a1 a2 b2')
eq1 = -q1dd+b1*cos(q2)*sin(q3)*v1
eq2 = -q2dd+a1*sin(q2)+a2*cos(q2) + b2*cos(q3)*v1
display(eq1)
display(eq2)
根据 sympy 规则,它们是 -lhs+rhs=0。因此,两个方程都等于零。 我想解决 sympy
中的集合sol1 = nonlinsolve([eq1,eq2],[v1,q3])
sol2 = solve([eq1,eq2],[v1,q3])
然而,结果超级复杂。 trigsimp
和 simplify
也不会更改解决方案。
我可以手动除以 eq1/eq2 = 0 并求解 tan(q3) 并求解 v1 的 eq1。这是一个非常简短的解决方案。
我的问题是:我做错了什么(其他求解器、参数化形式、处理等),还是 sympy 还没有准备好优雅地解决这些问题?
你的做法没有错。 SymPy 或其他程序不会取代具有一些数学知识的人。在这种情况下,非线性求解器错过了将 sin(q3)/cos(q3) 简化为 tan(q3) 的机会,从而将 q3 的出现次数减少为一次。如果他们被迫遵循特定策略 - 例如,"solve for v1 from the first, sub into the second, simplify and solve for q3" - 解决方案就不会大惊小怪。
v1sol = solve(eq1, v1)[0]
q3sol = solve(simplify(eq2.subs(v1, v1sol)), q3)[0]
print([v1sol, q3sol])
这输出
[\ddot{q}_1/(b1*sin(q3)*cos(q2)), -atan(\ddot{q}_1*b2/(b1*(-\ddot{q}_2 + a1*sin(q2) + a2*cos(q2))*cos(q2)))]