Используйте шаблон для сбора терминов в Mathematica

С помощью Mathematica я хотел бы собирать термины from (1 + a + x + y)^4 в соответствии с показателями x и y, поэтому

(1 + a + x + y)^4 = (...)x^0 y^0 + (...)x^1 y^0 + (...)x^0 y^1 + ...

В справке по Mathematica есть хороший пример, который я попытался подражать:

D[f[Sqrt[ x^2 + 1 ]], {x, 3}]
Collect[%, Derivative[ _ ][ f ][ _ ], Together]

Это собирает производные члены того же порядка (и тот же аргумент для f)

Кто-нибудь может объяснить, почему следующая имитация не работает?

Collect[(1 + a + x + y)^4, x^_ y^_]

дает

(1 + a + x + y)^4

Любые предложения по решению?


person sjdh    schedule 08.07.2011    source источник


Ответы (5)


Согласно Саша, вам нужно 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)

который извлекает любой общий делитель 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

Но это собирает только термины, в которых присутствуют обе переменные. По правде говоря, я не могу придумать шаблон, который заставит 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}

Теперь, если вас интересуют только сами коэффициенты, то все готово. Но, чтобы преобразовать это обратно в полином, я бы использовал

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

Правка: подумав об этом, можно сделать еще одно упрощение. Поскольку коэффициенты представляют собой полиномы от 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

Как видно, коэффициенты значительно упрощаются при использовании Factor, и этого результата можно было бы ожидать, рассматривая (1 + a + x + y)^4 как простой трехчлен с переменными (1 + a), x и y. Имея это в виду и заменив 1+a на z, 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}

Или, в полиномиальной форме

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

что при замене z на (1 + a) дает результат, идентичный показанному в Out[5].

person rcollyer    schedule 08.07.2011

Collect — это структурная операция, поэтому сначала вам нужно расшириться.

Collect[(1 + a + x + y)^4 // Expand, x^_ y^_]
person Sasha    schedule 08.07.2011

Это работает:

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

В качестве альтернативы вы можете использовать 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
person Alexey Popkov    schedule 10.07.2011

Плюс @@ MonomialList[(1 + a + x + y)^4, {x, y}]

person sevec    schedule 27.05.2012

Это может быть то, что вы искали

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

Out[1]:= x^4+x^3 (4 y+4 a+4)+x^2 (6 y^2+(12 a+12) y+6 a^2+12 a+6)+
         x (4 y^3+(12 a+12) y^2+ (12 a^2+24 a+12) y+4 a^3+12 a^2+12 a+4)+
         y^4+(4 a+4) y^3+(6 a^2+12 a+6) y^2+(4 a^3+12 a^2+12 a+4) y+
         a^4+4 a^3+6 a^2+4 a+1
person Quinn McKinsey    schedule 09.10.2011