Applications, Examples and Libraries

Share your work here
We are pleased to announce that the winner of the monthly Maple Mentors Award for February is Joe Riel. Joe will receive a prize of his choice to thank him for his involvement with the MaplePrimes community.

Congratulations!!

There have been a few posts on mapleprimes about numerically solving systems of procedures. The latest one, up until now, was this.

Here's some code to implement the method. Since the algorithm is basically very simple, I've added a few bells and whistles as optional arguments.

The essence of it is as follows. The number of procedures must match the number of parameters of each and every procedure. It does maxtries attempts at choosing a random point, and then does at most maxiter iterations. A solution is only accepted if the norm of the last change in vector (point) x is less than xtol, and if the forward error norm(F(x)) is less than ftol. The jacobian of F may be supplied optionally as a Matrix of procedures, or a method for computing the jacobian may be supplied. The methods are fdiff which only uses Maple's numerical differentiation routine fdiff, or hybrid which attempts symbolic differentiation via Maple's D[] operator and then falls back to fdiff via the nifty evalf@D equivalence.

I have not profiled it, though I have attempted to set up the jacobian construction so that it re-uses the same rtable for each instantiation. I have not gone really low-level with the external-calling to numeric solvers. I have not tried to leverage fast hardware double-precision solutions as jumping-off points for extended precision polishing (eg. see here).

I've added some examples, after the code below. Feel free to comment or mention bugs. I'd really like a better name for it.

 

 

restart:

NRprocs:=proc(

  funlist::{list(procedure),Vector(procedure)}

, {allowcomplex::truefalse:=false}

, {initialpoint::Vector:=NoUserValue}

, {maxtries::posint:=NoUserValue}

, {maxiter::posint:=30}

, {xtol::realcons:=5.0*10^(-Digits)}

, {ftol::realcons:=1.0*10^(-trunc(2*Digits/3))}

, {method::{identical(hybrid,fdiff)}:=':-hybrid'}

, {jacobian::{Matrix({operator,procedure}),identical(NoUserValue)}:=':-NoUserValue'}

, $

)

local a, b, currXseq, dummy, dummyseq, F, i, ii, J, j, jj,

      MaxTries, numvars, oldX, thisJ, thistry, varnumset, X;

 

  varnumset := {seq(`if`(not(member('call_external',{op(3,eval(F))})),
                         nops([op(1,eval(F))]),NULL), F in funlist)};

  if nops(varnumset) > 1 then

    error "expecting procedure all taking same number of arguments";

  elif nops(varnumset) = 1 then

    numvars := varnumset[1];

  else

    numvars := nops(funlist);

  end if;

 

  if numvars <> nops(funlist) then

    error "number of procedures %1 does not match number of their parameters %2"

