SymPy:如何收集多变量项?

问题描述 投票:0回答:1

我在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 symbolic-math algebra
1个回答
0
投票

我不知道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⎠
© www.soinside.com 2019 - 2024. All rights reserved.