SymPy:如何收集多变量术语? [英] SymPy: How to collect multi-variable terms?

查看:0
本文介绍了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])时,我无法做到这一点;sendy似乎想嵌套一些术语:

𝑥(𝑦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))

我还尝试了几种收集术语的组合,一次一个,简化、扩展等,但都没有用。如有任何帮助,我们不胜感激!

谢谢!

推荐答案

重申OSCAR关于让symPy做您想做的事情的观点,这里是使用cse的另一种方法,它收集在一个表达式中重复的多个操作的术语。由于它还将收集重复的方块,因此我们将w**2替换为u,因此不会收集它。

>>> r, e = cse(expr.subs(w**2,u))

以下是CSE的输出

>>> r
[(x0, x*y*z), (x1, x*y**2), (x2, x*z**2)]
>>> e
[2*u*x0 + 3*u*x2 - 5*w*x0 - 4*w*x1 + 2*w*x2 - 4*x0 - 3*x1 - 5*x2]

现在收集图案:

>>> collect(e, [v for v, _ in r])

并恢复原始文件

>>> _.subs(list(reversed(r))).subs(u, w**2)
x*y**2*(-4*w - 3) + x*y*z*(2*w**2 - 5*w - 4) + x*z**2*(3*w**2 + 2*w - 5)
此收集方案之所以有效,是因为在所有情况下都存在与w相关因素的多因素系数。如果w上有一些线性因素,就需要一些额外的争论(对于这个和另一个方法):

>>> expr += x*w + x*w**2 + y + y*w**2
>>> terms = set(e.as_coeff_Mul()[1] for c in expr.as_poly(w).all_coeffs() for e in Add.make_args(c))
>>> new_expr = sum(t * expr.coeff(t) for t in terms)
>>> new_expr.equals(expr)
False

这篇关于SymPy:如何收集多变量术语?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