如何用SymPy提取多元多项式指定幂次项并获取纯表达式
提取Poly对象中的纯表达式
问题描述
给定如下多项式:
3*D*c1*cos_psi**2*p**2*u/(d*k**4*kappa**2) + 3*D*c1*cos_psi*p*q*u/(2*k**4*kappa**2) - 3*D*c1*cos_psi*p*q*u/(d*k**4*kappa**2) - 3*D*c1*u/(2*k**2*kappa**2) - 3*D*c1*p**2*u/(2*k**4*kappa**2) - 3*D*c1*q**2*u/(4*k**4*kappa**2) + 3*D*c1*p**2*u*(1 - cos_psi**2)/(d*k**4*kappa**2) + 3*D*c1*q**2*u/(2*d*k**4*kappa**2) - 6*D*c3*cos_psi**2*p**2*u/(d*k**4*kappa**2) - 6*D*c3*cos_psi*p*q*u/(k**4*kappa**2) + 6*D*c3*cos_psi*p*q*u/(d*k**4*kappa**2) + 6*D*c3*p**2*u/(k**4*kappa**2) + 3*D*c3*q**2*u/(k**4*kappa**2) - 6*D*c3*p**2*u*(1 - cos_psi**2)/(d*k**4*kappa**2) - 3*D*c3*q**2*u/(d*k**4*kappa**2)
需要将其整理为以q和p为变量的多元多项式形式,使用Poly(expr,q,p)可以完成整理,但返回结果带有Poly包装结构,仅需要其中的纯表达式部分。
解决方法
在SymPy中,Poly对象提供了as_expr()方法,可直接提取出其中的纯表达式,操作步骤如下:
- 首先将多项式定义为SymPy表达式;
- 使用
Poly(expr, q, p)将其转换为以q、p为变量的多项式对象; - 调用
as_expr()方法提取纯表达式。
示例代码
from sympy import symbols, Poly # 定义所有符号变量 D, c1, cos_psi, p, u, d, k, kappa, q, c3 = symbols('D c1 cos_psi p u d k kappa q c3') # 输入原始多项式 expr = 3*D*c1*cos_psi**2*p**2*u/(d*k**4*kappa**2) + 3*D*c1*cos_psi*p*q*u/(2*k**4*kappa**2) - 3*D*c1*cos_psi*p*q*u/(d*k**4*kappa**2) - 3*D*c1*u/(2*k**2*kappa**2) - 3*D*c1*p**2*u/(2*k**4*kappa**2) - 3*D*c1*q**2*u/(4*k**4*kappa**2) + 3*D*c1*p**2*u*(1 - cos_psi**2)/(d*k**4*kappa**2) + 3*D*c1*q**2*u/(2*d*k**4*kappa**2) - 6*D*c3*cos_psi**2*p**2*u/(d*k**4*kappa**2) - 6*D*c3*cos_psi*p*q*u/(k**4*kappa**2) + 6*D*c3*cos_psi*p*q*u/(d*k**4*kappa**2) + 6*D*c3*p**2*u/(k**4*kappa**2) + 3*D*c3*q**2*u/(k**4*kappa**2) - 6*D*c3*p**2*u*(1 - cos_psi**2)/(d*k**4*kappa**2) - 3*D*c3*q**2*u/(d*k**4*kappa**2) # 转换为Poly对象并提取纯表达式 poly_obj = Poly(expr, q, p) pure_expr = poly_obj.as_expr() # 打印结果 print(pure_expr)
补充说明
如果需要进一步简化表达式,可以在提取后调用simplify()方法:
from sympy import simplify simplified_expr = simplify(pure_expr) print(simplified_expr)
内容的提问来源于stack exchange,提问作者Nikos Pap
相关产品推荐
相关产品推荐

