2011-07-08 14 views
9

Con Mathematica me gustaría recopilar términos from (1 + a + x + y)^4 acuerdo con los exponentes de x y y, por loUso patrón para recoger términos en Mathematica

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

El Mathematica help tiene un buen ejemplo de lo que he tratado de imitar:

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

Esto recoge los términos derivados de la misma orden (y el mismo argumento para f)

¿Alguien puede explicar por qué la siguiente imitación no funciona?

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

da

(1 + a + x + y)^4 

¿Alguna sugerencia para una solución?

+0

sjdh, debe aceptar la respuesta de rcollyer. Haga clic en el contorno de la marca de verificación al lado de su respuesta. –

+0

@sjdh: Como señala Mr Wizard, la convención StackOverflow es que, dado que la respuesta de rcollyer fue perfecta para su problema, debe aceptar la respuesta de rcollyer. –

Respuesta

10

Según Sasha, usted tiene que Expand el polinomio de usar Collect. Sin embargo, incluso entonces no es tan simple de un problema. Usando Collect puede agrupar por dos variables, pero depende de cómo se les pide:

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) 

que se saca ningún factor común de x resultando en coeficientes que son polinomios en y. Si utilizó {y,x} en su lugar, Collect eliminaría los factores comunes de y y tendría polinomios en x.

Como alternativa, podría suministrar un patrón, x^_ y^_ en lugar de {x,y}, pero al menos en v.7, esto no recoge nada. El problema es que el patrón x^_ y^_ requiere que exista un exponente, pero en términos como x y^2 y x^2 y, el exponente está implícito en al menos una de las variables. En su lugar, tenemos que especificar que un valor default es aceptable, es decir, utilizar x^_. y^_. que da

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 

embargo, esto sólo recoge los términos en que ambas variables están presentes. A decir verdad, parece que no puedo encontrar un patrón que haga que Collect funcione como usted quiera, pero he encontrado una alternativa.

Usaría CoefficientRules en su lugar, aunque requiere un poco de postprocesamiento para volver a poner el resultado en forma polinómica. Usando su polinomio, se obtiene

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} 

Ahora, si usted está interesado sólo en los coeficientes de ellos mismos, entonces ya está. Pero, para transformar este de nuevo en un polinomio, usaría

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 

Editar: Después de pensar en ello, no es una simplificación más que se pueda hacer. Dado que los coeficientes son polinomios en a, pueden ser factorables.Así, en lugar de utilizar lo CoefficientRules da directamente, utilizamos Factor para simplificar:

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 

Como puede verse, los coeficientes se simplifican considerablemente mediante el uso de Factor, y este resultado podría haber sido anticipado por el pensamiento de (1 + a + x + y)^4 como trinomio simple con las variables (1 + a), x y y. Con esto en mente y su sustitución con 1+az, CoefficientRules entonces da:

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} 

O, en forma polinómica

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 

el que cada vez que cambie z con (1 + a) da el mismo resultado se muestra en la Out[5].

+0

Gracias. La solución CoefficientRules funciona perfecto para mi problema. – sjdh

+0

@sdjh, este sitio funciona en una relación recíproca entre el que pregunta y el que responde. Como tal, si una respuesta satisface sus necesidades al responder su pregunta, debe marcarla como aceptada. Esto les da un impulso de reputación a ambos. – rcollyer

+0

+1 gracias por la excelente respuesta –

4

Collect es una operación estructural, por lo que debe expandirse primero.

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

Esto funciona:

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 

Alternativamente, puede utilizar Default como sugiere 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 
+0

+1, acabo de ver esto, y veo que encontraste el patrón que me faltaba. – rcollyer

1

Esto puede ser lo que estás buscando

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 
1

Plus @@ MonomialList [(1 + a + x + y)^4, {x, y}]

Cuestiones relacionadas