我在sympy中有一个长表达式,看起来像这样:
2𝑤^2𝑥𝑦𝑧 + 3𝑤^2 𝑥𝑧^2 − 4𝑤𝑥𝑦^2 − 5𝑤𝑥𝑦𝑧 + 2𝑤𝑥𝑧^2 − 3𝑥𝑦^2 − 4𝑥𝑦𝑧 − 5𝑥𝑧^2 ...
其中变量是w,x,y,z的组合,并且也可以具有2的幂。
[我想收集项[x,y,z],这样我最终得到w的二次多项式作为每个项的系数,例如:
xyz(−0.285𝑤^2 - 1.09⋅10−5𝑤, 1.60⋅10−10) + xy^2(...w^2, ...w, ...) + x^2y(...) + xz^2(...) + ...
当我使用collect(exp,[x,y,z])时,我无法实现; sympy似乎想嵌套一些术语:
𝑥(𝑦2(−0.00341083824360158𝑤−2.60668077412341⋅10−8) +
𝑦𝑧(−0.28569359766975𝑤2−1.09161331685904⋅10−5𝑤−1.60378772636814⋅10−10) + 𝑧2(0.000708269071473656𝑤2+1.72432957139821⋅10−10𝑤−2.29362549750881⋅10−13))
我还尝试过一次收集术语,简化,扩展等的几种组合,但无济于事。非常感谢您的帮助!
谢谢!
我不知道SymPy中有针对此类情况的就绪函数。不过,我对SymPy的喜欢是,一旦您熟悉内部结构,它就会为您提供很多定义这样的基本操作的能力。
这可能有用,或者希望至少可以提供一个起点:
In [124]: x, y, z, w = symbols('x, y, z, w')
In [125]: expr = 2*w**2*x*y*z + 3*w**2*x*z**2 - 4*w*x*y**2 - 5*w*x*y*z + 2*w*x*z**2 - 3*x*y**2 - 4*x*y*z - 5*x*z**2
In [126]: expr
Out[126]:
2 2 2 2 2 2 2
2⋅w ⋅x⋅y⋅z + 3⋅w ⋅x⋅z - 4⋅w⋅x⋅y - 5⋅w⋅x⋅y⋅z + 2⋅w⋅x⋅z - 3⋅x⋅y - 4⋅x⋅y⋅z - 5⋅x⋅z
In [127]: terms = set(e.as_coeff_Mul()[1] for c in expr.as_poly(w).all_coeffs() for e in Add.make_args(c))
In [128]: new_expr = sum(t * expr.coeff(t) for t in terms)
In [129]: new_expr
Out[129]:
2 ⎛ 2 ⎞ 2 ⎛ 2 ⎞
x⋅y ⋅(-4⋅w - 3) + x⋅y⋅z⋅⎝2⋅w - 5⋅w - 4⎠ + x⋅z ⋅⎝3⋅w + 2⋅w - 5⎠