, nops(funlist), numvars;

  end if;

 

  if initialpoint <> 'NoUserValue' then

    oldX := Vector(numvars,(i)->evalf(initialpoint[i]),':-storage'=':-rectangular',

                   ':-datatype'=`if`(allowcomplex,'complex'(':-float'),':-float'));

    if maxtries = ':-NoUserValue' then

      MaxTries := 1;

    elif maxtries > 1 then

      error "maxtries must be 1 when initialpoint is supplied";

    else

      MaxTries := maxtries;

    end if;

  else

    if maxtries = ':-NoUserValue' then

      MaxTries := 20;

    else

      MaxTries := maxtries;

    end if;

  end if;

 

  if jacobian = ':-NoUserValue' then

    # This is only built once, so there should be a way to make

    # it take a little more time and make a J that evaluates quicker.

    # Using evalhf is just one possibility.

    dummyseq:=seq(dummy[i],i=1..numvars);

    if method=':-hybrid' then

      J:=Matrix(nops(funlist),numvars,

              (i,j)->unapply('evalf'(D[j](funlist[i])(dummyseq)),[dummyseq]));

    else # method=fdiff

      J:=Matrix(nops(funlist),numvars,

              (i,j)->unapply(fdiff(funlist[i],[j],[dummyseq]),[dummyseq]));

    end if;

  else

    J:=jacobian;

  end if;

  thisJ := Matrix(nops(funlist),numvars,

                  ':-datatype'=`if`(allowcomplex,'complex'(':-float'),':-float'));

                                                                                

  X := Vector(numvars,':-datatype'=`if`(allowcomplex,'complex'(':-float'),':-float'));

 

  userinfo(1,'NRprocs',`maximal number of tries is `, MaxTries);

  for thistry from 1 to MaxTries do

 

    if thistry > 1 or initialpoint = ':-NoUserValue' then

      if allowcomplex = true then

        oldX := LinearAlgebra:-RandomVector(numvars,

                              ':-density'=1,':-generator'=-1.0-1.0*I..1.0+1.0*I,

                              ':-outputoptions'=[':-datatype'='complex'(':-float')]);

      else

        oldX := LinearAlgebra:-RandomVector(numvars,

                              ':-density'=1,':-generator'=-1.0..1.0,

                              ':-outputoptions'=[':-datatype'=':-float']);

      end if;

    end if;

 

    userinfo(1,'NRprocs',`initial point : `, convert(oldX,list));

    userinfo(1,'NRprocs',`maximal number of iterations is `, maxiter);

    try

      for ii from 1 to maxiter do

        currXseq:=seq(oldX[jj],jj=1..numvars);

        for i from 1 to nops(funlist) do

          for j from 1 to numvars do

            thisJ[i,j] := J[i,j](currXseq);

          end do;

        end do;

        # copy oldX into X, so that increment can be added to X inplace.

        ArrayTools:-Copy(numvars,oldX,0,1,X,0,1);

        LinearAlgebra:-LA_Main:-VectorAdd(

               X, LinearAlgebra:-LA_Main:-LinearSolve(

                   thisJ,

                   Vector(nops(funlist),

                     (i)->evalf(funlist[i](currXseq))),

                   ':-method'=':-none',':-free'=':-NoUserValue',':-conjugate'=true,

                   ':-inplace'=false,':-outputoptions'=[],':-methodoptions'=[]),

               1,-1,':-inplace'=true,':-outputoptions'=[]);

        userinfo(2,'NRprocs',`at iteration`,ii, convert(X,list));

        if LinearAlgebra:-LA_Main:-Norm(

             # oldX is no longer needed, so can overwrite it inplace.

             LinearAlgebra:-LA_Main:-VectorAdd(

               oldX,X,-1,1,':-inplace'=true,':-outputoptions'=[]),

             infinity,':-conjugate'=true) < xtol

         and max(seq(abs(F(seq(X[jj],jj=1..numvars))),F in funlist)) < ftol then

          return X;

        end if;

        ArrayTools:-Copy(numvars,X,0,1,oldX,0,1);

      end do:

    catch "singular matrix","inconsistent system","unable to store":

      ii := ii - 1;

      next;

    end try;

  end do;

  return 'procname'(args);

end proc:

f:=proc(x,y) x^3-sin(y); end proc:

g:=proc(x,y)

local sol;

  sol:=fsolve(q^5+x*q^2+y*q=0,q,complex):

  Re(sol[1]+1);

end proc:

                                                                                

fl:=[f,g]:

NRprocs(fl);

Vector[column]([[-.897503424482696], [3.94965547519010]])

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

HFloat(8.881784197001252e-16)

 

Digits:=32:

NRprocs(fl);

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

Digits:=10:

Vector[column]([[-.89750342448269837150872333768519], [3.9496554751901143338368997374538]])

0.1e-31

 

infolevel[NRprocs]:=1:

sol := NRprocs([f,g],initialpoint=<5.0, 6.0>);

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

infolevel[NRprocs]:=0:

NRprocs: maximal number of tries is  1
NRprocs: initial point :  [HFloat(5.0) HFloat(6.0)]
NRprocs: maximal number of iterations is  30

sol := Vector(2, {(1) = -.8975034244826993, (2) = 3.9496554751901174}, datatype = float[8])

HFloat(4.440892098500626e-16)

 

infolevel[NRprocs]:=2:

sol := NRprocs(fl,initialpoint=<-1, -2>);

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

infolevel[NRprocs]:=0:

NRprocs: maximal number of tries is  1

NRprocs: initial point :  [HFloat(-1.0) HFloat(-2.0)]
NRprocs: maximal number of iterations is  30
NRprocs: at iteration 1 [HFloat(-0.973448865779436) HFloat(-1.973448865779436)]
NRprocs: at iteration 2 [HFloat(-0.9727013515968866) HFloat(-1.9727013515968865)]
NRprocs: at iteration 3 [HFloat(-0.9727007668592758) HFloat(-1.9727007668592722)]
NRprocs: at iteration 4 [HFloat(-0.9727007668589176) HFloat(-1.972700766858918)]

sol := Vector(2, {(1) = -.9727007668589176, (2) = -1.972700766858918}, datatype = float[8])

HFloat(1.1102230246251565e-16)

sol := NRprocs(fl);

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

sol := Vector(2, {(1) = -.9727007668589175, (2) = -1.9727007668589187}, datatype = float[8])

HFloat(6.661338147750939e-16)

sol := NRprocs(fl,ftol=1e-8);

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

sol := Vector(2, {(1) = -.8975034244826969, (2) = 3.9496554751901094}, datatype = float[8])

HFloat(3.3306690738754696e-16)

sol := NRprocs(fl,initialpoint=<-I,I>,allowcomplex=true);

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

