Re: Problems with Set, SetDelayed and replacement rules...

*To*: mathgroup at smc.vnet.net*Subject*: [mg72287] Re: [mg72274] Problems with Set, SetDelayed and replacement rules...*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>*Date*: Mon, 18 Dec 2006 06:56:08 -0500 (EST)*References*: <200612171120.GAA07339@smc.vnet.net>

On 17 Dec 2006, at 20:20, Johannes wrote: > Hi, > > I am working a lot with physics equations where I have on the one > hand variables, and on the other hand paramters, which depend on > other parameters which are only given by a polynome. > In the following (very simplified example) f is a function which > depends on variable x and parameters g and h which depend both on > parameter p: > > f[x_]:= g/h*x; > g[p_]= 1+p; > h[p_]=1+p^2; > params={g->g[p],h->h[p]}; > > For numerical application, I would like to define a second function > f with p as second variable. This I have done with different > methods, and there I noticed a difference that I can't explain > > f1[x_, p_] = f[x] /. params; > f2[x_, p_] := f[x] /. {g->g[p],h->h[p]}; > f3[x_, p_] := f[x] /. params; > > If I am now calculating f1[1,1], f2[1,1] and f3[1,1], f1 and f2 > deliver as expected a numerical value, but for f3[1,1] p isn't > replaced by its value 1. > > Can anybody explain me the differences, especially the differences > between f2 and f3? I suspected it to be exactly identical. > > And does anybody know a better method to treat parameters? My > problem is that when doing analytical transformations (Derivatives, > Integrations...), an immediate replacement of the parameters g and > h would make the result very hard to read, so I was searching for > an easy method to replace them as late as possible. > > Thanks in advance for any help, > Johannes > When you have a definition like this: f[a1_,a2_,...]:=Body and evaluate f[b1,b2,...] what happens is this. First b1,b2,... are literally substituted for a1,a2,... in Body and then Body is evaluated. So look at you secodn defintion: > f3[x_, p_] := f[x] /. params; > When you evaluate f3[1,1] there is no p on the right hand side to substitute 1 for, so it is not substituted. Only after the substitution params is evaluated, and then p appears but by now it is too late. I am not sure what sort of "readability" problem you are referring to? You could of course use: f3[x_, p_] := Evaluate[f[x] /. params] but I am not sure whether this helps? Andrzej Kozlowski

**References**:**Problems with Set, SetDelayed and replacement rules...***From:*Johannes <ml.johannes@gmail.com>