1
我試圖消除設定的公式R和Z,並得到S的表達而不R和Z:如何用SymPy中的方程組表示具有其他變量的變量?
var('xi R R_bfs k S z r')
solve(r**2 - 2*R*z + (k + 1)*z**2, S*cos(xi)+z-R_bfs, S*sin(xi)-r, S, r, z)
這將返回S上的空單,但我相信有解決方案。有沒有辦法或功能來解決這個問題?
我試圖消除設定的公式R和Z,並得到S的表達而不R和Z:如何用SymPy中的方程組表示具有其他變量的變量?
var('xi R R_bfs k S z r')
solve(r**2 - 2*R*z + (k + 1)*z**2, S*cos(xi)+z-R_bfs, S*sin(xi)-r, S, r, z)
這將返回S上的空單,但我相信有解決方案。有沒有辦法或功能來解決這個問題?
當我遇到像這樣的問題時,我嘗試使用CAS爲我執行導致我想要的解決方案的步驟。只有3個方程式,這非常簡單。
我們可以從過去的2個方程
>>> eqs = r**2 - 2*R*z + (k + 1)*z**2, S*cos(xi)+z-R_bfs, S*sin(xi)-r
>>> solve(eqs[1:],(r,z))
{r: S*sin(xi), z: R_bfs - S*cos(xi)}
這種溶液消除S可被取代到第一方程
>>> e1 = eqs[0].subs(_)
這導致在S中的多項式,度= 2,即不包含r或z
>>> degree(e1, S)
2
>>> e1.has(r, z)
False
而一般二次方程的解是
>>> q = solve(a*x**2 + b*x + c, x); q
[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]
所以我們需要是A,B和E1 c和我們應該擁有的S,免費或R和Z 解決方案的價值:
>>> A, B, C = Poly(e1, S).all_coeffs()
>>> solns = [i.subs({a: A, b: B, c: C}) for i in q]
我們看看那些之前讓我們讓CSE去除常見的表情
>>> reps, sols = cse(solns)
這裏有被識別的替代
>>> for i in reps:
... print(i)
(x0, cos(xi))
(x1, x0**2)
(x2, k*x1 + x1 + sin(xi)**2)
(x3, 1/(2*x2))
(x4, 2*R)
(x5, x0*x4)
(x6, 2*R_bfs*x0)
(x7, k*x6)
(x8, x5 - x6 - x7)
(x9, R_bfs**2)
(x10, sqrt(-4*x2*(-R_bfs*x4 + k*x9 + x9) + x8**2))
而在這些方面,這裏有解決方案:
>>> for i in sols:
... print(i)
x3*(x10 - x5 + x6 + x7)
-x3*(x10 + x8)
如果你喜歡非CSE的形式,你可以看看這一點。這裏是一個解決方案:
>>> print(filldedent(solns[0]))
(-2*R*cos(xi) + 2*R_bfs*k*cos(xi) + 2*R_bfs*cos(xi) +
sqrt(-4*(-2*R*R_bfs + R_bfs**2*k + R_bfs**2)*(k*cos(xi)**2 +
sin(xi)**2 + cos(xi)**2) + (2*R*cos(xi) - 2*R_bfs*k*cos(xi) -
2*R_bfs*cos(xi))**2))/(2*(k*cos(xi)**2 + sin(xi)**2 + cos(xi)**2))
如果您最初的所有功能於一身的 - 去解決故障,儘量讓SymPy是你的瑞士軍刀:-)