sol := Vector(2, {(1) = -.13507476585608832-.9226174570773964*I, (2) = 2.865935679636024-.7040591486912059*I}, datatype = complex[8])

HFloat(2.268185639309195e-12)

sol := NRprocs(fl,allowcomplex=true);

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

sol := Vector(2, {(1) = .3864813801943507-.6844281432614738*I, (2) = -.5067551915310455+0.15920328832212956e-1*I}, datatype = complex[8])

HFloat(8.281264562981505e-12)

# deliberate errors
NRprocs([f,g,(a,b)->a+b]);

NRprocs([(a,b,c)->a*b*c]);

Error, (in NRprocs) number of procedures 3 does not match number of their parameters 2

Error, (in NRprocs) number of procedures 1 does not match number of their parameters 3

fl:=[x->cos(x)-x]:

CodeTools:-Usage( NRprocs(fl) );

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

memory used=372.34KiB, alloc change=0 bytes, cpu time=15.00ms, real time=7.00ms, gc time=0ns

Vector[column]([[.739085133215161]])

HFloat(0.0)

fl:=[(x,y,z)->x*z+2*y^2-sqrt(z),(x,y,z)->z+x*y,(x,y,z)->x^3+y*z]:

CodeTools:-Usage( NRprocs(fl) );

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

memory used=3.28MiB, alloc change=0 bytes, cpu time=63.00ms, real time=66.00ms, gc time=0ns

Vector[column]([[.414213562373095], [-.414213562373095], [.171572875253810]])

HFloat(1.1102230246251565e-16)

jfl:=Matrix(3,3,(i,j)->D[j](fl[i])):

CodeTools:-Usage( NRprocs(fl,jacobian=jfl) );

