如果在SymPy中设置方程式,如何用其他变量表示变量?

时间:2017-09-08 08:24:29

标签: python sympy symbolic-math

我试图从方程组中消除r和z,得到没有r和z的S的表达式:

enter image description here

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的空列表,但我确信s有解决方案。是否有任何方法或功能来处理这个问题?

1 个答案:

答案 0 :(得分:1)

当我遇到这样的问题时,我尝试使用CAS为我执行导致我想要的解决方案的步骤。只有3个方程式,这非常简单。

我们可以从最后2个方程中消除S

>>> 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)}

该解决方案可以代入第一个等式

>>> 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)]

所以我们需要的是来自e1的a,b和c的值,我们应该拥有它们 S,free或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成为您的瑞士军刀: - )