Re: ReplaceAll and ReplaceRepeated Strange Behavior
- To: mathgroup at smc.vnet.net
- Subject: [mg111486] Re: ReplaceAll and ReplaceRepeated Strange Behavior
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Tue, 3 Aug 2010 06:36:18 -0400 (EDT)
Hi Brian, FullForm will reveal that some auto-evaluations are happening after you enter your eff, during Mathematica's evaluation process. As a result, one of the products dm*Pi gets rewritten into a different form (Times[Power[dm,-1],L,Power[Pi,-1],...) and does not match your pattern any more: In[13]:= FullForm[eff] Out[13]//FullForm= Times[Power[dm,-1],L,Power[Pi,-1],Power[Plus[Times[dm,mu,Pi],Times[L,Cos[b]]],-1],Plus[Times[-1,L,mu],Times[dm,Pi,Cos[b]]]] The simplest way to get what you want that I can think of is something like the following: In[26]:= Unevaluated[(L*(-L*mu + dm*Pi*Cos[b]))/(dm* Pi*(dm*Pi*mu + L*Cos[b]))] //. {dm*Pi -> L/Tan[a]} // FullSimplify Out[26]= (Cos[b] - mu Tan[a])/(Cos[b] + mu Cot[a]) By using Unevaluated I postpone evaluation until your rules have been applied, and then the auto-evaluation does not happen. Alternatively, you may want to construct a more complicated pattern, but that seems considerably harder to get right. If you still want to keep your expression in a variable, I suggest to use the following trick: Clear[eff]; eff := (L*(-L*mu + dm*Pi*Cos[b]))/(dm*Pi*(dm*Pi*mu + L*Cos[b])); Here, delayed assignment is used. Then: In[32]:= FullSimplify@ReleaseHold [Hold[eff]/.OwnValues[eff]//.{dm*Pi->L/Tan[a]}] Out[32]= (Cos[b]-mu Tan[a])/(Cos[b]+mu Cot[a]) This trick can generalize to more complex expressions involving any number of variables like <eff>, like this for example: In[42]:= Clear[f]; f[x_]:=x^2-2x+1 In[41]:= FullSimplify@ReleaseHold [Hold[f[eff]]/.DownValues[f]/.OwnValues[eff]//.{dm*Pi->L/Tan[a]}] Out[41]= (mu^2 Sec[a]^2)/(mu Cos[a]+Cos[b] Sin[a])^2 Basically, these are the first steps for creating a custom evaluator, which does not evaluate expressions all the way, but only uses those rules you want. It kind of interpolates between purely local rule application and the full global Mathematica evaluation, and adds the convenience of globally defined variables and functions to the level of control you have with local rule application. I find this quite useful at times. Hope this helps. Regards, Leonid On Mon, Aug 2, 2010 at 3:04 PM, blamm64 <blamm64 at charter.net> wrote: > Given the expression: > > eff = (L*(-L*mu+dm*Pi*Cos[b]))/(dm*Pi*(dm*Pi*mu+L*Cos[b])) > > After this I enter > > eff /. {dm*Pi -> L/Tan[a]} > > and get a result that does not, for a reason I cannot fathom and > believe to be a bug, replace one instance of dm*Pi. The result of the > evaluation yields > > L*(-L*mu+L*Cos[b]*Cot[a])/(dm*Pi*(L*Cos[b]+L*mu*Cot[a])) > > Precisely the same result occurs with eff //.{dm*Pi->L/Tan[a]} > > Why is the one remaining dm*Pi not replaced with L/Tan[a]? > > In fact, when define manually define eff1 as > > eff1 = (L*(-L*mu + L*Cos[b]*Cot[b]))/(dm*Pi*(L*Cos[b]+L*mu*Cot[a])) > > which is as you can see the result of the first ReplaceAll execution, > and then enter > > eff1 /. {dm*Pi->L/Tan[a]} > > Mathematica returns eff1 unaltered! > > Now, I say this is a bug, so of course I'm probably missing something > and it isn't a bug. I have to jump through syntactic hoops to get the > 'right' answer: > > FullSimplify[eff /.{dm*Pi->L/Tan[a]}]/.{dm*Pi->L/Tan[a]}//FullSimplify > > and FullSimplify[eff /. {dm*Pi->L/Tan[a]} does no good either. > > It is not at all obvious to me what I might be missing with such an > apparently simple replacement. > > By the way, how do you guys copy input or output from Mathematica > notebook into this usergroup window? I had to do all this by hand, > copy it from here into a notebook, and execute the notebook cells just > to make sure I was getting it correct. I ran across this originally > when I was constructing a simple notebook for doing some Acme power > screw calculations. > > -Brian Lamm > (Windows XP x64 Version 2003 SP2, Mathematica 7.0.1) > >