if type(%,Vector) then

  max(seq(abs(fl[i](seq(%[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

memory used=0.64MiB, alloc change=0 bytes, cpu time=15.00ms, real time=13.00ms, gc time=0ns

Vector[column]([[.414213562373095], [-.414213562373095], [.171572875253810]])

HFloat(5.551115123125783e-17)

fl:=[proc(x::float,y::float,z::float) x*z+1.9*y^2-z^2; end proc,

     proc(x::float,y::float,z::float) z+0.9*x*y; end proc,

     proc(x::float,y::float,z::float) x^3+0.9*y*z; end proc]:

st,ba,bu:=time(),kernelopts(bytesalloc),kernelopts(bytesused):

jfl:=Matrix(3,3,(i,j)->D[j](fl[i])):

sol:=CodeTools:-Usage( NRprocs(fl,jacobian=jfl,maxtries=50) );

if type(sol,Vector) then

  max(seq(abs(fl[i](seq(sol[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

memory used=9.20MiB, alloc change=0 bytes, cpu time=187.00ms, real time=182.00ms, gc time=0ns

sol := Vector(3, {(1) = 2.1111111111111107, (2) = -2.3456790123456783, (3) = 4.4567901234567895}, datatype = float[8])

HFloat(3.552713678800501e-15)

fl:=[proc(x::float,y::float,z::float) x*z+1.8*y^2-z^2; end proc,

     proc(x::float,y::float,z::float) z+0.8*x*y; end proc,

     proc(x::float,y::float,z::float) x^3+0.8*y*z; end proc]:

jfl:=Matrix(3,3,(i,j)->D[j](fl[i])):

cfl:=[seq(Compiler:-Compile(fl[i]),i=1..nops(fl))]:

cjfl:=map(t->`if`(type(t,procedure),Compiler:-Compile(t),t),jfl):

sol:=CodeTools:-Usage( NRprocs(cfl,jacobian=cjfl) );

if type(sol,Vector) then

  max(seq(abs(fl[i](seq(sol[j],j=1..nops(fl)))),i=1..nops(fl)));

end if;

memory used=41.43MiB, alloc change=0 bytes, cpu time=920.00ms, real time=884.00ms, gc time=78.00ms

sol := Vector(3, {(1) = -1.2499999999999998, (2) = 1.5624999999999998, (3) = 1.5624999999999996}, datatype = float[8])

HFloat(4.440892098500626e-16)

NRprocs([f,g],method=hybrid);

Vector[column]([[-.972700766858918], [-1.97270076685891]])

[f, g](seq(a, a=%)); # check whether it's a root

[HFloat(0.0), HFloat(7.771561172376096e-16)]

NRprocs([f,g],method=fdiff);

Vector[column]([[-.972700766858918], [-1.97270076685892]])

[f, g](seq(a, a=%)); # check whether it's a root

[HFloat(-1.1102230246251565e-16), HFloat(0.0)]

 

 

Download fsolve_procs.mw

acer



This forum question led to a discussion of a bitwise magazine review that compared Mathematica 5.2 and Maple 10. In that review the author struggled to get the following numeric integral to compute accurately and quickly in Maple.

evalf(Int(BesselJ(0, 50001*x)*x*exp(I*(355*x^2*1/2)), x = .35 .. 1));

Below, I reproduce an attempt at computing an accurate result quickly in Maple. I'm copying it here because that thread got quite long and messy.

What is the following equation about?

(a+b^n)/n = x

It has too many unknowns.  There seem to be too many trivial solutions: a=b=n=1, x=2 or a=1, b=2, n=3, x=3 or a=2, b=2, n=2, x=3 and on and on.  Why would anyone think that this has anything to do with the existance of God?

The following is from en.wikipedia.org/wiki/Leonhard_Euler

There is a famous anecdote inspired by Euler's...

A long-time member of mapleprimes, Gerald A. Edgar has recently posted a wonderful paper, "Transseries for beginners" up on the arXiv.  It is elementary[1], but not easy, and written in a very engaging style.  For those interested in the mathematics used in some of the darker corners of Maple, this is a great introduction.

In Math Mode in a Maple worksheet, how do I type something such as L := [1, 2, "abc", "a", 7.0, infinity]; for x in L do if type(x, 'string') then print(x); break end if end do on multiple lines? Also, please show me in the online Help menu the explanation for how one makes such line breaks without setting off execution. I got Maple last August. I have searched the online Help menu for any mention of a line break but have not found it. Thank you.
We are pleased to announce the winner of the monthly Maple Mentors Awards for December. The winner for December is Acer. Acer will receive a prize of his choice to thank him for his involvement with the MaplePrimes community. Congratulations and keep up the good work!!
a bus travels 200 km at a constant speed. a car travelling 10 km/h faster than the bus, completes the same distance in 1 hour less than the bus. (1) how many hours does the bus take to travel the 200 km? (2) what is the speed of the car?
The following is the code for the 2nd Fick's law with initial/boundary conditions. Unfortunately this code does not show me the result required for next process. It would be useful for us to proceed this work. Thanks in advance. ( Currently we are using Maple 10.) > restart; > DiffusionCoefficientST := 0.5e-2; > ExperienceConstant := 5; > Temperature := 273+25; > PDE := diff(C(x, t), t) = > DiffusionCoefficientST*(exp(1))(-ExperienceConstant(1/Temperature-1/296))*(­diff(C(x, > t), x, x)); > IBCondition := {C(x, 0) = 2, C(0, t) = 0, ((D[1])(C))(5, t) = 0}; > pds := pdsolve(
I hope someone can shed so light on the following: I upgraded to SuSE10.3 -32bit recently and everything seemed to go well. Maple 11.01 was installed and has worked fine until now. Today was the first time I tried to print a file and 'Lo and Behold. There is no print function at all! Whenever 'Print' or 'Page Setup' is clicked there is a brief moment of 'wait' cursor and then nothing happens. No dialog box, no warnings just silence. I did a search for similar issues on Google but came up empty. I've checked the CUPS config file for the Linux fix regarding Sockets, that made no difference, I checked the installation of CUPS and it seems fine, indeed, every other application prints fine. By the end of the day I resorted to reinstalling Maple and that didn't make any difference either. I'm at a loss. Anyone using SuSE and Maple 11.01 care to comment?
Hi, I have a small problem. I want to export code to Matlab. The code is mostly a long expression with some named constants. The constants are set to some values in Maple and in Maple only the x-variables are therefore unknown in the expression. However, in the exported code, some of the constants are not replaced by their values. Does someone have a clue what this depends on? Best regards Johan
Hi again, Long time, no post but thats not an indicator of not stopping by and reading nearly every day. Now I'm looking for some advice on a bug. I'm going to be sending this MapleSoft too but I thought perhaps someone here may have some insight to its solution. Thank, Tim Bug on SuSE 10.3 I'm unable to run Maple 11 with the Java interface since upgrading to SuSE 10.3 Here are the errors messages: tim@linux-g0yu:~/maple11/bin> ./xmaple java: xcb_xlib.c:52: xcb_xlib_unlock: Assertion `c->xlib.lock' failed. /home/tim/maple11/bin/maple: line 446: 1881 Aborted '/home/tim/maple11/jre.IBM_INTEL_LINUX/bin/java' -Xmx400m -cp '/home/tim/maple11/java/xercesImpl.jar:/home/tim/maple11/java/xmlParserAPIs.jar
I thought this might be of interest to anyone interested in seeing some simple ciphers broken with maple. Download 6039_huffaf_crack.mws
View file details
Does anyone know how to solve this equation 49x + 24y + 37z = 3778171
First 72 73 74 75 76 77 Page 74 of 77