You can subscribe to this list here.
2014 
_{Jan}

_{Feb}
(232) 
_{Mar}
(323) 
_{Apr}
(383) 
_{May}
(359) 
_{Jun}
(435) 
_{Jul}
(252) 
_{Aug}
(172) 
_{Sep}
(265) 
_{Oct}
(219) 
_{Nov}

_{Dec}


From: Martin Kraska <kraska@fh...>  20140422 11:04:26

David, when there are multiple versions installed (as is normal when testing new versions), they normally share the same user dir. This is problematic, if compliation products as e.g. produced by the draw package are not compatible between versions. On option to avoid this is to set version specific directories, e.g. by changing line 31 in maxima.bat to if "%MAXIMA_USERDIR%" == "" set MAXIMA_USERDIR=%USERPROFILE%\maxima%version% At least on my computer that works. Could you please consider this for future versions of the installer? Thanks a lot. Best regards, Martin Kraska > Ursprüngliche Nachricht > Von: David Billinghurst [mailto:dbmaxima@...] > Gesendet: Sonntag, 6. April 2014 02:31 > An: maximadiscuss@... > Betreff: Re: [Maximadiscuss] Windows package, was: Maxima 5.33.0 release > > On 5/04/2014 10:57 AM, David Billinghurst wrote: > > On 5/04/2014 5:52 AM, Robert Dodier wrote: > >> On 20140404, David Billinghurst <dbmaxima@...> wrote: > >> > >>> There is a new windows installer available at > >>> http://billinghurst.customer.netspace.net.au/maxima5.33.0.exe > >> Thanks, David. For the record, I installed it on my Windows Vista > >> laptop and it mostly works except that it runs into an error whenever > >> the Lisp compiler is invoked  something about CreateProgram or > >> something like that. That error is provoked several times during the > >> test suite. > > OK. There is a new windows installer > http://billinghurst.customer.netspace.net.au/maxima5.33.0.1.exe > > This is built the classic way. I worked around the makeinfo problem using a > wrapper script that calls cygwin makeinfo. Not pretty, but it works for me > right now. > > Postscript plotting is still broken. > >   > _______________________________________________ > Maximadiscuss mailing list > Maximadiscuss@... > https://lists.sourceforge.net/lists/listinfo/maximadiscuss 
From: Helmut Jarausch <jarausch@ig...>  20140422 08:27:39

Hi, when there is syntax error in batch file, maxima has the bad habbit of displaying the character offset from the beginning of the file like (%i2) load("Eulix.mac") stdin:18665:incorrect syntax: T is not an infix operator (%o2) /Work1/Src/Math/Maxima/HJ/Eulix_T5.mac I have written a tiny Python script to convert this to line/column information, e.g. in line 480 at col 6 It would nice if Maxima would do this itself. Many thanks for considering this, Helmut 
From: Robert Dodier <robert.dodier@gm...>  20140422 01:14:51

