2011-06-02 15 views
6

¿Cómo le digo a mathematica que haga este reemplazo inteligentemente? (O ¿cómo puedo obtener más inteligente en contar Mathematica para hacer lo que quiera)Pregunta sobre el reemplazo "inteligente" en mathematica

expr = b + c d + ec + 2 a; 
expr /. a + b :> 1 

Out = 2 a + b + c d + ec 

espero que la respuesta sea a + cd + ec + 1. Y antes de que alguien sugiera, no quiero hacer a :> 1 - b, porque con fines estéticos, me gustaría tener ambos a y b en mi ecuación, siempre y cuando no se pueda hacer la simplificación a+b = 1.


Además, ¿cómo lo reciba para reemplazar todas las instancias de 1-b, -b+1 o -1+b, b-1 con a o -a respectivamente, y viceversa?

He aquí un ejemplo para esta parte:

expr = b + c (1 - a) + (-1 + b)(a - 1) + (1 -a -b) d + 2 a 
+3

'Replace' reemplaza subexpresiones basado en la equivalencia estructural (ver 'FullForm'), no lo hace realizar cualquier manipulación algebraica. Puede intentar usar 'Reducir', que está diseñado para estos casos. No puedo probarlo ahora sin embargo. –

+5

Podría querer mirar en PolynomialReduce si la expresión generalmente será un polinomio. –

Respuesta

17

Se puede utilizar una versión personalizada de FullSimplify mediante el suministro de sus propias transformaciones a FullSimplify y dejar que averiguar los detalles:

In[1]:= MySimplify[expr_,equivs_]:= FullSimplify[expr, 
      TransformationFunctions -> 
      Prepend[ 
       Function[x,x-#]&/@[email protected][{#,-#}&,equivs/.Equal->Subtract], 
       Automatic 
      ] 
     ] 
In[2]:= MySimplify[2a+b+c*d+e*c, {a+b==1}] 
Out[2]= a + c(d + e) + 1 

equivs/.Equal->Subtract vueltas dado ecuaciones en expresiones iguales a cero (por ejemplo, a+b==1 ->a+b-1). [email protected][{#,-#}&, ] luego construye versiones también negadas y las aplana en una sola lista. Function[x,x-#]& /@ convierte las expresiones cero en funciones, que restan las expresiones cero (#) de lo que se les da más adelante (x) por FullSimplify.

Puede ser necesario especificar su propio ComplexityFunction para FullSimplify, también, si su idea de la diferencia simples de FullSimplify 's por defecto ComplexityFunction (que es más o menos equivalente a LeafCount), por ejemplo:

MySimplify[expr_, equivs_] := FullSimplify[expr, 
    TransformationFunctions -> 
    Prepend[ 
     Function[x,x-#]&/@[email protected][{#,-#}&,equivs/.Equal->Subtract], 
     Automatic 
    ], 
    ComplexityFunction -> (
    1000 LeafCount[#] + 
    Composition[ 
     Total,Flatten,Map[ArrayDepth[#]#&,#]&,CoefficientArrays 
    ][#] & 
) 
] 

En su Por ejemplo, el predeterminado ComplexityFunction funciona bien, sin embargo.

+0

wow gracias. Me tomará un poco de tiempo antes de entenderlo completamente. –

+1

+1, para la construcción 'Función [x, x - #] &' sola. Tenía la impresión equivocada de que no funcionaría, así que parece que necesito volver a evaluar algunas de mis suposiciones. – rcollyer

+0

+1 para la función y la explicación clara. Incluso con esto, me tomó unos minutos comprenderlo completamente. –

3

Para el primer caso, podría considerar:

expr = b + c d + ec + 2 a 

PolynomialReduce[expr, {a + b - 1}, {b, a}][[2]] 

Para el segundo caso, tenga en cuenta:

expr = b + c (1 - a) + (-1 + b) (a - 1) + (1 - a - b) d + 2 a; 

PolynomialReduce[expr, {x + b - 1}][[2]] 

(% /. x -> 1 - b) == expr // Simplify 

y:

PolynomialReduce[expr, {a + b - 1}][[2]] 

Simplify[% == expr /. a -> 1 - b]