Използвайте модел за събиране на термини в 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}, но поне във v.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