您偶然发现了nonlinsolve
. 它应该作为一个问题报告给 sympy:
https ://github.com/sympy/sympy/issues
另一个答案显示了一种解决方法。我将展示另一个基于使用 Groebner 的基础。为此,您需要先将sin/cos
变成tan
,以便方程都是多项式的:
In [49]: eqM2 = (eqM/cos(teta)).subs(sin(teta), tan(teta)*cos(teta)).cancel()
In [50]: eqM2
Out[50]: -H⋅P⋅tan(teta) + P₁⋅d - P₂⋅d
In [51]: eqs = (eqM2,eqV,crot,cvert,soil1,soil2)
In [52]: syms = [d1,d2,P1,P2,tan(teta),delta]
In [53]: groebner(eqs, syms)
Out[53]:
⎛⎡ 2 2 2 2 2 2 2 2
⎜⎢ - H⋅P - 2⋅P⋅d ⋅k₂ - H⋅P - 2⋅P⋅d ⋅k₁ H⋅P ⋅k₁ + 2⋅P⋅d ⋅k₁⋅k₂ H⋅P ⋅k₂ + 2⋅P⋅d ⋅k₁⋅k₂
GroebnerBasis⎜⎢d₁ + ────────────────────────────, d₂ + ────────────────────────────, P₁ + ────────────────────────────, P₂ + ────────────────────────────, ─
⎜⎢ 2 2 2 2
⎝⎣ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H
2 2 2 ⎤ ⎞
P⋅d⋅k₁ - P⋅d⋅k₂ - H⋅P - P⋅d ⋅k₁ - P⋅d ⋅k₂ ⎥ ⎟
─────────────────────────── + tan(teta), δ + ────────────────────────────⎥, d₁, d₂, P₁, P₂, tan(teta), δ, domain=ℤ(d, k₁, k₂, H, P), order=lex⎟
2 2 ⎥ ⎟
⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂⎦ ⎠
In [54]: solve(groebner(eqs, syms), syms)
Out[54]:
⎧ 2 2 2 2 2 2 2 2 2 2
⎪ - H⋅P ⋅k₁ - 2⋅P⋅d ⋅k₁⋅k₂ - H⋅P ⋅k₂ - 2⋅P⋅d ⋅k₁⋅k₂ H⋅P + 2⋅P⋅d ⋅k₂ H⋅P + 2⋅P⋅d ⋅k₁ H⋅P + P⋅d ⋅k₁
⎨P₁: ────────────────────────────, P₂: ────────────────────────────, d₁: ────────────────────────────, d₂: ────────────────────────────, δ: ────────────────
⎪ 2 2 2 2
⎩ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂
2 ⎫
+ P⋅d ⋅k₂ -P⋅d⋅k₁ + P⋅d⋅k₂ ⎪
────────────, tan(teta): ────────────────────────────⎬
2 2 ⎪
+ 4⋅d ⋅k₁⋅k₂ H⋅P⋅k₁ + H⋅P⋅k₂ + 4⋅d ⋅k₁⋅k₂⎭