Sympy中如何将x,y六次多元多项式整理为含(x²+y²)幂次的形式
解决方案
核心原因
直接调用collect(eqn, x**2+y**2)无效的核心原因是Sympy默认的collect逻辑只会匹配可完全表示为(x**2+y**2)幂次乘积的项,对于包含x或y奇次幂的交叉项不会自动做代数变形归并,需要先通过变量替换完成变形后再收集。
实现代码
通过引入中间变量r_sq = x**2 + y**2,将所有y**2替换为r_sq - x**2,展开后再按r_sq的幂次收集,最后替换回原表达式即可得到你需要的格式:
import sympy as sp # 定义符号和原方程 x, y, a, b, c, d, e, f, g = sp.symbols('x y a b c d e f g') # 示例原方程,可替换为你自己的六次方程 eqn = a*x**6 + b*x**5*y + c*x**4*y**2 + d*x**3*y**3 + e*x**2*y**4 + f*x*y**5 + g*y**6 # 定义中间变量 r_sq = sp.symbols('r_sq') # 替换所有y²为r_sq - x²,展开表达式 eqn_replaced = sp.expand(eqn.subs(y**2, r_sq - x**2)) # 按r_sq的幂次收集项 eqn_collected = sp.collect(eqn_replaced, r_sq) # 替换回x²+y²得到最终格式 eqn2 = eqn_collected.subs(r_sq, x**2 + y**2) # 打印验证结果 sp.pprint(eqn2)
进阶适配(兼容更高次y幂)
如果方程中存在y**4、y**5等高次幂项,可以用递归替换的方法自动处理所有y的≥2次幂,不用手动逐个替换:
def replace_y_high_power(expr): if expr.is_Pow and expr.base == y and expr.exp >= 2: exp = expr.exp if exp % 2 == 0: return (r_sq - x**2) ** (exp // 2) else: return y * (r_sq - x**2) ** ((exp - 1) // 2) return expr # 替换、展开、收集的逻辑和之前一致 eqn_replaced = sp.expand(eqn.replace(replace_y_high_power)) eqn_collected = sp.collect(eqn_replaced, r_sq) eqn2 = eqn_collected.subs(r_sq, x**2 + y**2)
最终得到的eqn2就是你要求的A*(x**2+y**2)**3 + B*(x**2+y**2)**2 + C*(x**2+y**2) + D格式,其中A、B、C、D均为仅包含x、y的表达式。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