On 20140421, nijso beishuizen <nijso@...> wrote: > In the solution of an ODE of the form y=%c*f(x), I want to simplify f(x) > by absorbing constant terms in %c, so exp(x+a) becomes exp(x)*exp(a) and > exp(a) can be absorbed in the integration constant %c. Same for > expressions of the form a^(b+f(x)). I think you can get Maxima's pattern matching functions to do a lot of the work for you. I think that is preferable to explicit part hacking. General approach here is to separate terms free of x from terms not free of x, in "^" expressions and "*" expressions. To prevent Maxima's builtin simplifications from collapsing the terms together again, I'll replace "^" and "*" with "my^" and "my*" since there are no simplifications for those. At the end of the process I'll substitute the builtin operators back into the result. (%i1) matchdeclare ([aa, bb], freeof (x)) $ (%i2) matchdeclare (cc, lambda ([e], not freeof (x, e))) $ (%i3) infix ("my^") $ (%i4) infix ("my*") $ (%i5) defrule (r1, aa^(bb + cc), (aa my^ bb) * (aa my^ cc)) $ (%i6) matchdeclare (bb, lambda ([e], e # 1 and freeof (x, e))) $ (%i7) defrule (r2, bb * cc, bb my* cc) $ The rules r1 and r2 will capture multiple terms in bb and cc because the rule machinery treats "+" and "*" as commutative operators. (All the terms free of x in one variable and all the others in the other variable.) NB: in %i6, exclude bb = 1 because otherwise r2 leads to endless looping. At this point we can see if the rules capture the bits we want. (%i8) apply1 (a * exp(b + c*x), r1, r2); (%o8) ((%e my^ b) a) my* (%e my^ (c my* x)) So far, so good. Here's a function to apply those rules. If the result looks like foo my* bar, the rules matched. Note that x is an argument so if some other symbol is supplied, x is bound to that symbol and the freeof tests use that symbol. terms_split returns false if the matching fails. (%i12) terms_split (e, x) := (apply1 (e, r1, r2), if not atom(%%) and op(%%) = "my*" then subst (["my^" = "^", "my*" = "*"], args (%%))) $ Examples: (%i18) terms_split (a*exp(x+b)/c, x); (%o18) [a*%e^b/c,%e^x] (%i19) terms_split (sin(u)*exp(u  1/u + a)/(2*u), u); (%o19) [%e^a/2,%e^(u1/u)*sin(u)/u] (%i20) terms_split (b/exp (2*v  3*w)*v^2, v); (%o20) [b*%e^(3*w),v^2*%e^(2*v)] (%i21) terms_split (%c * f(x), x); (%o21) [%c,f(x)] (%i22) terms_split (a^(b + f(x)), x); (%o22) [a^b,a^f(x)] (%i24) terms_split (a*b*c*exp(a*z + sin(z) + d  1)*cos(z)/erf(z), z); (%o24) [a*b*c*%e^(d1),%e^(sin(z)+a*z)*cos(z)/erf(z)] Hope this helps, Robert Dodier 
From: nijso beishuizen <nijso@ho...>  20140421 21:14:25

In the solution of an ODE of the form y=%c*f(x), I want to simplify f(x) by absorbing constant terms in %c, so exp(x+a) becomes exp(x)*exp(a) and exp(a) can be absorbed in the integration constant %c. Same for expressions of the form a^(b+f(x)). I also noticed that it's actually ?print(dispform(rat(exp(x+2)))) that gives the internal lisp representation I mentioned. So I could do something like this: substinpart("[",dispform(rat(a*exp(x+b))),0); [a,%e^b,%e^x] but this will then not work on expressions with divisions: (%i3) substinpart("[",dispform(rat(a*exp(x+b)/c)),0); (%o3) [a*%e^(x+b),c] Instead, I now do this: inargs(_z):=block([L:[],Q,q], /* first, get the list of main arguments*/ Q:substinpart("[",_z,0), /* then, go through the arguments once more in CRE form to see if we can split them */ for q in Q do ( if atom(q) then ( L:cons(q,L) ) else ( if (inpart(dispform(rat(q)),0)="*") then ( L: append(substinpart("[",dispform(rat(q)),0),L) ) else ( L:cons(q,L) ) ) ), L )$ (%i2) inargs(a*exp(x+2)/b); (%o2) [%e^2,%e^x,1/b,a] On Mon, 20140421 at 08:21 0700, Richard Fateman wrote: > On 4/20/2014 2:58 PM, nijso beishuizen wrote: > > Hi, > > > > I want a*exp(x+2)/b to be split into [a,1/b,exp(x),exp(2)] so I can > > collect the constant terms. > > > Is the nonconstant term always exp(x)? Why do you think you need to > split an expression that way to get the constant terms? > > > Maybe ratsubst(z,exp(x), a*exp(x+2)/b) ; helps you more than subst? > <snip> > > > but the internal representations of a/b and exp(x+2) are: > > > > ((MTIMES SIMP) $A ((MEXPT SIMP) $B 1)) > > ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X)) > > No, you can try > ?print(exp(x+2)) which shows the internal form as > > ((MEXPT SIMP) $%E ((MPLUS SIMP) 2 $X)) > 
From: Evgeniy Maevskiy <emaevskiy@e...>  20140421 20:00:11

We can separate constant multiplier in f(x): f(x) = f(0) * (f(x)/f(0)) if f(0)#0 or constant summand: f(x) = f(0) + (f(x)f(0)) For expressions a^b(x) we can subst for "^": p(a,b):=if freeof(x,a) then ( bsubst(x=0,b), ratsimp(%%), a^%% ) else a^b; subst("^"=p, expression); But... what to do with a^(b^c), a^(b^(c^d)) ? 21.04.2014 22:11, nijso beishuizen пишет: > Thanks, that's actually a good idea, but it needs a lot of filtering for > general expression input. > It might be better to search for terms of the form a^(b+c(x)) and > replace by a^(c(x)). > > > On Mon, 20140421 at 19:11 +0300, Evgeniy Maevskiy wrote: >> Maybe this, for "collect the constant terms": >> >> subst(x=0, a*exp(x+2)/b); >> >> > a*exp(2)/b >> >> ? >> >> Evgeniy >> >> 21.04.2014 0:58, nijso beishuizen пишет: >>> Hi, >>> >>> I want a*exp(x+2)/b to be split into [a,1/b,exp(x),exp(2)] so I can >>> collect the constant terms. >>> >>> (%i2) substinpart("[",a/b,0); >>> (%o2) [a,1/b] >>> (%i4) substinpart("[",exp(x+2),0); >>> (%o4) [%e,x+2] >>> >>> but the internal representations of a/b and exp(x+2) are: >>> >>> ((MTIMES SIMP) $A ((MEXPT SIMP) $B 1)) >>> ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X)) >>> >>> I guess I still don't understand exactly how substinpart works. Why is >>> substinpart not working on exp(x+2)? In both cases, "*" is the first >>> operator mentioned in the internal representation, but also inpart(exp(x >>> +2),0) says the first operator is "^". >>> >>> >>> Best, >>> Nijso 
From: Stavros Macrakis <macrakis@al...>  20140421 19:44:10

 substpart("[",xxx,0) is equivalent to args(xxx), which seems clearer as well.  You can choose whether to work in the internal representation or the external representation in part, substpart, args, op, etc., using inflag. For example, I usually define inargs(expr) := block([inflag:true],args(expr)) and inop(expr) := block([inflag:true],op(expr)).  The normal internal representation of exp(x+2) is ((MEXPT SIMP) $%E ((MPLUS SIMP) 2 $X))  how did you get ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X))? s On Sun, Apr 20, 2014 at 5:58 PM, nijso beishuizen <nijso@...> wrote: > Hi, > > I want a*exp(x+2)/b to be split into [a,1/b,exp(x),exp(2)] so I can > collect the constant terms. > > (%i2) substinpart("[",a/b,0); > (%o2) [a,1/b] > (%i4) substinpart("[",exp(x+2),0); > (%o4) [%e,x+2] > > but the internal representations of a/b and exp(x+2) are: > > ((MTIMES SIMP) $A ((MEXPT SIMP) $B 1)) > ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X)) > > I guess I still don't understand exactly how substinpart works. Why is > substinpart not working on exp(x+2)? In both cases, "*" is the first > operator mentioned in the internal representation, but also inpart(exp(x > +2),0) says the first operator is "^". > > > Best, > Nijso > > > > > >  > Learn Graph Databases  Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech > _______________________________________________ > Maximadiscuss mailing list > Maximadiscuss@... > https://lists.sourceforge.net/lists/listinfo/maximadiscuss > 
From: nijso beishuizen <nijso@ho...>  20140421 19:15:02

