[Date Index]
[Thread Index]
[Author Index]
Re: Replacing an expression by an expression
*To*: mathgroup at smc.vnet.net
*Subject*: [mg55653] Re: [mg55625] Replacing an expression by an expression
*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>
*Date*: Fri, 1 Apr 2005 05:36:29 -0500 (EST)
*References*: <200503310624.BAA15217@smc.vnet.net>
*Sender*: owner-wri-mathgroup at wolfram.com
On 31 Mar 2005, at 08:24, carlos at colorado.edu wrote:
> I have a 8 x 8 symbolic matrix B of complicated entries.
> Several partial expressions, however, can be simplified. Sample:
>
> rep= {(J12*x14-J11*y14)*(J12*(x32+x43)-J11*(y32+y43)) -> A0*(A1-A0)};
>
> The left expression appears verbatim in entry B[[1,1]], which is
>
> -(L21*(J12*x14-J11*y14)*(J12*(-x32-x43)+J11*(y32+y43)))/
> (16*A412*J*(J11^2+J12^2))
>
> But when I say B=B/.rep, nothing happens. For a few entries I could do
> cut and paste by hand:
>
> -(L21* A0*(A1-A0) )/
> (16*A412*J*(J11^2+J12^2))
>
> But it get tedious and error prone for 64. Any suggestions on how to
> get Mathematica to do the replacement?
>
This is a common problem; the expressions that you are trying to match
are semantically the same but not syntactically so (look carefully at
the minus coefficients of x32 and x43). In this case there is a very
simple solution
In[1]:=
v = -(L21*(J12*x14 - J11*y14)*(J12*(-x32 - x43) +
J11*(y32 + y43)))/(16*A412*J*(J11^2 + J12^2));
In[2]:=
rep = {(J12*x14 - J11*y14)*(J12*(x32 + x43) -
J11*(y32 + y43)) -> A0*(A1 - A0)};
In[3]:=
Simplify[v] /. Simplify[rep]
Out[3]=
(A0*(-A0 + A1)*L21)/(16*A412*J*(J11^2 + J12^2))
but this is not guaranteed to work always in such cases (Simplify may
in fact rearrange the matching parts so that they no longer match).
There is a more subtle way to do this, which should work in all
polynomial and rational function cases, but it can be somewhat tricky.
Instead of rule we define an ideal:
b = {(J12*x14 - J11*y14)*(J12*(x32 + x43) - J11*(y32 + y43)) - A0*(A1 -
A0)};
compute a Groebner basis:
gg = GroebnerBasis[b];
and then use:
Simplify[Last[PolynomialReduce[v, gg,
Join[Variables[v], Variables[gg]]]]]
(A0*(-A0 + A1)*L21)/(16*A412*J*(J11^2 + J12^2))
We were lucky here that the order of variables proved to be just right.
In general we may have to try different variable orders.
Actually, all of the above will be performed automatically by Simplify
with assumptions
Simplify[v, (J12*x14 - J11*y14)*(J12*(x32 + x43) -
J11*(y32 + y43)) == A0*(A1 - A0)]
(A0*(-A0 + A1)*L21)/(16*A412*J*(J11^2 + J12^2))
but again we were lucky that the default order of variables happened to
be just right. The advantage of the first approach (using
PolynomialReduce) is the tone can easier control the order of the
variables.
Andrzej Kozlowski
Chiba, Japan
http://www.akikoz.net/andrzej/index.html
http://www.mimuw.edu.pl/~akoz/
Prev by Date:
**Re: plotting weighted graphs**
Next by Date:
**Re: symbolic quaternionic analysis**
Previous by thread:
**Re: Replacing an expression by an expression**
Next by thread:
**Fwd: Replacing an expression by an expression**
| |