2009-11-17 12 views
6

genero expresiones analíticas muy largas y complejas de la forma general:Targeted Simplificar en Mathematica

(...something not so complex...)(...ditto...)(...ditto...)...lots... 

Cuando intento utilizar Simplify, Mathematica se detiene, estoy asumiendo que debido al hecho de que se trata para ampliar los corchetes y/o simplificar entre diferentes corchetes. Los paréntesis, que contienen expresiones largas, son fácilmente simplificados por Mathematica por sí mismos. ¿Hay alguna manera de limitar el alcance de Simplify a un solo soporte a la vez?

Editar: Alguna información adicional y progreso.

Así, utilizando el consejo de ustedes ahora he comenzado a usar algo en la vena de

In[1]:= trouble = Log[(x + I y) (x - I y) + Sqrt[(a + I b) (a - I b)]]; 

In[2]:= Replace[trouble, form_ /; (Head[form] == Times) :> Simplify[form],{3}] 

Out[2]= Log[Sqrt[a^2 + b^2] + (x - I y) (x + I y)] 

Cambio Times a una cabeza apropiada como Plus o Power hace posible dirigir la simplificación bastante precisión. El problema/pregunta que queda, sin embargo, es el siguiente: Simplify seguirá descendiendo más allá del nivel especificado en Replace, p.

In[3]:= Replace[trouble, form_ /; (Head[form] == Plus) :> Simplify[form], {1}] 

Out[3]= Log[Sqrt[a^2 + b^2] + x^2 + y^2] 

simplifica la raíz cuadrada también.

Mi plan era utilizar de forma iterativa Replace de abajo hacia arriba un nivel a la vez, pero esto claramente dará lugar a gran cantidad de trabajo repetido por Simplify y en última instancia resultar en la misma exacta empantanamiento de Mathematica que he visto en el principio . ¿Hay alguna forma de restringir Simplify a cierto nivel (s)?

Me doy cuenta de que este tipo de restricción puede no producir resultados óptimos, pero la idea aquí es obtener algo que sea "lo suficientemente bueno".

Respuesta

4

Existen varias maneras de hacerlo, pero puede ser un poco complicado y depende de la estructura de su expresión real.Sin embargo, por lo general un producto de una serie de términos entre paréntesis tendrá la cabeza Times, y se puede utilizar FullForm para verificar esto:

In[1]:= FullForm[(a+b)(c+d)] 
Out[1]= Times[Plus[a, b], Plus[c, d]] 

Usted puede utilizar la función de orden superior Map con expresiones con la cabeza Times la misma modo de usar con expresiones con la cabeza List, y que le puede permitir Simplify la expresión de un término a la vez, así:

Map[Simplify, yourGinormousExpression] 

puede utilizar Expand en el resultado si es necesario ampliar posteriormente o ut los corchetes.

EDITAR para añadir: Si desea especificar las formas que usted desee para simplificar, se puede utilizar Replace o ReplaceAll en lugar de uno de los familiares de Map. Replace es particularmente útil porque toma un level specification, lo que le permite afectar solo los factores en el producto superior. Como un simple ejemplo, considere lo siguiente:

In[1]:= expr = Sqrt[(a + 1)/a] Sqrt[(b + 1)/b]; 

In[2]:= Simplify[expr] 
Out[2]= Sqrt[1 + 1/a] Sqrt[1 + 1/b] 

Si no desea simplificar factores que dependen de a. usted puede hacer esto en su lugar:

In[3]:= Replace[expr, form_ /; FreeQ[form, a] :> Simplify[form], {1}] 
Out[3]= Sqrt[(1 + a)/a] Sqrt[1 + 1/b] 

Sólo el segundo término, que depende de b, se ha cambiado. Una cosa a tener en cuenta es que algunas transformaciones se realizan automáticamente por Times o Plus; por ejemplo a + a se convertirá en 2 a incluso sin el uso de Simplify.

+0

Gracias esto (y las otras respuestas también) me ayudó mucho. – Timo

1

Deberías probar Map.
En general, Map[foo, G[a, b, c, ...]] da G[foo[a], foo[b], foo[c], ...] de cualquier cabeza G y cualquier expresión foo, por lo que para

Map[Simplify, a b c d e] 

da

Simplify[a] Simplify[b] Simplify[c] Simplify[d] Simplify[e] 

Nota puede denotar Map[foo, expr] del als foo /@ expr si encuentra que más cómodo.

2

Discuto con mis colegas, ya que al usar Map para aplicar Simplify a cada subexpresión, puede que no se ahorre tiempo, ya que se aplicará a cada una de ellas. En lugar de tratar, MapAt, como sigue:

In[1]:= MapAt[f, SomeHead[a,b,c,d], {4}] 
Out[1]:= SomeHead[a, b, c, f[d]] 

La parte difícil es la determinación de la especificación de posición. Aunque, si la expresión que desea simplificar está en el primer nivel, no debería ser más difícil que lo que he escrito anteriormente.


Ahora bien, si aún desea simplificar todo, pero desea conservar algún tipo de estructura, intente usar la opción ExcludedForms. En el pasado, he utilizado para evitar que esta simplificación:

In[2]:= Simplify[d Exp[I (a + b)] Cos[c/2]] 
Out[2]:= Exp[I(a + b + c)](d + d Exp[c]) 

cual Mathematica parece que le gusta, por lo que hago

In[3]:= Simplify[d Exp[I (a + b)] Cos[c/2], ExcludedForms -> {_Cos,_Sin}] 
Out[3]:= d Exp[I (a + b)] Cos[c/2] 

Además, no hay que olvidar que el segundo parámetro para Simplify es para suposiciones, y puede facilitar enormemente sus luchas para obtener sus expresiones en una forma útil.

+1

La sugerencia de ExcludeForms es agradable, ¡gracias! Solo quería que Mathematica tuviera una forma de incluir exclusivamente formularios para simplificar, aparte de las Funciones de Transformación, que no se pueden configurar para corchetes ... – Timo