Thanks, that's actually a good idea, but it needs a lot of filtering for general expression input. It might be better to search for terms of the form a^(b+c(x)) and replace by a^(c(x)). On Mon, 20140421 at 19:11 +0300, Evgeniy Maevskiy wrote: > Maybe this, for "collect the constant terms": > > subst(x=0, a*exp(x+2)/b); > > > a*exp(2)/b > > ? > > Evgeniy > > 21.04.2014 0:58, nijso beishuizen пишет: > > Hi, > > > > I want a*exp(x+2)/b to be split into [a,1/b,exp(x),exp(2)] so I can > > collect the constant terms. > > > > (%i2) substinpart("[",a/b,0); > > (%o2) [a,1/b] > > (%i4) substinpart("[",exp(x+2),0); > > (%o4) [%e,x+2] > > > > but the internal representations of a/b and exp(x+2) are: > > > > ((MTIMES SIMP) $A ((MEXPT SIMP) $B 1)) > > ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X)) > > > > I guess I still don't understand exactly how substinpart works. Why is > > substinpart not working on exp(x+2)? In both cases, "*" is the first > > operator mentioned in the internal representation, but also inpart(exp(x > > +2),0) says the first operator is "^". > > > > > > Best, > > Nijso > > > > > > > > > >  > > Learn Graph Databases  Download FREE O'Reilly Book > > "Graph Databases" is the definitive new guide to graph databases and their > > applications. Written by three acclaimed leaders in the field, > > this first edition is now available. Download your free book today! > > http://p.sf.net/sfu/NeoTech > > _______________________________________________ > > Maximadiscuss mailing list > > Maximadiscuss@... > > https://lists.sourceforge.net/lists/listinfo/maximadiscuss > > > > >  > Start Your Social Network Today  Download eXo Platform > Build your Enterprise Intranet with eXo Platform Software > Java Based Open Source Intranet  Social, Extensible, Cloud Ready > Get Started Now And Turn Your Intranet Into A Collaboration Platform > http://p.sf.net/sfu/ExoPlatform > _______________________________________________ > Maximadiscuss mailing list > Maximadiscuss@... > https://lists.sourceforge.net/lists/listinfo/maximadiscuss 
From: Robert Dodier <robert.dodier@gm...>  20140421 18:10:30

On 20140421, Dimiter Prodanov <dimiterpp@...> wrote: > defrule (simftexpmod, FT (V*exp(it)), ftmodsim2 (V, exp(it), t )), > defrule (simftexpmod, IFT (V*exp(it)), iftmodsim2 (V, exp(it), f )), I see you've defined simftexpmod twice  I guess the second one wants to be simiftexpmod? After that change, I get: simftexpmod(FT(u(t)*exp(%i*t))); => [FT(u(t)), 1, [%i, exp]] Hope this helps, Robert Dodier 
From: Richard Fateman <fateman@be...>  20140421 15:21:52

On 4/20/2014 2:58 PM, nijso beishuizen wrote: > Hi, > > I want a*exp(x+2)/b to be split into [a,1/b,exp(x),exp(2)] so I can > collect the constant terms. Is the nonconstant term always exp(x)? Why do you think you need to split an expression that way to get the constant terms? Maybe ratsubst(z,exp(x), a*exp(x+2)/b) ; helps you more than subst? <snip> > but the internal representations of a/b and exp(x+2) are: > > ((MTIMES SIMP) $A ((MEXPT SIMP) $B 1)) > ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X)) No, you can try ?print(exp(x+2)) which shows the internal form as ((MEXPT SIMP) $%E ((MPLUS SIMP) 2 $X)) 
From: Evgeniy Maevskiy <emaevskiy@e...>  20140421 15:01:47

Maybe this, for "collect the constant terms": subst(x=0, a*exp(x+2)/b); > a*exp(2)/b ? Evgeniy 21.04.2014 0:58, nijso beishuizen пишет: > Hi, > > I want a*exp(x+2)/b to be split into [a,1/b,exp(x),exp(2)] so I can > collect the constant terms. > > (%i2) substinpart("[",a/b,0); > (%o2) [a,1/b] > (%i4) substinpart("[",exp(x+2),0); > (%o4) [%e,x+2] > > but the internal representations of a/b and exp(x+2) are: > > ((MTIMES SIMP) $A ((MEXPT SIMP) $B 1)) > ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X)) > > I guess I still don't understand exactly how substinpart works. Why is > substinpart not working on exp(x+2)? In both cases, "*" is the first > operator mentioned in the internal representation, but also inpart(exp(x > +2),0) says the first operator is "^". > > > Best, > Nijso > > > > >  > Learn Graph Databases  Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech > _______________________________________________ > Maximadiscuss mailing list > Maximadiscuss@... > https://lists.sourceforge.net/lists/listinfo/maximadiscuss > 
From: Evgeniy Maevskiy <emaevskiy@e...>  20140421 15:00:03

21.04.2014 0:58, nijso beishuizen пишет: > Hi, > > I want a*exp(x+2)/b to be split into [a,1/b,exp(x),exp(2)] so I can > collect the constant terms. > > (%i2) substinpart("[",a/b,0); > (%o2) [a,1/b] > (%i4) substinpart("[",exp(x+2),0); > (%o4) [%e,x+2] > > but the internal representations of a/b and exp(x+2) are: > > ((MTIMES SIMP) $A ((MEXPT SIMP) $B 1)) > ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X)) > > I guess I still don't understand exactly how substinpart works. Why is > substinpart not working on exp(x+2)? In both cases, "*" is the first > operator mentioned in the internal representation, but also inpart(exp(x > +2),0) says the first operator is "^". > > > Best, > Nijso > > > > >  > Learn Graph Databases  Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech > _______________________________________________ > Maximadiscuss mailing list > Maximadiscuss@... > https://lists.sourceforge.net/lists/listinfo/maximadiscuss > 
From: Richard Fateman <fateman@be...>  20140421 14:05:02

