SymPy:如何收集多变量术语?多变、术语、SymPy

2023-09-03 09:25:11 作者:粉诱

我有一个类似于以下内容的长表达式:

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.285693597669752−1.09161331685904⋅10−5−1.60378772636814⋅10−10) + 2(0.0007082690714736562+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