Mac Dude

1561 Reputation

17 Badges

12 years, 268 days

MaplePrimes Activity

These are answers submitted by Mac Dude

Consider putting the whole Module with all its procs etc. into a text file with extension .mpl. Add "option package" to the module.

You can then make a package suitable for loading using with(); by doindg the following in a small Maple worksheet:

read("/Applications/Math_Calc/Maple 2015/Packages/Lattice/Lattice4.mpl"); # this is one of mine; put your above .mpl file in here with the full path.

LibraryTools:-Save(Lattice,cat(libname[1],"/Lattice.mla")); # Replace the first "Lattice" with your module name and name the .mla file what you want.

For this to work pre-pend libname with the directory where you want your package to reside. I do that in the startup file for Maple. You do need to preserve what is already in libname else Maple can't find its own modules anymore.

I use Emacs with Joe Riel's maplev mode to edit the .mpl file. Much more convenient than editing in Maple. To update the .mla file just run the small worksheet I suggested above.


You already have answers, but since with earlier versions of Maple I ran into exactly the same issue as you did, here is how I used to do it. I did find out later, though, that the Mersenne twister used is rather slow.

(* Procedure Frand(rnge)
   Returns a random float uniformly distributed across range.
   Parameters:   rnge  xmin..xmax the interval
  if (type(rnge,'range')) then
  end if

  end proc;




Preben already answered the basic question how Maple keeps track of local variables: by their address. Other than that, the x are in fact indistinguishable. Except that, if you e.g. try to subs(x=<something>,...) the subs will silently fail and not do anything visible. Made me tear my hair out when I first ran into this situation (due to an unrelated mistake).

The reason why this happens is that you returned an unassigned local variable, which just returns the variable itself. It isn't quite clear to me why you would want to do that, but of course there maybe perfectly valid reasons I just haven't encountered yet. The fact that you cannot do anything with this variable makes some sense: it is procedure-local and not supposed to be visible outside of the proc, much less changeable. It is a bit confusing, however, as no distinction is made.

But what if you actually want to get access to the x? One way to achieve that is to wrap the whole proc in a module and then have x be an export of the module. Like this:

export x,foo;
   #local x; # turn this off
end proc;
end module;

Run the proc (I use the long form here):

                            x := 99

and you can access both xes:


If you load module bar using with(bar) [you may need to use option package to do this] then x will implicitly refer to bar:-x and you need to say :-x to get at the x you assigned 99 to [assuming you assign to x first and then use with(bar)]. In this case you have created a new namespace (bar:-) that can be used to keep variables apart.

Finally, in this case repeated calls to foo will not create new instances of x, naturally, as x belongs to module bar. If you want to create several instances of bar you need to use the copy() function; if you assign bar to two different variables you just get two pointers to the same instance.

Obviously now we are on our way to do "OOP lite" in Maple, a feature introduced in Maple 15 that I quite like and use often in my larger packages.

Thanks for the question/post; it exposed an interesting peculiaroty of Maple.


@Adam Ledger  I am not sure I fully understand your approach, but I sure have experienced sluggish execution of programs in Maple. ROT13 is a simple algorithm and should not be sluggish. I'd be tempted to implement ROT13 in a table lookup; tables are Maple's associative arrays so you ca use each letter as an index into the table that has the shifted letters. That kind of lookup is quite fast.

If you do numerics, a few hints that may help the situation: First, Maple has the propensity to build huge algebraic expressions if it encounters variables ("names") that are unassigned. The way to detect and/or prevent that is to use evalf often and in case of arrays or vectors to make sure they are declared with "datatype=hfloat". Then, if what is assigned to them isn't a float, it barfs and you can fix the code. You can try evalhf as well but I have run into trouble with it; it is finicky in what can be in its arglist.

It makes sense to evalf an expression before using it in a loop. Evalf will at least simplify any function it can evaluate to a float & in that sense simplify the expression. Sometimes simplify and evalf are needed together to make things faster.

Then there is Compiler:-Compile. I have had relatively little luck with it but you may have better luck. The idea is that you can have a compiled code section which will execute faster. Please read the help on it; I am not an expert in Maple's Compiler operations and there are a number of restrictions.

If you have complicated procs and/or subprocs & the like, the CodeTools package has some tools that will help you to identify the bottleneck in your code. Excessive memory usage and faster than linear growth in executing time with the number of data points (or iterations of a loop) are signs that Maple is trying to do algebraics where you do not want it (even if the final result may be ok).





I don't think so.

Depending on the code to be translated I'd consider using a good editor (Emacs, for example) to make he necessary changes "en masse" using e.g. replace-string. This will work for code snippets.

You can call external code from Maple. Look for examples,external Calling in help. I have never used this.



In number 1, you use a dot (.) for multiplication. The dot stands in Maple for non-commutative multiplication. I am not sure what this means in this context but when you replace the dot by an asterisk (*) th eintegral evaluates as expected.


In number 8 a multiplication sign is missing, making Maple think the first x is a function.

Results (Maple 2015):

int(sqrt(x^3*(ax+b)), x);

                     2   / 3         \     
                     - x \x  (ax + b)/     

int(sqrt(x*(ax+b)), x);

                     2               (1/2)
                     - x (x (ax + b))     


Mac Dude.

Edit: Forgot your attached file. That one fails because c and v together form a variable cv, which has nothing to do with c*v as I assume you intended.


int(1/(g-c*v/m), v);
                            /    c v\  
                          ln|g - ---| m
                            \     m /  
                        - -------------

Moral: Use 1-d input and not 2-D input, esp. when you are new to Maple & don't need the typesetting. In prefs, on the Display tab change the Input display to Maple Notation. While you are at it, on the Interface tab change the Default format for new sheets to Worksheet.




Herer is your MWE back. The only thing I did was adding a semicolon after the first expression. Without the semicolon, Maple appears to use implied multiplication of your two lines. This is a "feature" of 2-D input.

The way Maple works is that all results generated in an evaluation group is shown at the end of the group. Your first two expressions are in one group. The second two are in separate groups, hence you get the results after each expression.

Constructs like if or do loops always occupy just one group so your options to use grouping as a typesetting tool are limited. Also, if you use equation numbers, only the last result of an evaluation group is accessible by the equation number.



It is not clear what you mean by problem 1. The equation numbers are inserted by Maple automatically, as undoubtedly you noticed. You do not get to pick these. If you put an equation into your section, they will be (1.1), (1.2) and so on.

If you refer to a forward reference; i.e. referencing 7 before you get there: Maple does not know these numbers until it evaluates the line. So you cannot reference (7) before Maple has actually assigned it.

Problem 2 is easier: The boldened words are Maple keywords. The italic print indicates that you maybe in an evaluation group. Maple would try to evaluate the section (hit the !!! button to see what it is doing). Since you work in 2-D input mode you can use F5 to switch between text (no evaluation, typeset in roman) and math (evaluation, typeset in italic).

Be aware that Maple also has 1-D input mode; much easier to use if all you want is to perform a calculation. In the Prefs, Interface tab, set Default format for new worksheets to "Worksheet" and on the Display tab, set Input display to Maple Notation. Of course  if you want the typesetting you want the Document type and 2-D input.

I don't know Mma well, but I do not see where Maple lacks flexibiility with the exception of list and array handling, where Maple is much more strongly typed: it has lists, Vectors, Sets, Arrays, Matrix, ... whereas for Mma apparently most of these are lists.


I get these all the time although not from Maple. My standard answer is "no". The request is for unsolicited incoming connection requests, i.e. those that your computer or program did not initiate.

My Firewall is "on" & I allow Maple to receive incoming requests (hence no questions). I suspect your system is denying incoming requests for Maple. Check your firewall settings (you'll need to be administrator for that). I bet Maple is in there as being denied. If things work for you, just leave the settings as they are & say "no".

My $0.02,

Mac Dude


I am not sure this suits you, but I plot the Y-axis labels in vertical orientation (labeldirections=[default,vertical]). In general the label then moves out when the axis values get long. Sometimes it is a bit too far out. This is in my .mapleinit file so always works like this.

If not that, I would use the crude method of padding with spaces you already mentioned.

Mac Dude


Peeling the outer map() off your statement the code produces output and does not throw an error. So I'd conclude the thaw happens in is. I have never used is so I have no direct experience with it.

Now the output is a long sequence of seemingly identical matrix equalities like this:

seq(seq(map(eval, Matrix(3, omega[1]) = Matrix(3, omega[0]), [n = i, m = j]), i = 1 .. 10), j = 1 .. 10);

which may or may not be what is intended.

Mac Dude




Mac Dude


Use Int with a capital I, the so-called inert form. This prevents evaluation & preserves the integral notation. When yo are ready to evaluate it, use value(integral expression).

Mac Dude

if you assign something to f(i,j) it becomes a proc, i.e. it is the same or at least close to the arrow notation f:=(i,j) -> something;

If you assign to f[i,j] it becomes a table, or associative array, or in Perl lingo a hash.

Your third construct just produces an error message as does the last.

I do point out that you can easily test this yourself. In the sidebar on the left side you can see all variables as they are created & see what they are





You treat f1 as a function in ode1 but as a table in the F1xx etc. That is not consistent.



3 4 5 6 7 8 9 Last Page 5 of 20