I haven't looked at your program in detail, but it is highly unlikely that you should be doing a matchdeclare inside a function. It should be used on the top level, and not used to declare local variables. RJF On 4/21/2014 1:54 AM, Dimiter Prodanov wrote: > Dear all, > > I am truing to implement a Fourier trnasform package in Maxima > > I came across the follwing problem. I can't make this code to work as > I expect > > ( "modulation by exp ", > matchdeclare( [t, f], atom, V, lambda([u], not atom(u)), it, complexp ), > defrule (simftexpmod, FT (V*exp(it)), ftmodsim2 (V, exp(it), t )), > defrule (simftexpmod, IFT (V*exp(it)), iftmodsim2 (V, exp(it), f )), > > ftmodsim2(V, fn, s):=opmodsimp2(V, fn, s, FT), > iftmodsim2(V, fn, s):=opmodsimp2(V, fn, s, IFT), > > opmodsimp2(V, fn, s, OP ):= block( [ %B, res ], > matchdeclare( %B , lambda([x], freeof(s, x) ), s, atom, g, > symbolp), > defmatch (opexp, exp(%B*s), s), > res: opexp(fn, s), > if (res#false) then ( > "print (%B)", > return ([OP(V), 1, [%B, exp]]) > ) > else return (OP(V*fn)) > ) > )$ > > complexp (u) := not atom(u) and not listp(u) and not freeof(%i, u)$ > > Output: > > correct: > >> ftmodsim2(u(t), exp(%i*a*t), t); > >> [FT(u(t)),1,[%i*a,exp]] > > wrong: > >> simftexpmod(FT(u(t)*exp(%i*t))); > >> false > > I had similar problems also for other rules where the solution was > either to unnecessary broaden the scope or to define global variables > with unique names and thus limit the scope artificially. > > best regards, > > Dimiter > > > > >  > Start Your Social Network Today  Download eXo Platform > Build your Enterprise Intranet with eXo Platform Software > Java Based Open Source Intranet  Social, Extensible, Cloud Ready > Get Started Now And Turn Your Intranet Into A Collaboration Platform > http://p.sf.net/sfu/ExoPlatform > > > _______________________________________________ > Maximadiscuss mailing list > Maximadiscuss@... > https://lists.sourceforge.net/lists/listinfo/maximadiscuss 
From: Dimiter Prodanov <dimiterpp@gm...>  20140421 08:54:58

Dear all, I am truing to implement a Fourier trnasform package in Maxima I came across the follwing problem. I can't make this code to work as I expect ( "modulation by exp ", matchdeclare( [t, f], atom, V, lambda([u], not atom(u)), it, complexp ), defrule (simftexpmod, FT (V*exp(it)), ftmodsim2 (V, exp(it), t )), defrule (simftexpmod, IFT (V*exp(it)), iftmodsim2 (V, exp(it), f )), ftmodsim2(V, fn, s):=opmodsimp2(V, fn, s, FT), iftmodsim2(V, fn, s):=opmodsimp2(V, fn, s, IFT), opmodsimp2(V, fn, s, OP ):= block( [ %B, res ], matchdeclare( %B , lambda([x], freeof(s, x) ), s, atom, g, symbolp), defmatch (opexp, exp(%B*s), s), res: opexp(fn, s), if (res#false) then ( "print (%B)", return ([OP(V), 1, [%B, exp]]) ) else return (OP(V*fn)) ) )$ complexp (u) := not atom(u) and not listp(u) and not freeof(%i, u)$ Output: correct: >> ftmodsim2(u(t), exp(%i*a*t), t); >> [FT(u(t)),1,[%i*a,exp]] wrong: >> simftexpmod(FT(u(t)*exp(%i*t))); >> false I had similar problems also for other rules where the solution was either to unnecessary broaden the scope or to define global variables with unique names and thus limit the scope artificially. best regards, Dimiter 
From: Helmut Jarausch <jarausch@ig...>  20140421 08:36:24

First of all, many thanks to all of you who introduced me to the secrets of Maxima (Lisp1/Common Lisp) and provided my with some really clever workarounds. From my personal experience from ALGOL68 via PL/1, Pascal to C++ and Python (my favourite), it's a bit hard to feel comfortable with Maxima  it reminds me of some struggling I have had with several assemblers. Perhaps I can contribute to Sympy (a symbolic computation module for Python) next year. Here my next chapter in my Maxima adventure. Why are the invocations of a lambda function (expression) significant slower than invocations of "plain functions". Note that the faster function Rhs below still contains invocations of the function f und g while the lambda expression has inlined these. The measurements were done on an idle machine and the quotient of the timings is absolutely reproducible. Thanks for some explanation, Helmut n:1000$ p:10$ rx:2.4E5$ rv:7.4E4$ sx:0.02$ sy:0.265$ ginf:0.01$ vg:100$ sv:0$ g(v):= 0.01*v/(v+100)$ f(v):= 20.0*v/(v+1.0)$ Rhs(t,y):= matrix([10.00.02*y[1,1]2.4E5*y[1,1]*y[3,1]+g(y[3,1])*y[1,1]], [2.4E5*y[1,1]*y[3,1]0.265*y[2,1]g(y[3,1])*y[2,1]], [1000.0*g(y[3,1])*y[2,1]+f(y[3,1])7.64E4*y[1,1]*y[3,1]])$ gen_rhs (Expr, V, X) := block([Ex:Expr,%_y:gensym()], Ex:map(lambda([E],if atom(E) then E else if op(E)="=" then lhs(E) else E),Expr), subst (makelist (V[i] = %_y[i, 1], i, 1, length (V)), Ex), buildq ([MList : makelist ([e], e, %%),t:X,_y:%_y], lambda ([t, _y], matrix (splice (MList)))))$ Expressions:[p  sx*x rx*x*v +g(v)*x, rx*x*v sy*y g(v)*y, n*g(v)*y +f(v) sv*v (rx+rv)*x*v]$ RhsGen:gen_rhs(Expressions,[x,y,v],t)$ grind(RhsGen)$ /* with g831 replaced by y this prints lambda([t,y], matrix([0.01*y[1,1]*y[3,1]/(y[3,1]+100) 2.4e5*y[1,1]*y[3,1]0.02*y[1,1]+10], [0.01*y[2,1]*y[3,1]/(y[3,1]+100)+2.4e5*y[1,1]*y[3,1]0.265*y[2,1]], [10.0*y[2,1]*y[3,1]/(y[3,1]+100) +20.0*y[3,1]/(y[3,1]+1.0)7.64e4*y[1,1]*y[3,1]]))$ */ t:0.0$ y:transpose(matrix([1000.0,0.0,1.0]))$ NCalls:50000$ Start:elapsed_real_time()$ thru NCalls do Rhs(t,y)$ Stop:elapsed_real_time()$ print(NCalls,"invocations of Rhs used ",StopStart,"seconds.")$ /* prints 4.5 seconds here */ Start=Stop$ thru NCalls do RhsGen(t,y)$ Stop:elapsed_real_time()$ print(NCalls,"invocations of Rhs used ",StopStart,"seconds.")$ /* prints 7.074 seconds here*/ 
From: Stavros Macrakis <macrakis@al...>  20140421 02:55:35

See Technical Issues of Separation in Function Cells and Value Cells<http://www.nhplace.com/kent/Papers/TechnicalIssues.html>; (often called "Lisp 1 vs. Lisp 2") by R.P. Gabriel for a discussion of the issues in Lisp. Maxima, with its "variables without values represent themselves" policy, adds another twist to the story. In short, this is not a "bug", but a design choice, and whether you are surprised by it depends on what you're familiar with.... Personally, I would support the syntax (f)(x) to indicate that the 'f' is to be evaluated. This doesn't currently work, but i(f)(x), where i(q):=q, does. s On Sun, Apr 20, 2014 at 6:07 AM, Helmut Jarausch < jarausch@...> wrote: > On 04/19/2014 09:04:06 PM, Barton Willis wrote: > > Maybe your function works perfectly. But consider: > > > > (%i1) gen_rhs(Ex,Vars)::= block([n:length(Ex),m:length(Vars)], > > Exs:subst(makelist(Vars[i]=y[i,1],i,m),Ex),print(Exs), > > MList:ev(makelist(makelist(Exs[i]),i,m)),print(MList), > > buildq([MList],lambda([t,y],matrix(splice(MList)))))$ > > > > (%i2) george : gen_rhs([sin(a+b),cos(a*b)],[a,b])$ > > [sin(y[2,1]+y[1,1]),cos(y[1,1]*y[2,1])] > > [[sin(y[2,1]+y[1,1])],[cos(y[1,1]*y[2,1])]] > > > > (%i3) george(5,z); > > (%o3) matrix([sin(z[2,1]+z[1,1])],[cos(z[1,1]*z[2,1])]) > > > > (%i4) y[2,7] : 42$ > > > > (%i5) george(5,z); > > (%o5) matrix([sin(y[2,1]+y[1,1])],[cos(y[1,1]*y[2,1])]) > > > > Are you certain this is what you want? > > > > Of course not, but I am helplessly exposed to this > sickness of Maxima. Similarly I have to call > apply(rhs,[x,y]) instead of just rhs(x,y) if rhs > comes from the parameter list of the function where this call occurs. > This means I cannot work with vectorvalued functions > except when using this ugly hack mentioned by Robert. > > In comparison to many other languages I have worked with > Maxima is just broken in this respect. > It violates the principle of least surprise. > > Since the assignment y[2,7]:42 might occur anywhere, far away > from that call george(5,z), it's very hard to debug programs > in Maxima. > > Thanks for this heads up, it's a really bad surprise. > > Perhaps, I should have a close look at Fricas and Yacas before > I continue struggling with Maxima. > > That's really sad news, > Helmut > > >  > Learn Graph Databases  Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech > _______________________________________________ > Maximadiscuss mailing list > Maximadiscuss@... > https://lists.sourceforge.net/lists/listinfo/maximadiscuss > 
From: Richard Fateman <fateman@be...>  20140420 23:28:30

I think this behavior is a natural one from the perspective of the early lisp (maclisp circa 1967) semantics on which it is based. It is unexpected in today's contexts of programming outside of lisp. Here's an explanation. When you evaluate a lisp expression (x i) then the symbol x is treated as a function and the function property of x is retrieved and applied to the value of i. For example (defun x(i) (print 'hello)) (defun g(i)(print 'goodbye)) (defun f(x i)(x i)) (f 'g 3) prints hello. (defun ff(x i)(funcall x i)) ;;; or (apply x (list i)) (ff 'g 3) prints goodbye. Now if you mix in Maxima's peculiar semantics that treats previously undefined objects x in the context x[i] differently from previously defined objects in the context x[i], you should see what is happening. Now you may argue that x[i] is an array reference not a function call. But maybe we don't know that. For sure, anyway. Is it a bug? How do you want this to work: parity[i]:= if evenp(i) then 0 else 1; foo(parity,i):= parity[i]; foo(cosine,i) do you want to call parity or cosine? current behavior calls parity. RJF On 4/20/2014 3:22 PM, Barton Willis wrote: > A simple example of the somewhat unfortunate behavior: > > (%i1) f(x,i) := x[i]$ > > OK: > > (%i2) f(z,8); > (%o2) z[8] > > (%i3) x[%pi] : 42$ > > unexpected (?): > > (%i4) f(z,8); > (%o4) x[8] > > A cure is to use localit " removes any properties before evaluating other expressions, and > restores any saved properties on exit from the block or other ..." > > (%i5) g(x,i) := (local(x), x[i])$ > (%i6) g(z,8); > (%o6) z[8] > > Our user documentation should have a stern warning against uncritical use of undeclared arrays. > If you use them because you like the they display, consider changing your preferences. One > not so great thing about undeclared arrays is that some (all?) declarations don't work: > > (%i8) declare(xx[1],integer); > declare: improper argument: xx[1] > > _______________________________________ 
From: Barton Willis <willisb@un...>  20140420 22:22:48

A simple example of the somewhat unfortunate behavior: (%i1) f(x,i) := x[i]$ OK: (%i2) f(z,8); (%o2) z[8] (%i3) x[%pi] : 42$ unexpected (?): (%i4) f(z,8); (%o4) x[8] A cure is to use localit " removes any properties before evaluating other expressions, and restores any saved properties on exit from the block or other ..." (%i5) g(x,i) := (local(x), x[i])$ (%i6) g(z,8); (%o6) z[8] Our user documentation should have a stern warning against uncritical use of undeclared arrays. If you use them because you like the they display, consider changing your preferences. One not so great thing about undeclared arrays is that some (all?) declarations don't work: (%i8) declare(xx[1],integer); declare: improper argument: xx[1] _______________________________________ 
From: nijso beishuizen <nijso@ho...>  20140420 22:01:37

Hi, I want a*exp(x+2)/b to be split into [a,1/b,exp(x),exp(2)] so I can collect the constant terms. (%i2) substinpart("[",a/b,0); (%o2) [a,1/b] (%i4) substinpart("[",exp(x+2),0); (%o4) [%e,x+2] but the internal representations of a/b and exp(x+2) are: ((MTIMES SIMP) $A ((MEXPT SIMP) $B 1)) ((MTIMES SIMP) ((MEXPT) $%E 2) ((MEXPT) $%E $X)) I guess I still don't understand exactly how substinpart works. Why is substinpart not working on exp(x+2)? In both cases, "*" is the first operator mentioned in the internal representation, but also inpart(exp(x +2),0) says the first operator is "^". Best, Nijso 
From: Robert Dodier <robert.dodier@gm...>  20140420 18:55:20

On 20140420, Leo Butler <l_butler@...> wrote: > with_gensyms(g,[body]) ::= block( > g:map(lambda([x],funmake("=",[x,gensym(printf(false,"~a_",x))])),g), > psubst(g,buildq([body:body,v:map(second,g)],block(v,splice(body))))); Along these lines, see also blex.lisp which implements a simpleminded lexical block. One would write something like: blex ([t, y], gen_rhs (foo) := ...); Then gen_rhs(foo) returns an expression containing variables named t and y but which are distinct from any other t and y. I think lexical scope is pretty much an absolute requirement for building programs which don't have unpleasant surprises ... maybe someone wants to scope out (hah) a roadmap for bringing lexical scope into Maxima. (Maybe getting rid of dynamic scope too?  just daydreaming.) best Robert Dodier PS. ;; blex.lisp  lexical block for Maxima ;; copyright 2012 by Robert Dodier ;; I release this work under terms of the GNU GPL ;; ;; examples: ;; blex ([n:100], f(x) := n : n + x, g() := display(n)); ;; blex ([f], f(x) := 2*x); ;; blex ([a], h(x) := a[x] : 1, i() := arrayinfo(a)); (defmspec $blex (x) (let* ((args (cdr x)) (vars+inits (cdr (car args))) (vars (mapcar #'(lambda (e) (if (symbolp e) e (second e))) vars+inits)) (inits (removeif #'symbolp vars+inits)) (exprs (cdr args)) (gensymvars (mapcar #'(lambda (s) (let ((s1 (gensym))) (setf (get s1 'reversealias) (or (get s 'reversealias) s)) s1)) vars)) (substeqns (mapcar #'(lambda (x y) `((mequal) ,x ,y)) vars gensymvars)) (gensymmprog ($psubstitute `((mlist) ,@ substeqns) `((mprog) ((mprogn) ,@ inits) ,@ exprs)))) (meval gensymmprog))) 
From: Thanh Xuan NGUYEN <thanhnguyen20080616@gm...>  20140420 16:33:26

Thank you, Thomas and Kris! Both your solutions (using radcan instead of fullratsimp, or declaring n as integer then still using fullratsimp) are ok. Regards, Thanh Vào 20042014 22:35, "Kris Katterjohn" <katterjohn@...> đã viết: > Hi Thanh, > > On 04/20/2014 04:39 AM, Thanh Xuan NGUYEN wrote: > > Hello, > > > > Just by chance I wrote the following codes in Maxima. And the result I > > got is different from the simple derivation by hand calculation. > > > > Here is the simplified version of my codes: > > > > (%i1)p:z*((105)*(z/2+1/2)^n+5)$ > > (%i2)integrate(p, z,1, 1); > > Is n positive or negative? positive; > > (%o2) (20*n*%e^(log(2)*n)+(5*n^2+15*n+10)*2^n)/((2*n^2+6*n+4)*2^n)5/2 > > (%i3)fullratsimp(%o2); > > (%o3) (5*n*2^(1n)*%e^(log(2)*n))/(n^2+3*n+2) > > > > Here is the result from derivation by hand calculation: > > > > (10*n)/((n+1)*(n+2)) > > > > Could you please show me the reason why this occurred like this? > > > > Notice how your %o3 contains both 2^(1n) and %e^(log(2)*n). Maxima > will automatically simplify this further if n is an integer: > > (%i2) declare(n,integer)$ > (%i3) assume(n>0)$ > (%i4) p:z*((105)*(z/2+1/2)^n+5)$ > (%i5) integrate(p,z,1,1); > (%o5) (5*n^2+35*n+10)/(2*n^2+6*n+4)5/2 > (%i6) ratsimp(%); > (%o6) 10*n/(n^2+3*n+2) > > I hope this helps. > > > Thank you! > > > > Thanh Nguyen > > > > Cheers, > Kris Katterjohn > 
From: Kris Katterjohn <katterjohn@gm...>  20140420 15:35:48

Hi Thanh, On 04/20/2014 04:39 AM, Thanh Xuan NGUYEN wrote: > Hello, > > Just by chance I wrote the following codes in Maxima. And the result I > got is different from the simple derivation by hand calculation. > > Here is the simplified version of my codes: > > (%i1)p:z*((105)*(z/2+1/2)^n+5)$ > (%i2)integrate(p, z,1, 1); > Is n positive or negative? positive; > (%o2) (20*n*%e^(log(2)*n)+(5*n^2+15*n+10)*2^n)/((2*n^2+6*n+4)*2^n)5/2 > (%i3)fullratsimp(%o2); > (%o3) (5*n*2^(1n)*%e^(log(2)*n))/(n^2+3*n+2) > > Here is the result from derivation by hand calculation: > > (10*n)/((n+1)*(n+2)) > > Could you please show me the reason why this occurred like this? > Notice how your %o3 contains both 2^(1n) and %e^(log(2)*n). Maxima will automatically simplify this further if n is an integer: (%i2) declare(n,integer)$ (%i3) assume(n>0)$ (%i4) p:z*((105)*(z/2+1/2)^n+5)$ (%i5) integrate(p,z,1,1); (%o5) (5*n^2+35*n+10)/(2*n^2+6*n+4)5/2 (%i6) ratsimp(%); (%o6) 10*n/(n^2+3*n+2) I hope this helps. > Thank you! > > Thanh Nguyen > Cheers, Kris Katterjohn 
From: Richard Fateman <fateman@be...>  20140420 15:34:39

Helmut: 1. Most computer algebra systems make some compromises in terms of clean semantics because most computer algebra systems USERS expect results that are, under closer examination, contradictory. This is a consequence of symbols like x,y,z sometimes representing themselves as indeterminates, and sometimes representing the names of storage locations for values. Sometimes the meaning varies during a computation, and sometimes names simultaneously are used in both respects by "quoting" or "evaluating". 2. If you want cleaner semantics, don't use ev. 3. If you want even cleaner semantics, use Lisp. Your program would be cleaner and probably about 20% longer if you wrote it in Lisp. 4. Sometimes it is easier to change your mind instead of changing the program. I don't know about this particular case, but sometimes users have difficulty because they want some program to do exactly what they have in mind, not something the programmer had in mind. This is not particular to Maxima, but is common in other systems. For example, I sometimes want to do something using Windows (or Mac OS/X) and discover that what I want to do would take a huge effort  weeks of study, pages of code. Say, make something happen when I simultaneously talk into a microphone and write with a stylus on a pad. Yet if I do them in sequence, it takes 4 lines of some language (e.g. javascript or visual basic). For Maxima, sometimes people want a display that is precisely what they might see on paper. Not close, but exact. How much effort is that worth and whose effort... RJf On 4/20/2014 8:20 AM, Leo Butler wrote: > Helmut Jarausch <jarausch@...> writes: > >> On 04/19/2014 09:04:06 PM, Barton Willis wrote: >>> Maybe your function works perfectly. But consider: >>> >>> (%i1) gen_rhs(Ex,Vars)::= block([n:length(Ex),m:length(Vars)], >>> Exs:subst(makelist(Vars[i]=y[i,1],i,m),Ex),print(Exs), >>> MList:ev(makelist(makelist(Exs[i]),i,m)),print(MList), >>> buildq([MList],lambda([t,y],matrix(splice(MList)))))$ >>> >>> (%i2) george : gen_rhs([sin(a+b),cos(a*b)],[a,b])$ >>> [sin(y[2,1]+y[1,1]),cos(y[1,1]*y[2,1])] >>> [[sin(y[2,1]+y[1,1])],[cos(y[1,1]*y[2,1])]] >>> >>> (%i3) george(5,z); >>> (%o3) matrix([sin(z[2,1]+z[1,1])],[cos(z[1,1]*z[2,1])]) >>> >>> (%i4) y[2,7] : 42$ >>> >>> (%i5) george(5,z); >>> (%o5) matrix([sin(y[2,1]+y[1,1])],[cos(y[1,1]*y[2,1])]) >>> >>> Are you certain this is what you want? >>> >> Of course not, but I am helplessly exposed to this >> sickness of Maxima. Similarly I have to call >> apply(rhs,[x,y]) instead of just rhs(x,y) if rhs >> comes from the parameter list of the function where this call occurs. >> This means I cannot work with vectorvalued functions >> except when using this ugly hack mentioned by Robert. > How about > > with_gensyms(g,[body]) ::= block( > g:map(lambda([x],funmake("=",[x,gensym(printf(false,"~a_",x))])),g), > psubst(g,buildq([body:body,v:map(second,g)],block(v,splice(body))))); > > gen_rhs(Ex,Vars)::=block([n:length(Ex),m:length(Vars)], > with_gensyms([t,y], > Exs:subst(makelist(Vars[i]=y[i,1],i,m),Ex),print(Exs), > MList:ev(makelist(makelist(Exs[i]),i,m)),print(MList), > buildq([MList],lambda([t,y],matrix(splice(MList))))))$ > > ? > > Leo > >> In comparison to many other languages I have worked with >> Maxima is just broken in this respect. >> It violates the principle of least surprise. >> >> Since the assignment y[2,7]:42 might occur anywhere, far away >> from that call george(5,z), it's very hard to debug programs >> in Maxima. > I think with_gensyms removes that surprise. > >> Thanks for this heads up, it's a really bad surprise. >> >> Perhaps, I should have a close look at Fricas and Yacas before >> I continue struggling with Maxima. >> >> That's really sad news, >> Helmut >> >>  >> Learn Graph Databases  Download FREE O'Reilly Book >> "Graph Databases" is the definitive new guide to graph databases and their >> applications. Written by three acclaimed leaders in the field, >> this first edition is now available. Download your free book today! >> http://p.sf.net/sfu/NeoTech 
From: Thomas D. Dean <tomdean@wa...>  20140420 15:28:59

On 04/20/14 02:39, Thanh Xuan NGUYEN wrote: > Hello, > > Just by chance I wrote the following codes in Maxima. And the result I > got is different from the simple derivation by hand calculation. > > Here is the simplified version of my codes: > > (%i1)p:z*((105)*(z/2+1/2)^n+5)$ > (%i2)integrate(p, z,1, 1); > Is n positive or negative? positive; > (%o2) (20*n*%e^(log(2)*n)+(5*n^2+15*n+10)*2^n)/((2*n^2+6*n+4)*2^n)5/2 > (%i3)fullratsimp(%o2); > (%o3) (5*n*2^(1n)*%e^(log(2)*n))/(n^2+3*n+2) (%i1) p:z*((105)*(z/2+1/2)^n+5)$ (%i2) assume(n>0); (%o2) [n > 0] (%i3) integrate(p,z,1,1); (%o3) (20*n*%e^(log(2)*n)+(5*n^2+15*n+10)*2^n)/((2*n^2+6*n+4)*2^n) 5*n^2/(2*n^2+6*n+4)15*n/(2*n^2+6*n+4)5/(n^2+3*n+2) (%i4) radcan(%); (%o4) 10*n/(n^2+3*n+2) Tom Dean 
From: Leo Butler <l_butler@us...>  20140420 15:21:00

Helmut Jarausch <jarausch@...> writes: > On 04/19/2014 09:04:06 PM, Barton Willis wrote: >> Maybe your function works perfectly. But consider: >> >> (%i1) gen_rhs(Ex,Vars)::= block([n:length(Ex),m:length(Vars)], >> Exs:subst(makelist(Vars[i]=y[i,1],i,m),Ex),print(Exs), >> MList:ev(makelist(makelist(Exs[i]),i,m)),print(MList), >> buildq([MList],lambda([t,y],matrix(splice(MList)))))$ >> >> (%i2) george : gen_rhs([sin(a+b),cos(a*b)],[a,b])$ >> [sin(y[2,1]+y[1,1]),cos(y[1,1]*y[2,1])] >> [[sin(y[2,1]+y[1,1])],[cos(y[1,1]*y[2,1])]] >> >> (%i3) george(5,z); >> (%o3) matrix([sin(z[2,1]+z[1,1])],[cos(z[1,1]*z[2,1])]) >> >> (%i4) y[2,7] : 42$ >> >> (%i5) george(5,z); >> (%o5) matrix([sin(y[2,1]+y[1,1])],[cos(y[1,1]*y[2,1])]) >> >> Are you certain this is what you want? >> > > Of course not, but I am helplessly exposed to this > sickness of Maxima. Similarly I have to call > apply(rhs,[x,y]) instead of just rhs(x,y) if rhs > comes from the parameter list of the function where this call occurs. > This means I cannot work with vectorvalued functions > except when using this ugly hack mentioned by Robert. How about with_gensyms(g,[body]) ::= block( g:map(lambda([x],funmake("=",[x,gensym(printf(false,"~a_",x))])),g), psubst(g,buildq([body:body,v:map(second,g)],block(v,splice(body))))); gen_rhs(Ex,Vars)::=block([n:length(Ex),m:length(Vars)], with_gensyms([t,y], Exs:subst(makelist(Vars[i]=y[i,1],i,m),Ex),print(Exs), MList:ev(makelist(makelist(Exs[i]),i,m)),print(MList), buildq([MList],lambda([t,y],matrix(splice(MList))))))$ ? Leo > > In comparison to many other languages I have worked with > Maxima is just broken in this respect. > It violates the principle of least surprise. > > Since the assignment y[2,7]:42 might occur anywhere, far away > from that call george(5,z), it's very hard to debug programs > in Maxima. I think with_gensyms removes that surprise. > > Thanks for this heads up, it's a really bad surprise. > > Perhaps, I should have a close look at Fricas and Yacas before > I continue struggling with Maxima. > > That's really sad news, > Helmut > >  > Learn Graph Databases  Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech  Leo Butler <l_butler@...> SDF Public Access UNIX System  http://sdf.lonestar.org 
From: Panagiotis Papasotiriou <p.papasot@gm...>  20140420 13:53:44

The best way to deal with stiff ODEs would be a multistep method able to switch between nonstiff and stiff ODE solvers automatically. As already mentioned by others here, ODEPACK <http://www.netlib.org/odepack>; is probably the way to go. It is actually the best package for that purpose, to the best of my knowledge. ODEPACK's solver named LSODAR (and its double precision variant, DLSODAR) is not only able to switch between "stiff" and "nonstiff" mode automatically, but also has builtin root finding capabilities: the user can optionally supply a set of constraint functions (involving both dependent and independent variables), and (D)LSODAR will stop integration whenever a root of such a constraint function is found. This feature is very useful when the integration domain is not known in advance. As a Fortran programmer, I used DLSODAR a lot, and I have yet to see it failing solving a initialvalue problem. Packages like Scilab or the R language use ODEPACK internally to solve initialvalue problems, and I have reasons to believe commercial packages like Matlab or NAG libraries do the same (the few functions I had access to, used in such commercial products, were actually open source routines renamed, verified by comparing them with code found in netlib.org.) Based on the above, I believe that being able to do use DLSODAR in Maxima would be the best way to deal with both stiff and nonstiff ODEs within Maxima. I don't expect it to be as fast as using a native executable, but I do expect the same robustness. DLSODAR, together with its (stripped) ODEPACK and SLATEC dependencies, is more than 4500 lines of code, but in my opinion it is well worth the effort. Besides, I' have read here that ODEPACK is already translated somehow to Lispreadable code. Although both my editor and CAS of choice (Emacs and Maxima) are written in Lisp, I am not familiar with that language, sadly. The few times I gave it a try, I ended up thinking "why should I do it that way when I could use Fortran 95/2003 instead?" (plus Emacs' Lisp mode, "Slime", never worked well in my system.) Thus I am not able to provide any help in the Lisp domain, but I am able to provide a Maxima interface function to DLSODAR. ODEPACK itself is written in old Fortran 77 spaghetti code (full of GOTOs,) but I've already written a Fortran 95 interface<https://sites.google.com/site/pjpapasot/fortran/libraries/dlsodar_f95>to DLSODAR, which provides all the original functionality but automatically sets most of DLSODAR's many arguments, and in general makes things easier. In general, translating that interface to Maxima for easy use doesn't seem to be that hard, provided a Maximareadable version of ODEPACK does exist. 20140417 23:39 GMT+03:00 Edwin Woollett <woollett@...>: > On April 16, 2014, Helmut Jarausch wrote: > > > On 04/09/2014 10:28:11 PM, Edwin Woollett wrote: > >> > >> feature request: stiff o.d.e. solvers for initial value problems > >> in Maxima. > > > To teach myself coding in Maxima, I have translated a code which I have > > written in Scilab/Matlab > > for teaching purposes several years, ago. > > > It's an extrapolated, linearlyimplicit Euler method. I have written a > > simplified version > > of Ernst Hairer's SEulex FORTRAN code. > > > It features variable step size, variable order and dense output. > > It can switch from explicit to implict and vice versa, but not > > automatically. > > It can solve DAEs of index 1, as well. > > > The code seems to work, though a bit slow. > > > I appreciate any comments, > > > See the examples and the core code at > > > http://www.igpm.rwthaachen.de/jarausch/Maxima > >  > > This code needs a userfriendly interface which has default values > for the many options. > > The user should be able to get back a solution list (as in rk or rkf45) > after providing the same kinds of input rkf45 needs to start work. > > In other words, for 1 o.d.e. > > eulix(dydt, y, y0, [t, t0, tf]) > > and for 2 o.d.e.s, > > eulix([dy1dt, dy2dt], [y1,y2],[y10,y20], [t, t0, tf]) > > So your "mass matrix" would automatically be a unit matrix, and the user > should not be concerned with matrices. > > As far as setting defaults for optional args, > see the code for rkf45 which uses assoc. > for example: >  > /* Set optional arguments */ > atol:assoc('absolute_tolerance,options,1e6), > save_steps:assoc('full_solution,options,true), > maxit:assoc('max_iterations,options,10000), > show_report:assoc('report,options,false), > > etc, etc. >  > Express your solved examples in ordinary language, such as > solve dy/dt = t*y, with y(0) = 2, over range [t,0,5], so the > file reader does not have to trace through your code to > understand how to use it. > > Start with the simplest goal of getting the code to work > without bells and whistles at first. Try to let Maxima > do any hard matrix work with core matrix methods > rather than translating fortran matrix routines. > > Consider breaking up the program into smaller chunks which > can be separately debugged. > > Thanks for your efforts on this project. > > Ted Woollett > > > > > > >  > Learn Graph Databases  Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech > _______________________________________________ > Maximadiscuss mailing list > Maximadiscuss@... > https://lists.sourceforge.net/lists/listinfo/maximadiscuss > 