使用模式在Mathematica中收集术语

sjd*_*jdh 9 wolfram-mathematica

用Mathematica我想收集方面from (1 + a + x + y)^4根据的指数xy,所以

(1 + a + x + y)^4 = (...)x^0 y^0 + (...)x^1 y^0 + (...)x^0 y^1 + ...
Run Code Online (Sandbox Code Playgroud)

数学的帮助有一个很好的例子,我试图模仿:

D[f[Sqrt[ x^2 + 1 ]], {x, 3}]
Collect[%, Derivative[ _ ][ f ][ _ ], Together]
Run Code Online (Sandbox Code Playgroud)

这收集相同订单的衍生条款(和f的相同参数)

任何人都可以解释为什么以下模仿不起作用?

Collect[(1 + a + x + y)^4, x^_ y^_]
Run Code Online (Sandbox Code Playgroud)

(1 + a + x + y)^4
Run Code Online (Sandbox Code Playgroud)

对解决方案的任何建议?

rco*_*yer 11

根据Sasha,你必须Expand使用多项式Collect.然而,即使这样,问题也不是那么简单.使用Collect您可以按两个变量分组,但这取决于您如何订购它们:

In[1]:= Collect[ (1 + a + x + y)^4 // Expand, {x, y}]
Out[1]:= 1 + 4 a + 6 a^2 + 4 a^3 + a^4 + x^4 + 
         (4 + 12 a + 12 a^2 + 4 a^3) y + (6 + 12 a + 6 a^2) y^2 + 
         (4 + 4 a) y^3 + y^4 + x^3 (4 + 4 a + 4 y) + 
         x^2 (6 + 12 a + 6 a^2 + (12 + 12 a) y + 6 y^2) + 
         x (4 + 12 a + 12 a^2 + 4 a^3 + (12 + 24 a + 12 a^2) y + 
         (12 + 12 a) y^2 + 4 y^3)
Run Code Online (Sandbox Code Playgroud)

它导出了x导致系数为多项式的任何公因子y.如果你使用了{y,x},Collect那么就会得出公因子,y并且你会得到多项式x.

或者,你可以提供一个模式,x^_ y^_而不是{x,y},但至少在第7节中,这不会收集任何东西.问题在于模式x^_ y^_需要存在指数,但是在类似的方面x y^2,x^2 y指数隐含在至少一个变量中.相反,我们需要指定默认值是可接受的,即使用x^_. y^_.给出的值

Out[2]:= 1 + 4 a + 6 a^2 + 4 a^3 + a^4 + 4 x + 12 a x + 12 a^2 x + 4 a^3 x + 
         6 x^2 + 12 a x^2 + 6 a^2 x^2 + 4 x^3 + 4 a x^3 + x^4 + 4 y + 
         12 a y + 12 a^2 y + 4 a^3 y + (12 + 24 a + 12 a^2) x y + 
         (12 + 12 a) x^2 y + 4 x^3 y + 6 y^2 + 12 a y^2 + 6 a^2 y^2 + 
         (12 + 12 a) x y^2 + 6 x^2 y^2 + 4 y^3 + 4 a y^3 + 4 x y^3 + y^4
Run Code Online (Sandbox Code Playgroud)

但是,这只收集两个变量都存在的术语.说实话,我似乎无法想出一个可以让Collect你想要的功能的模式,但我找到了另一种选择.

我会使用CoefficientRules它,虽然它确实需要一些后处理才能将结果恢复为多项式形式.使用多项式,你得到

In[3]:= CoefficientRules[(1 + a + x + y)^4, {x, y}]
Out[3]:= {{4, 0} -> 1, {3, 1} -> 4, {3, 0} -> 4 + 4 a, {2, 2} -> 6, 
          {2, 1} -> 12 + 12 a, {2, 0} -> 6 + 12 a + 6 a^2, {1, 3} -> 4, 
          {1, 2} -> 12 + 12 a, {1, 1} -> 12 + 24 a + 12 a^2, 
          {1, 0} -> 4 + 12 a + 12 a^2 + 4 a^3, {0, 4} -> 1, {0, 3} -> 4 + 4 a, 
          {0, 2} -> 6 + 12 a + 6 a^2, {0, 1} -> 4 + 12 a + 12 a^2 + 4 a^3, 
          {0, 0} -> 1 + 4 a + 6 a^2 + 4 a^3 + a^4}
Run Code Online (Sandbox Code Playgroud)

现在,如果你只对系数本身感兴趣,那么你已经完成了.但是,要将其转换回多项式,我会使用

In[4]:= Plus @@ (Out[3] /. Rule[{a_, b_}, c_] :> x^a y^b c)
Out[4]:= 1 + 4 a + 6 a^2 + 4 a^3 + a^4 + 
         (4 + 12 a + 12 a^2 + 4 a^3) x + 
         (6 + 12 a + 6 a^2) x^2 + (4 + 4 a) x^3 + x^4 + 
         (4 + 12 a + 12 a^2 + 4 a^3) y + (12 + 24 a + 12 a^2) x y + 
         (12 + 12 a) x^2 y + 4 x^3 y + (6 + 12 a + 6 a^2) y^2 + 
         (12 + 12 a) x y^2 + 6 x^2 y^2 + (4 + 4 a) y^3 + 
         4 x y^3 + y^4
Run Code Online (Sandbox Code Playgroud)

编辑:在考虑之后,还有一个可以完成的简化.由于系数是多项式a,因此它们可以是可分解的.因此,CoefficientRules我们使用Factor简化来代替直接使用的东西:

In[5]:=  Plus @@ (Out[3] /. Rule[{a_, b_}, c_] :> x^a y^b Factor[c])
Out[5]:= (1 + a)^4 + 4 (1 + a)^3 x + 6 (1 + a)^2 x^2 + 4 (1 + a) x^3 + x^4 + 
         4 (1 + a)^3 y + 12 (1 + a)^2 x y + 12 (1 + a) x^2 y + 4 x^3 y + 
         6 (1 + a)^2 y^2 + 12 (1 + a) x y^2 + 6 x^2 y^2 + 4 (1 + a) y^3 + 
         4 x y^3 + y^4
Run Code Online (Sandbox Code Playgroud)

可以看出,系数大大利用简化的Factor,而这一结果可能是由思维预期(1 + a + x + y)^4作为一个简单的三项式与变量(1 + a),xy.考虑到这一点并替换1+az,CoefficientRules然后给出:

In[6]:= CoefficientRules[(z + x + y)^4, {x, y, z}]
Out[6]:= {{4, 0, 0} -> 1, {3, 1, 0} -> 4, {3, 0, 1} -> 4, 
          {2, 2, 0} -> 6, {2, 1, 1} -> 12, {2, 0, 2} -> 6, 
          {1, 3, 0} -> 4, {1, 2, 1} -> 12, {1, 1, 2} -> 12, 
          {1, 0, 3} -> 4, {0, 4, 0} -> 1, {0, 3, 1} -> 4, 
          {0, 2, 2} -> 6, {0, 1, 3} -> 4, {0, 0, 4} -> 1}
Run Code Online (Sandbox Code Playgroud)

或者,以多项式形式

Out[7]:= x^4 + 4 x^3 y + 6 x^2 y^2 + 4 x y^3 + y^4 + 4 x^3 z + 
         12 x^2 y z + 12 x y^2 z + 4 y^3 z + 6 x^2 z^2 + 12 x y z^2 + 
         6 y^2 z^2 + 4 x z^3 + 4 y z^3 + z^4
Run Code Online (Sandbox Code Playgroud)

当你替换z(1 + a)给出相同的结果Out[5].


Sas*_*sha 5

Collect是一个结构性操作,所以需要先扩展。

Collect[(1 + a + x + y)^4 // Expand, x^_ y^_]
Run Code Online (Sandbox Code Playgroud)


Ale*_*kov 5

这有效:

In[1]:= Collect[(1 + a + x + y)^4 // Expand, {x^_ y^_, x^_ y, x y^_, x y, x, y}]

Out[1]= 1 + 4 a + 6 a^2 + 
 4 a^3 + a^4 + (4 + 12 a + 12 a^2 + 4 a^3) x + (6 + 12 a + 6 a^2) x^2 + (4 + 
    4 a) x^3 + x^4 + (4 + 12 a + 12 a^2 + 4 a^3) y + (12 + 24 a + 
    12 a^2) x y + (12 + 12 a) x^2 y + 
 4 x^3 y + (6 + 12 a + 6 a^2) y^2 + (12 + 12 a) x y^2 + 
 6 x^2 y^2 + (4 + 4 a) y^3 + 4 x y^3 + y^4
Run Code Online (Sandbox Code Playgroud)

或者,您可以Default按照rcollyer的建议使用:

In[2]:= Collect[(1 + a + x + y)^4 // Expand, {x^_. y^_., x, y}]

Out[2]= 1 + 4 a + 6 a^2 + 
 4 a^3 + a^4 + (4 + 12 a + 12 a^2 + 4 a^3) x + (6 + 12 a + 6 a^2) x^2 + (4 + 
    4 a) x^3 + x^4 + (4 + 12 a + 12 a^2 + 4 a^3) y + (12 + 24 a + 
    12 a^2) x y + (12 + 12 a) x^2 y + 
 4 x^3 y + (6 + 12 a + 6 a^2) y^2 + (12 + 12 a) x y^2 + 
 6 x^2 y^2 + (4 + 4 a) y^3 + 4 x y^3 + y^4
Run Code Online (Sandbox Code Playgroud)