mathematica replacement rule subexpression -
i have using replacement rules:
first have defined simple formulas using setdelayed
a:=b+c d:=a/e
evaluating following equation gives result expected:
in[20]:= (d^2 + something)/(d - 1) out[20]= ((b+c)^2/e^2+something)/((b+c)/e-1)
but if want replace "d" term, let's "tmp", following:
in[26]:= (d^2+something)/(d-1)//.d->tmp out[26]= ((b+c)^2/e^2+something)/(tmp-1)
it seems variable "d" replaced if it's not surrounded function "power". term d^2
not replaced tmp
.
so doing wrong if want d
replaced each time occurs during steps of evaluation?
in in[26]
evaluator has rewritten d
according rule established before replacerepeated
(which you've written //.
) sees it.
mathematica's evaluator quite greedy , //.
has low precedence expression left of //.
in in[26]
has been rewritten to
((b+c)^2/e^2+something)/(tmp-1)
before replacement rule has chance run. since expression contains no d
replacement rule d->tmp
not engaged.
you have number of choices.
a) write new expression d
such d:=tmp
or d=tmp
in case evaluating
(d^2+something)/(d-1)
will produce
(something + tmp^2)/(-1 + tmp)
b) delete definition of d
made evaluating d:=a/e
, use replacement rule whenever want transform expression including d
.
c) study definition , use of functions such hold[]
, holdfirst[]
, parts of documentation cover both mathematica's usual evaluation process , how modify it.
d) usual mathematica, there other ways achieve want, best choice depend on trying do.
to answer particular question what doing wrong if want d replaced each time occurs during steps of evaluation?: defining rewrite rule d:=a/e
, putting set of rules tried during evaluation of expression evaluated thereafter in session.
edit in response comment
d:=a/e
isn't temporary replacement, it's definition persists until removed or replaced or close session. generally, use rules (such d->tmp
. of course, mathematica being can assign rules variables, eg
rule1 = d->a/e
and use them in obvious way
expression /. rule1
you can define lists of rules
rule_list = {d->tmp, e->tmp2, f-> tmp3}
and on.
Comments
Post a Comment