|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
/* This file:
* http://anggtwu.net/MAXIMA/mysubst.mac.html
* http://anggtwu.net/MAXIMA/mysubst.mac
* (find-angg "MAXIMA/mysubst.mac")
* Author: Eduardo Ochs <eduardoochs@gmail.com>
*
* (defun e () (interactive) (find-angg "MAXIMA/mysubst.mac"))
* See: (find-es "maxima" "mysubst")
* Superseded by: (find-angg "MAXIMA/mysubst.mac")
*
* Idea: this is the chain rule,
*
* [ d ]
* [RC] = [ -- f(g(x)) = f'(g(x))g'(x) ]
* [ dx ]
*
* and this is I how write - in mathematical notation - the
* substitution that specializes it to a certain particular case:
*
* [ f(u) := sin(u) ] [ d ]
* [RC] [ f'(u) := cos(u) ] = [ -- sin(42*(x)) = cos(42*x)*42 ]
* [ g(x) := 42*x ] [ dx ]
* [ g'(x) := 42 ]
*
* We can't use items like "f(u)=sin(u)" in substitution lists in
* Maxima, but everything works if we convert them to lambdas, like
* this:
*
* RC : ( 'diff(f(g(x)),x) = fp(g(x))*gp(x) );
* substs : [ f = lambda([u], sin(u)),
* fp = lambda([u], cos(u)),
* g = lambda([x], 42*x),
* gp = lambda([x], 42) ];
* subst(substs, RC);
*
* The functions in this file implement a preprocessor for
* substitution lists that convert substitutions declared with `:='s
* into their lambda forms, and doesn't change the substituions
* declared with `='s. For example, in
*
* substs : '[ a = 42,
* h(x,y) := 10*x+y ];
* mysubst_ify(substs);
* mysubst (substs, h(a,3));
*
* the results of the "mysubst_ify" and of the "mysubst" are:
*
* (%i16) mysubst_ify(substs);
* (%o16) [a = 42, h = lambda([x, y], y + 10 x)]
* (%i17) mysubst (substs, h(a,3));
* (%o17) 423
*/
mysubst_f(fxye) := block([fxy,f,xy,e],
fxy : lhs(fxye),
f : op(fxy),
xy : args(fxy),
e : rhs(fxye),
buildq([f,xy,e], f=lambda([splice(xy)],e)))$
mysubst_1 (ab) := if is(op(ab) = ":=") then mysubst_f(ab) else ab$
mysubst_ify(fxyes) := map('mysubst_1, fxyes)$
mysubst (fxyes,o) := subst(mysubst_ify(fxyes), o)$
/*
* Tests:
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("~/MAXIMA/mysubst.mac");
gradef(f(u), fp(u));
gradef(g(x), gp(x));
RC : ('diff(f(g(x)), x) = diff(f(g(x)), x));
RC : ('diff(f(g(x)), x) = fp(g(x)) * gp(x));
substs : '[ f(u) := sin(u),
fp(u) := cos(u),
g(x) := 42*x,
gp(x) := 42 ];
mysubst_ify(substs);
mysubst (substs, RC);
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("~/MAXIMA/mysubst.mac");
mysubst_f('(f(x,y):=10*x+y));
'[f(x,y):=10*x+y, g(x):=10*x, a=42];
mysubst_ify('[f(x,y):=10*x+y, g(x):=10*x, a=42]);
gradef(g(x), g_x(x));
gradef(F(u), f(u));
BB : F(g(x));
CC : F(u);
aa : diff(BB, x);
dd : diff(CC, u);
AA : integrate(aa, x);
DD : integrate(dd, u);
MM : align_eqs([AA,BB,CC,DD]);
substs2 : '[g(x):=2*x, g_x(x):=2];
substs4 : '[g(x):=2*x, g_x(x):=2, F(u):=sin(u), f(u):=cos(u)];
mysubst_ify(substs2);
mysubst_ify(substs4);
MM2 : mysubst(substs2, MM);
MM2 : mysubst(substs4, MM);
MM3 : ev(MM2, 'integrate);
MM4 : subst([u=2*x], MM3);
*/