|
From: Richard F. <fa...@gm...> - 2024-02-29 05:32:23
|
In the context of taking a numerical program and reusing it with partial symbolic input, here's another example.. Here is one step of a newton iteration: x[n+1] = x[n] - f(x[n])/df(x[n])... newtstep(f,x,val):= block([d:diff(f,x)], val- subst(val, x,f/d)); how does this work? val is a guess... here, a guess the root of x^2-9... newtstep(x^2-9,x, 5.0); --> returns 3.4 newtstep(x^2-9,x, 3.4); --> returns 3.023529411764706 newtstep(x^2-9,x, 3.023529411764706); --> returns 3.00009155413138 you get the idea. Now try putting an expression in there for the guess.. [ could use a NaN perhaps] newtstep(x^2-9,x,3-eps)$ /* could put 5-eps or anything else... newtstep(x^2-9,x,%)$ newtstep(x^2-9,x,%)$ --> -((eps^8-24*eps^7+504*eps^6-6048*eps^5+45360*eps^4-217728*eps^3+653184*eps^2-1119744*eps+839808)/(8*eps^7-168*eps^6+2016*eps^5-15120*eps^4+72576*eps^3-217728*eps^2+373248*eps-279936)) whew! try to understand this by using Taylor expansion.. taylor(%,eps,0, 9) --> 3+eps^8/279936+eps^9/209952 The newtstep program could instead be some large mysterious iterative numerical program in a language that normally does not allow symbols. But we might fool it by using NaNs as substitutes for symbolic expressions. If you had this all hooked up via trap handling you might get some insight as to how a program works.. RJF |