2017-09-08 24 views

回答

1

當我遇到像這樣的問題時,我嘗試使用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是你的瑞士軍刀:-)

相關問題