restart; ode:=diff(y(x),x)+y(x)^2*sin(x)-2*sin(x)/cos(x)^2 = 0; yp:=DETools:-particularsol(ode);
To step into the code, do
restart; ode:=diff(y(x),x)+y(x)^2*sin(x)-2*sin(x)/cos(x)^2 = 0; stopat(`DEtools/particularsol`); DETools:-particularsol(ode);
To print it do
print(`DEtools/particularsol`);
Use the output=basis option
ode:=diff(y(x),x$2)-x*diff(y(x),x)-x*y(x)=0; dsolve(ode,output=basis);
restart; with(MmaTranslator); #load the package FromMma(`Integrate[Cos[x],x]`);
Or
restart; with(MmaTranslator); #load the package convert(`Integrate[Cos[x],x]`, FromMma);
f:=proc() eq:=x*diff(y(x),x)+y(x)=exp(2*x); dsolve(eq,y(x)); end proc;
Then used the command stopat(f); then called the procedure f(); and now the debugger comes up. Did step command and now it steps inside dsolve
For integration use
infolevel[`evalf/int`]:=5;infolevel[int]:=5;
Another option
restart; interface(verboseproc=3) #(try 2 also)
then print(procedure); or eval(procedure_name); for example
restart: interface(verboseproc=3): print(LinearAlgebra:-GramSchmidt); print(lcm);
Also can use showstat, in this case interface(verboseproc=3) is not needed. Also showstat gives line numbers and I think it is easier to read. Some examples
showstat(`odsolve/2nd_order`) showstat(`evalf/hypergeom`); showstat(`evalf/exp/general`); showstat(`evalf/Psi`); showstat(`evalf/int`); showstat(`dsolve/SERIES`); showstat(`odeadv/dAlembert`); showstat(`odsolve/dAlembert`); showstat(`odsolve/dAlembert/integrate`); showstat(`ODEtools/odeadv`); showstat(DEtools:-odeadvisor); showstat(`dsolve/series/froben/inhom`) showstat(`dsolve/series/froben`)
To stop at anyone of these functions in debugger do
stopat(`dsolve/series/froben/inhom`) #code here, say dsolve command.
The above will stop in the debugger in the above function.
There is also a function by Joe Riel here here is the post by Joe Riel:
"A disadvantage of showstat, particularly if you want to cut and paste the output, is that it includes line numbers. Here is a simple procedure I threw together to remove the line numbers."
PrintProc := proc(p::name,lines::{posint,posint..posint}) local width; option `Copyright (C) 2004 by Joseph S. Riel. All rights reserved.`; description "Print like showstat, but without line numbers"; width := interface('screenwidth'=200); try printf("%s", StringTools:-RegSubs( "\n ...." = "\n" ,debugopts('procdump'= `if`(nargs=1,p,[args])))) catch "procedure name expected": error "%1 is not a procedure name",p finally interface('screenwidth'=width) end try; NULL end:
To print source code to file using the above, do the following
currentdir("C:\\data"); interface('prettyprint'=1): interface('verboseproc'=3): writeto("listing.txt") PrintProc('singular'); writeto('terminal'):
Now the output will show up in the file "listing.txt" and also no line wrapping. The above I found is the best solution so far to do this.
trace(foo); untrace(foo);
also see debug(foo);
Also
infolevel[all]:=5: printlevel:=10:
See http://www.mapleprimes.com/questions/35951-How-To-Debugtrace-Things-In-Maple
Also look at kernelopts(opaquemodules=true)
Here is a useful post by Carl Love from Maple prime forum that summarizes all of these
Here are four things that you can do to get more information. I have listed them in order by how structured the information is, with the most structured first.
Set
infolevel[all]:= 5;
That will cause programs to print out additional information of the programmers’ choosing. You can use higher or lower numbers for more or less information. Most programs don’t use levels higher than 5.
Print the code of procedures with showstat:
showstat(int); showstat(sin); showstat(cos);
Trace the execution of particular procedures with trace:
trace(int); trace(sin);
Trace the execution of everything with printlevel:
printlevel:= 10000:
You can use higher or lower numbers for more or less information.
interface(verboseproc=3); print(DEtools)
Or to see line numbers
interface(verboseproc=3); showstat(dsolve)
Or can use the Browse(); command
with(LibraryTools); Browse();
Another option I found is
s:=debugopts(procdump=`showstat`);
Then the above produces listing that can be copied as string with line wrapping ok.
One way
L:=[]: for i from 1 to 3 do : L:=[op(L),i]; end do;
But a better way is to use seq if one knows the length
L:=[seq(i,i=1..3)]; L := [1, 2, 3]
Since list is unmutable, a more efficient method, for long lists, is to use Array, and then convert the result back to list at the end since Array can grow dynamically without preallocation each time something is inserted as follows
L:=Array(): for i from 1 to 3 do : L(i):=i; end do; for i from 1 to numelems(L) do : print(L[i]); end do; L := convert(L,list)
Which wil print
L := [1] L := [1, 2] L := [1, 2, 3] 1 2 3 L := [1, 2, 3]
Notice that to add to an Array, () is used. But to access an entry in an array [] is used.
And finally, using Array also, it can be done without using any indexing as follows
L:=Array(1..0): for i from 1 to 3 do : L ,= i; end do; L := convert(L,list)
For the above to work, the array must be declared using Array(1..0). The new syntax A ,= i will append to the array, and there is no need to write A(i) := i
By Carol Devore on the net:
Use infolevel. For example, to show what logic dsolve uses, do this: First try > infolevel[all]:= 5; That will probably give more information than you want, but if not, then try > printlevel:= 1000; If you want information about a specific procedure, you can use debug. For example, restart; debug(`int/int`); int(p, x= 0..1); To find out what procedures are being called without getting too much extra information, use excallgraph.
Trying on dsolve
infolevel[dsolve]:= 3; dsolve({eq1},y(x)); Methods for second order ODEs: Trying to isolate the derivative d^2y/dx^2... Successful isolation of d^2y/dx^2 --- Trying classification methods --- trying a quadrature trying high order exact linear fully integrable trying differential order: 2; linear nonhomogeneous with symmetry [0,1] trying a double symmetry of the form [xi=0, eta=F(x)] <- double symmetry of the form [xi=0, eta=F(x)] successful
To solve \[ y''-3y'+2y=10 e^{5 x} \] with \(y(0)=1,y'(0)=5\) do
eq1:= diff(y(x),x$2)-3*diff(y(x),x)+2*y(x)=10*exp(5*x); dsolve({eq1,y(0)=1,D(y)(0)=5},y(x)); Methods for second order ODEs: Trying to isolate the derivative d^2y/dx^2... Successful isolation of d^2y/dx^2 --- Trying classification methods --- trying a quadrature trying high order exact linear fully integrable trying differential order: 2; linear nonhomogeneous with symmetry [0,1] trying a double symmetry of the form [xi=0, eta=F(x)] <- double symmetry of the form [xi=0, eta=F(x)] successful ....
The above can also be written using D@@ notation, like this
eq:= (D@@2)(y)(x) - 3*D(y)(x) +2*y(x) = 10*exp(5*x); IC := y(0)=1,D(y)(0)=5; dsolve({eq,IC},y(x));
use odetest and check if it gives zero.
eq1:= diff(diff(y(x),x),x)-3*diff(y(x),x)+2*y(x)=10*exp(5*x); ans:=dsolve({eq1,IC},y(x)); odetest(ans,eq1); 0
Maple can classify the ODE.
eq1:= diff(y(x),x$2)-3*diff(y(x),x)+2*y(x)=10*exp(5*x); R0 := DEtools['odeadvisor'](eq1,y(x)); R0 := [[_2nd_order, _with_linear_symmetries]]
To get help on this type of ODE, do
DEtools['odeadvisor'](eq1,'help');
Use with(DEtools);
restart; eq1:= diff(y(x),x$2)-3*diff(y(x),x)+2*y(x)=10*exp(5*x); DEtools[DEplot](eq1,y(x),x=-2..5, [ [y(0)=0, D(y)(0)=0]], y=-3..3,linecolor=red);
To get a better plot, change the stepsize and independent variable range
restart; eq1:= diff(y(x),x$2)-3*diff(y(x),x)+2*y(x)=10*exp(5*x); DEtools[DEplot](eq1,y(x),x=-1..1,[[y(0)=0,D(y)(0)=0]],y=-3..3,stepsize=0.001,linecolor=red);
Here, I am looking at fouries series expansion of \(f(x)=0\) between \(–\pi \) and 0, and \(f(x)=1\) between 0 and \(\pi \).
The Fouries series expansion is worked out to be as below. This shows that the series approximate the above \(f(x)\) as more terms are added
restart; f:=(x)-> 1/2 + (1/Pi)*(sin(x)+sin(3*x)/3+sin(5*x)/5+sin(7*x)/7); plot(f(x),x=-10..10);
From DOS, point to where your cmaple is
>"C:\Program Files\Maple 7\BIN.WNT\"cmaple
To make it execute maple commands use the < foo.txt to pipe maple commands in the file to it.
A:= Matrix( [ [1, 2, 3] , [3, 6, 7] , [5, 6, 9] , [7, 7, 7] ]); whattype(A); Matrix size:=LinearAlgebra:-Dimension(A); size := 4, 3 row:=size[1]; row := 4 col:=size[2]; col := 3
You can extract any part of the matrix like this:
B:=A[1..3,2..2];
\[ \left [ \begin {array}{c} 2\\ 6\\ 6\end {array} \right ] \]
By Carl Devore http://mathforum.org/kb/message.jspa?messageID=1570678
Maple list and sequence structures are more flexible than Matrices, which are highly structured. A Maple list of lists (called a listlist in Maplese) is akin to a matrix in some other languages. Many matrix operations can be performed directly on the listlist form, but to do serious linear algebra, you should convert to a Matrix. Of course, it is trivial to convert a listlist to Matrix: LL:= [[1,2], [3,4]]; M:= Matrix(LL); So here is another solution in line with your original wishes. This is "index free", but the table-based solution I gave earlier should be faster. (It is usually considered bad form to repeatedly append to a list or sequence.) L:= [][]; # Create a NULL sequence do line:= readline(file); if line::string then if line contains valid data then Z:= a list of that data; L:= L, Z fi else break fi od A:= Matrix([L]); # Note []: seq -> list.
To move move a column into a matrix: Here, I want to copy 2nd column to the 3rd column:
A; \[ \left [ \begin {array}{ccc} 1&2&3\\ 3&6&7\\ 5&6&9\\ 7&7&7 \end {array} \right ] \]
B:=A[1..row,2]; \[ \left [ \begin {array}{c} 2\\ 6\\ 6\\ 7 \end {array} \right ] \]
A[1..row,3]:=B: A;
\[ \left [ \begin {array}{ccc} 1&2&2\\ 3&6&6\\ 5&6&6\\ 7&7&7 \end {array} \right ] \]
Maple can return multiple values. Make sure to use the comma "," in the body of the procedure to separate each return value. Example:
size_matrix:=proc(x) 3*x, 4*x; end proc; row,col :=size_matrix(5);
When passing a variable to maple procesure, the variable VALUE is passed to the procedure (This is different from say Fortran where the default is pass by reference). But this is the same as with Mathematica.
For example, if a variable X had value 10, then you call a procedure FOO passing it X, then inside FOO, X will be the number 10, not the argument variable X. So, this means one can not have X on the left hand side inside FOO. Like this x:=1
The only way to assign new value to the input and return new value, is to use a local variable, like this:
one:= proc(x) local y; print(x); y:=x+ 1; print(x); y; end proc; z:='z'; z:=5; f:=one(z); f := 6
Use `type/name` to define new type name.
`type/char`:= x-> x::string and length(x)=1; P:= proc(c::char) print(c) end proc: P("x"); "x" P("xy"); Error, invalid input: P expects its 1st argument, c, to be of type char, but received xy > `type/byte`:= x-> x::integer and (x>= 0 and x<256); will define a byte (unsigned integer)
Code from net by Carl Devore:
MMax:= proc(M::{Matrix,matrix}) local C,r,c,mx,L,p; C:= op(`if`(M::Matrix, [1,2], [2,2,2]), eval(M)); L:= map(op, convert(M, listlist)); mx:= max(L[]); member(mx,L,'p'); r:= iquo(p, C, 'c'); mx, `if`(c=0, [r,C], [r+1,c]) end;
Code below from C W
A:=matrix(12,12,rand(100)); Ao:=array((proc(E) local i; [seq(i=(rhs=lhs)(E[i]),i=1..nops(E))]end) (sort(op(3,eval(A)),proc(E1,E2) if rhs(E1)>rhs(E2) then true else false fi end))); Ao[1];
First create the module:
restart; nma:= module() option package; export getMaxMatrix; getMaxMatrix := proc (M::{matrix, Matrix}) local C, r, c, mx, L, p; C := op(`if`(M::Matrix,[1, 2],[2,2,2]),eval(M)); L := map(op,convert(M,listlist)); mx := max(L[]); member(mx,L,'p'); r := iquo(p,C,'c'); mx, `if`(c = 0,[r, C],[r+1, c]) end proc; end module; A:= Matrix( [ [1, 2, 3] , [3, 6, 7] , [5, 6, 9] , [7, 7, 7] ]); nma[getMaxMatrix](A);|
Gives 9, [3, 3]. Now save the module.
savelibname := "C:/MAPLE_PACKAES"; march('create', savelibname, 20);
now save the library to disk. savelib(nma);
Now we can test everything by reinitialize everything and reload the library.
>restart #Add my library to LIBNAME >libname:="C:/MAPLE_PACKAGES",libname; > A:=matrix( [ [1,2,3],[4,6,9] ]); >with(nma); >nma[getMaxMatrix](A);
Now to print a proc() in the package, do
>interface(verboseproc=3); > print(nma[getMaxMatrix]);
Now you can list what packages exist in the archive:
march('list',savelibname); march('extract',savelibname,":-1.m","C:MAPLE_PACKAGES/t.m")
Some notes. need to clean later
> module1lib:=`module1\\lib`; > system("md "||module1lib); > march('create',module1lib,100); > makehelp(module1,`module1/module1.mws`,module1lib): > makehelp(`module1/export1`,`module1/export1.mws`,module1lib): > savelibname:=module1lib: ### doesn't affect current libname > savelib(module1); ### no error message > restart; > module1lib:="module1\\lib": > libname:=module1lib,libname; ### now Maple will find module1 > with(module1); > ?module1
Also there is a long thread here on Maple prime on making personal packages in Maple How-To-Create-A-Personal-Package
From: Robert Israel (israel@math.ubc.ca) Subject: Re: Getting non-integral results in hex Newsgroups: comp.soft-sys.math.maple Date: 2003-06-13 00:07:37 PST I assume you mean floating-point numbers. Note that Maple floats (as opposed to "hardware floats") are in fact stored in base 10. To convert a float to hex with n digits after the ".", you can use this: > `convert/hexfloat`:= proc(x::numeric, n::nonnegint) local A,B,ax,R; if nargs = 1 then return procname(x,round(Digits*log[16](10))) fi; if x = 0 then return cat(`0.`,`0`$n) fi; ax:= abs(x); A:= floor(ax); B:= round(frac(ax)*16^n); if B = 16^n then A:= A+1; B:= 0 fi; R:= cat(convert(A,hex),`.`); if x < 0 then R:= cat(`-`,R) fi; cat(R,substring(convert(16^n+B,hex),2..-1)); end; And then, e.g.: > convert(1234.5678, hexfloat, 4); 4D2.915B
mtaylor(sin(x),[x],10);
\[ x-1/6\,{x}^{3}+{\frac {{x}^{5}}{120}}-{\frac {{x}^{7}}{5040}}+{\frac { {x}^{9}}{362880}} \]
restart; a:=Matrix([ [2,3,4],[4,5,6] ]); nRow,nCol :=LinearAlgebra[Dimension](a); for i from 1 to nRow do for j from 1 to nCol do printf("a(%d,%d)=%d\n",i,j,a[i,j]); end do; end do; a(1,1)=2 a(1,2)=3 a(1,3)=4 a(2,1)=4 a(2,2)=5 a(2,3)=6
restart; a:=Matrix([ [2,4],[5,7] ]); LinearAlgebra:-Determinant(a); -6
H := LinearAlgebra:-HilbertMatrix(5);
\[ \left [ \begin {array}{ccccc} 1&1/2&1/3&1/4&1/5\\ \noalign {\medskip }1/ 2&1/3&1/4&1/5&1/6\\ \noalign {\medskip }1/3&1/4&1/5&1/6&1/7 \\ \noalign {\medskip }1/4&1/5&1/6&1/7&1/8\\ \noalign {\medskip }1/5&1/6&1 /7&1/8&1/9\end {array} \right ] \]
Matlab is much easier here. In maple, need to covert the matrix to a list of list of points first.
restart; H := LinearAlgebra:-HilbertMatrix(5): nRow,nCol :=LinearAlgebra[Dimension](H): L:=[seq([seq( [i,j,H[i,j]], i=1..nRow) ], j=1..nCol)]: plots:-surfdata(L);
An error in maple raises an exception. So, use try catch to trap it as follows:
try v,pos:=MMax(4); catch: printf("an error is cought\n"); end try;
From the net, by Carl Devor:
`print/commas`:= proc(N::integer) local n,s,i,b; n:= ListTools:-Reverse(convert(abs(N), base, 1000)); if N<0 then n:= subsop(1= -n[1], n) fi; nprintf("%s", sprintf(cat("%d", ",%03d" $ nops(n)-1), n[])) end proc: commas(456554); 456,554
To convert a string to array of chars use array(StringTools:-Explode(S))
s:="Nasser M. Abbasi": r:=array(StringTools:-Explode(s)); r:=["N" "a" "s" .......]
Now can use the string as normal array
r[4]; "s"
Units[GetDimensions](base); amount_of_information, amount_of_substance, currency, electric_current, length, logarithmic_gain, luminous_intensity, mass, thermodynamic_temperature, time
From: Robert Israel (israel@math.ubc.ca) Subject: Re: given precision in Maple Newsgroups: comp.soft-sys.math.maple Date: 2003-07-16 20:19:06 PST Set Digits:= n and all calculations from this point will be done with n digits. Mathematical functions will be correct to n digits as well (to the extent this is practical). If you want high-accuracy numerical ODE solutions, on the other hand, it's not so simple. I think the best way is using the taylorseries method. For example, consider the problem y' = y^2, y(1) = 1, where the exact solution y = 1/(2-x) has y(1.9) = 10. > Digits:= 30: sol:= dsolve({D(y)(x)=y(x)^2, y(1) = 1}, y(x), numeric, method=taylorseries, abserr=1e-25): sol(1.9); [x = 1.9, y(x) = 9.99999999999999999999999797691] > 10 - eval(y(x),%); -23 0.202309 10 The other methods (in particular the default rkf45) do not give results anywhere near this good.
Use the Sum command.
restart; expr:= (-1)^i/(2*i+1)^2; Sum(expr,i=0..infinity); evalf(%,50); 0.91596559417721901505460351493238411077414937428167
Notice, if I used the sum command instead of the Sum command I get this result:
sum(expr,i=0..infinity); Catalan
This shows how to do a simple package and use it without building a library. Just using a plain text file.
Create this nma_pkg1.txt file:
nma_pkg1 := module() export f1; option package; f1:= proc() print("in pakcage nma_pkg1"); end proc; end module;
now save it, and from maple do
>read("c:\\nma_pkg1.txt");
now execute f1() as this:
>nma_pkg1[f1](); "in pakcage nma_pkg1"
now put it in a library (so that we can use with, instead of read)
> savelibname:=("c:/maple"); > march('create', savelibname, 20); > savelib(nma_pkg1); >restart; > libname := "c:/maple",libname; > with(nma_pkg1); > f1(); "in pakcage nma_pkg1"
now make changes to the nma_pkg1.txt file and updated again as above.
?index,package
restart; f:=3*x^2 + y* cos(x*y); the_grad :=linalg[grad](f,[x,y]); plots[fieldplot](the_grad,x=-2..2,y=-2..2);
or
or can do it in just one command: plots[gradplot](f,x=-2..2,y=-2..2);
Suppose you want the 100 digits of Pi put in a list. This is one way to do it:
restart; L:=evalf(Pi,100); S:=convert(L,string); the_list:=[seq(parse(S[i]),i=3..length(S))]; the_list := [1, 4, 1, 5, 9, 2, 6, 5, 3, ..
This below now tells how many times each digits occurs.
>stats[transform,tally](the_list); [Weight(0, 8), Weight(1, 8), Weight(2, 12), Weight(3, 11), Weight(4, 10), Weight(5, 8), Weight(6, 9), Weight(7, 7), Weight(8, 13), Weight(9, 13)]
Written sometime in 2005? I should really record the time when I write something.
I just run these now, Auust 2014, and now Maple 18 as very fast. So this all below is no longer valid. I will leave it here for now for reference until I update it all later
I have written a few lines of code, which counts how many times each digit occurs after the decimal points of \(\pi \)
Written this in maple first. Then did similar thin in mma 5.0. Both are run on the same PC. No other applications are running at the time when I run the code.
The basic idea of the algorithm is to use evalf(Pi,digits) in maple to find \(\pi \) for any number of decimal digits, and to use N[Pi,digits] in mma for doing the same. (Where the variable digits above is the number of digits)
Then in maple convert the above \(\pi \) to a string, and generate a sequence of the characters to right of decimal point, then use stats[transform,tally] to do the actual counting.
In mma, I use RealDigits[] to get a list of the digits, and then use Count[] to do the counting.
This is result of some of the runs to find Pi to some digits, and the total time (to find Pi and do the counting)
All times are in cpu seconds, machine is P4, 2.8 Ghz, 500 MB of RAM, single CPU, hyperthreading enabled, running XP home edition. Maple 9.03 student version, and mma 5.0 student version.
Below is the result, and below that I show the maple code and the mma code.
Because of this, before each run in mma, I exited the application and started it fresh. In maple, it does not matter for the above reason.
100,000 digits: Find_Pi Total Maple 9.0 55 84 Mma 5.0 0.9 1.54
Mma is 60 times faster in finding pi and about 56 times faster overall
300,000 digits: Find_Pi Total Maple 9.0 309 781 Mma 5.0 3.7 6
Mma is 300 times faster in finding Pi, and 130 times faster overall.
3,000,000 digits Find_Pi Total Maple 9.0 Mma 5.0 85 118 Maple time in hours ! Still running.
Maple code
> restart; startingTime :=time(); L:=evalf(Pi,100000): timeToFindPiInSecs:=time()-startingTime; S:=convert(L,string): the_list:=[seq(parse(S[i]),i=3..length(S))]: stats[transform,tally](the_list); endingTime :=time(): cpuTimeInSecs := endingTime - startingTime;
mma code
Clear[] startingTime=TimeUsed[] t1=N[Pi,100000]; timeToFindPiInSecs=TimeUsed[]-startingTime {c,d}=RealDigits[t1]; theList=c[[Range[2,Length[c]]]]; f[digit_]:=Count[theList,digit]; r=Range[0,9]; Map[f,r] cpuTimeInSecs=TimeUsed[]-startingTime
update 12/25/03 Changed maple code on how to do the counting : To use
StringTools[CharacterFrequencies](S)
Now the counting in maple is much faster. It is always hard to know which is the best function to use.
restart; startingTime :=time(); L:=evalf(Pi,300000): timeToFindPiInSecs:=time()-startingTime; S:=convert(L,string): StringTools[CharacterFrequencies](S); endingTime :=time(): cpuTimeInSecs := endingTime - startingTime;
From: Ken Lin (maplemath@tp.edu.tw) Subject: Re: how to find which package a function belongs to? Newsgroups: comp.soft-sys.math.maple Date: 2003-12-04 03:49:26 PST When Maple first loaded, There are only two kinds of "internal" commands which can be called directly. One is the "kernal" commands coded in C, and the other includes many "internal" prodecures programmed by the kernal commands which lies in the "Main Library", There are also many other "external" procedures which were categorized into so called "packages", plots[display](...) for example, plots[] is a package(Library), and display() is the prodecure inside plots[]. All the packages can be loaded by with() command, like > with(plots); Because Different Packages include user library might have the same procedure name, Maple doesn't realize the "procedure_name" you type in, it took it for a "symbol". If you really want to know which packages provided by Maple the external procedure lies in, just mark the procedure_name and press F1 key, the Maple Help Browser will show you the packages you might be interested. By the way, plot3d() is a "internal" procedure lies in the Main Library. You can confirm that by: > op(0, eval(plot3d)); procedure or in Maple 9 > type( plot3d, 'std' ); #Is it internal? true > type( plot3d, 'stdlib' ); #Does is lie in "Standard(Main) Library"? true If you are interested the codes inside plot3d()... > interface(verboseproc=2): #Turn on verboseproc > print(plot3d); #eval() also works > interface(verboseproc=1): #Turn off verboseproc I hope this will give you some help. Have fun with Maple. Ken Lin
See http://www.maplesoft.com/applications/view.aspx?SID=1533&view=html&L=G
use select. For example
>restart; >my_list:=[1,3.4,3+I,5]; >select(x->evalb(Im(x)=0),my_list); [1, 3.4, 5]
restart; m:=Matrix( [[1.3,2,3],[3,4,4] ]); matrixTestQ := proc(m::Matrix) local r,c,i,j; (r,c):=LinearAlgebra[Dimensions](m); for i from 1 to r do for j from 1 to c do if( not evalb( whattype(m[i,j]) = integer) ) then return(false); end if; end do; end do; return true; end proc; >matrixTestQ(m); false
I am sure there is a better way than the above. Need to find out.
restart; f:= t->sin(omega*t) ; L:=convert(inttrans[laplace](f(t),t,s),int);
\[ {\frac {\omega }{{\omega }^{2}+{s}^{2}}} \]
To find the inverse, do:
inttrans[invlaplace](L,s,t);
\[ \sin \left ( \omega \,t \right ) \]
Any difference between using `diffalg/Rosenfeld_Groebner`(args) or diffalg[Rosenfeld_Groebner](args)
restart; f:= (x,y)->x^3-3*x*y^2; plot3d(f,-1..1,-1..1,numpoints=2500,style=patchcontour);
Use map
map(`^`,{1,2,3},3); {1, 8, 27}
incr:=.25; start:=0; last:=3; seq(start+i*incr,i=1..(last/incr));
read ?MVshortcut, ?MVassignment, and ?Mvextract and Transpose(R) can be shortened to R^%T
Written feb 20, 2004
This is problem 7.4 chapter 4, in the Mary Boas book. Given \begin {align*} x s^2+y t^2 &= 1\\ x^2 s+y^2 t &= xy-4 \end {align*}
Find \(\frac {dx}{dt}, \frac {dx}{ds}, \frac {dy}{dt}, \frac {dy}{ds}\) at \(x=1,y=-3,s=2,t=-1\)
This is how I did it in maple:
restart; alias(x=x(s,t)); alias(y=y(s,t)); alias(Xt= diff(x(s,t), t)); alias(Xs= diff(x(s,t), s)); alias(Yt= diff(y(s,t), t)); alias(Ys= diff(y(s,t), s)); eq1:= x*s^2+y*t^2=1; eq2:= x^2*s+y^2*t=x*y-4; r1:=diff(eq1,t); r2:=diff(eq1,s); r3:=diff(eq2,t); r4:=diff(eq2,s); sol:=solve({r1,r2,r3,r4},{Xt,Xs,Yt,Ys});
\begin {align*} {\frac {\partial }{\partial s}}x \left ( s,t \right ) &= -{\frac {x \left ( s,t \right ) \left ( x \left ( s,t \right ) {t}^{2}-4\,y \left ( s,t \right ) st+2\,x \left ( s,t \right ) s \right ) }{2\,x \left ( s,t \right ) s{t}^{2}-2\,y \left ( s,t \right ) t{s}^{2}+x \left ( s,t \right ) {s}^{2}-y \left ( s,t \right ) {t}^{2}}}\\ {\frac {\partial }{\partial t}}x \left ( s,t \right ) &=-{\frac {y \left ( s,t \right ) t \left ( -3\,y \left ( s,t \right ) t+2\,x \left ( s,t \right ) \right ) }{2\,x \left ( s,t \right ) s{t}^{2}-2\,y \left ( s,t \right ) t{ s}^{2}+x \left ( s,t \right ) {s}^{2}-y \left ( s,t \right ) {t}^{2}}}\\ {\frac {\partial }{\partial s}}y \left ( s,t \right ) &=-{\frac {x \left ( s,t \right ) \left ( 3\,x \left ( s,t \right ) s-2\,y \left ( s,t \right ) \right ) s}{2\,x \left ( s,t \right ) s{t}^{2}-2\,y \left ( s,t \right ) t {s}^{2}+x \left ( s,t \right ) {s}^{2}-y \left ( s,t \right ) {t}^{2}}}\\ {\frac {\partial }{\partial t}}y \left ( s,t \right ) &=-{\frac {y \left ( s,t \right ) \left ( 4\,x \left ( s,t \right ) st-y \left ( s,t \right ) {s }^{2}-2\,y \left ( s,t \right ) t \right ) }{2\,x \left ( s,t \right ) s{t} ^{2}-2\,y \left ( s,t \right ) t{s}^{2}+x \left ( s,t \right ) {s}^{2}-y \left ( s,t \right ) {t}^{2}}} \end {align*}
points:= {x=1,y=-3,s=2,t=-1}; subs(points,sol);
This is problem 7.15 chapter 4 in Boas:
Given \(x^2 u-y^2 v=1\) and \(x+y=uv\) Find \(\frac {dx}{du},v\) and \(\frac {dx}{du},y\)
This is the maple code to solve this:
restart; eq1:=x^2*u-y^2*v=1; eq2:=x+y=u*v; r1:=D(eq1); r2:=D(eq2); r1_:=subs(D(v)=0,r1); r2_:=subs(D(v)=0,r2); sol:=solve({r1_,r2_},{D(x),D(u)}); print("dx/du,v="); rhs(sol[1])/rhs(sol[2]); r1_:=subs(D(y)=0,r1); r2_:=subs(D(y)=0,r2); sol:=solve({r1_,r2_},{D(x),D(u)}); print("dx/du,y="); rhs(sol[1])/rhs(sol[2]);
by http://www.math.fsu.edu/~bellenot
restart; t2 := proc(i, x, y) if i < 2 then [[x, y], [x, y - 1]], [[x, y], [x + 2^i, y - 1]] else [[x, y], [x, y - 1]], [[x, y], [x + 2^i, y - 1]], t2(i - 1, x, y - 1), t2(i - 1, x + 2^i, y - 1) end if end proc; PLOT(CURVES(t2(6,0,0)));
restart; z:= Int( sin(t)/t, t=sin(x)..cos(x)); diff(z,x);
\[ -{\frac {\sin \left ( x \right ) \sin \left ( \cos \left ( x \right ) \right ) }{\cos \left ( x \right ) }}-{\frac {\cos \left ( x \right ) \sin \left ( \sin \left ( x \right ) \right ) }{\sin \left ( x \right ) }} \]
restart; c:='c': C:='C': n:='n': P:='P': C := n -> ((n+2)/(3*n+1))^n: ### WARNING: calls to `C` for generating C code should be replaced by codegen[C] `The general term is `, c[n]= C(n); ` `; `The n-th root is:`; ### WARNING: calls to `C` for generating C code should be replaced by codegen[C] P := C(n)^(1/n): abs(c[n])^(1/n) = P; P := simplify(P, assume=positive): abs(c[n])^(1/n) = P;
restart; f:= 1/( (1-2*z)*(5*z-4) ); residue(f,z=4/5);
\[ \frac {-1}{3} \]
_EnvAllSolutions:=true; solve(sin(x)=0);
Pi _Z1~
Subject: Associated Legendre Author: Mehran Basti <Basti@worldnet.att.net> Organization: AT&T Worldnet Date: Mon, 25 Nov 2002 02:48:15 GMT
Dear newsgroup:
I had mentioned that my methods will solve classical equations without the use of infinite series.
The following is a Maple code of my old files. Those days I had Maple2 but the general idea is the same in the process and you see that we can also solve the integrals involved.
It does not make sense how are the theory behind it but eventually it will come into light.
Just read the procedures and you can see the solution of associated legendre AL at the end.
> s1:=-diff(p(t),t)+p(t)^2; > > s2:=exp(2*int(p(t),t))*T(t); > s3:=s1+s2; > s4:=diff(T(t),t)/T(t); > s5:=-(1/2)*(diff(s4,t))+(1/4)*s4^2; > s6:=s5+s2; > p(t):=-1/t+(1)/(2-t); > s1:=simplify(s1); > s1:=collect(%,t); > s2:=simplify(s2); > s1+s2=(2*t^2-4*t+m^2-1)/(t*(-2+t))^2; > solve(%,T(t)); > T(t):=simplify(%); > s2:=simplify(s2); > s2+s1; > s3:=simplify(%); > > s6:=simplify(s6); > t*(-2+t); > simplify(%); > z:=(r3*t^3+r2*t^2+r1*t+r0)/(%); > > simplify(diff(z,t)+z^2-s6); > s7:=collect(numer(%),t); > > coeff(%,t,0); > solve(%,r0); > r0:=op(1,{%}); > coeff(s7,t,1); > solve(%,r1); > r1:=simplify(%); > coeff(s7,t,2); > solve(%,r2); > r2:=simplify(%); > coeff(s7,t,3); > solve(%,r3); > r3:=simplify(%); > simplify(s7); > s3:=simplify(s3); > s4:=simplify(s4); > s6:=simplify(s6); > T(t):=simplify(T(t)); > z:=simplify(z); > 1/2*s4+2*p(t)+z; > s8:=simplify(%); > exp(int(%,t)); > expand(%); > g:=(%); > simplify(g,power); > g:=%; > Int(%,t); > Integralg:=(%); > int(g1(t),t); > x1:=-p(t)+g1(t)/(%); > diff(x1,t)+x1^2-s3; > simplify(%); > s10:=numer(%); > solve(%,int(g1(t),t)); > Ing:=(%); > simplify(subs(g1(t)=g,%)); > > Ing:=(%); > expand(%); > Ing:=simplify(%); > simplify(diff(%,t)-g); > expand(%); > simplify(%); > x:=-p(t)+g/Ing; > simplify(diff(x,t)+x^2-s3); > int(x,t); > exp(%); > expand(%); > s11:=simplify(%); > ALT:=t*(2-t)*diff(u(t),t$2)+2*(1-t)*diff(u(t),t)+(2-m^2/(1-(1-t)^2))*u(t); > -2*(1-t)/(2*t*(2-t)); > int(%,t); > exp(%); > s12:=simplify(%,power); > > u1:=s12*s11; > u1:=simplify(%,power); > simplify(subs(u(t)=u1,ALT)); > AL:=(1-nu^2)*diff(u(nu),nu$2)-2*nu*diff(u(nu),nu)+(2-m^2/(1-nu^2))*u(nu); > > u2:=subs(t=1-nu,u1); > simplify(subs(u(nu)=u2,AL)); >
The advantage of these methods are that there are ample rooms for advances.
Today my skills for solving classical equations such as Riccati is much advanced.
Highly complicated and more general Riccati equations in its billions now possible.
Sincerely
Dr.M.Basti
To plot mapping of complex function in maple, use [plots]conformal The trick is to how to specify the quadrant in the x-y plane. This example shows how.
Suppose we want to map the first quadrent. Then we specify the DIAGONAL points in the range, from the lower left corner to the upper right corner, which then should be 0..1+I Because 0 is the lower left corner, and \((1,i)\) is the upper right corner. Example:
restart; assume(y,real); assume(x,real); #f:= z->I+z*exp(I*Pi/4); f:= z->z^2; w:=f(x+I*y); u:=Re(w); v:=Im(w); plots:-conformal(f(z),z=0..1+I,grid=[16,16],numxy=[16,16],scaling=constrained);
This below uses the first TWO quadents, i.e. the upper half of the x-y plane
restart; assume(y,real); assume(x,real); #f:= z->I+z*exp(I*Pi/4); f:= z->z^2; w:=f(x+I*y); u:=Re(w); v:=Im(w); plots:-conformal(f(z),z=-1-I..1+I,grid=[16,16],numxy=[16,16],scaling=constrained);
This below puts the plots next to each others so to see them
restart; assume(y,real); assume(x,real); f:= z->I+z*exp(I*Pi/4); #f:= z->z^2; w:=f(x+I*y); u:=Re(w); v:=Im(w); A := array(1..2): A[1]:=plots:-conformal(z,z=0..1+I/2,grid=[16,16],numxy=[16,16],scaling=constrained): A[2]:=plots:-conformal(f(z),z=0..1+I/2,grid=[16,16],numxy=[16,16],scaling=constrained): plots:-display(A);
interface(showassumed=0) removes all tildas and interface(showassumed=1) adds the tildas.
I wrote this to generate FS in Maple for some HW I was doing. I think this was for Math 121A at UC Berkeley in 2003
restart; f:=x->piecewise(-Pi<x and x<Pi/2,-1, Pi/2<x and x<1,0,1); assume(n,integer); nmaFourier2:=proc(f,freq,from_,to_,maxN) local n::integer,denomC,denomS,a,b; denomC:=( to_ - from_ ) / 2; denomS:=( to_ - from_ ) / 2; a:=proc(n) int(f(x)*cos(n*freq*x),x=from_..to_) /denomC; end proc; b:=proc(n) int(f(x)*sin(n*freq*x),x=from_..to_) / denomS; end proc; evalf(denomC); 1/2*a(0) + sum( a(n) * cos(n*freq*x) ,n=1..maxN) + sum( b(n) * sin(n*freq*x) ,n=1..maxN) end proc; r:=[seq(nmaFourier2(f,1,-Pi,Pi,nIter),nIter=1..10)]; plot(r,x=-Pi..Pi);
To animate do
g:=n->plot(nmaFourier2(f,1,-Pi,Pi,n),x=-2*Pi..2*Pi); plots:-animate(g,[n],n=1..40);
Here is the animation from the Maple notebook:
Another version
restart; f:=x->piecewise(-Pi<x and x<Pi/2,-1, Pi/2<x and x<1,0,1); assume(n,integer); nmaFourier2:=proc(f,freq,from_,to_,maxN::integer) local n::integer,denomC,denomS,a,b; denomC:=( to_ - from_ ) / 2; denomS:=( to_ - from_ ) / 2; a:=proc(n) int(f(x)*cos(n*freq*x),x=from_..to_) /denomC; end proc; b:=proc(n) int(f(x)*sin(n*freq*x),x=from_..to_) / denomS; end proc; 1/2*a(0) + sum( a(n) * cos(n*freq*x) ,n=1..maxN) + sum( b(n) * sin(n*freq*x) ,n=1..maxN) end proc; plots[setoptions](title=` `, axesfont=[SYMBOL,8] ,font=[COURIER,1], xtickmarks=[seq(evalf(k*Pi/2)=sprintf("%a %s", k/2 ,"pi" ),k= -3..3)], ytickmarks=[-1.0="-1",-0.5="",0.0="0",0.5="",1.0="1"]); B:=array(1..3,1..3); k:=0; for i from 1 to 3 do for j from 1 to 3 do k:=k+1; B[i,j]:=plot({f(x),nmaFourier2(f,1,-Pi,Pi,k)},x=-Pi..Pi,size=[200,100]); end do; end do; plots:-display( B);
restart; v:=1; B:=Matrix(3,3); for i from 1 to 3 do for j from 1 to 3 do v:=v+1; B[i,j]:= plot(x^v,x=-2..2,thickness=3,size=[200,100] ); end do; end do; plots:-display(B);
From book Maple animation by John Putz
plot( sin(x), x=0..2*Pi, xtickmarks=evalf([Pi/2="p/2", Pi="p", 3*Pi/2="3p/2", 2*Pi="2p"]), ytickmarks=[-1,1], axesfont=[SYMBOL,16], labels=["",""] );
From Preben Alsholm
res:=FunctionAdvisor(sin): res2:=op(2,eval(res)): map(print,res2);
or answer by Thomas Richard
> FunctionAdvisor( display, sin );
Use convert(expr,parfrac) or convert(f,fullparfrac)
n := 7; f:=sum('a[k]*b[k]','k'=1..n);
\[ a_{{1}}b_{{1}}+a_{{2}}b_{{2}}+a_{{3}}b_{{3}}+a_{{4}}b_{{4}}+a_{{5}}b_{ {5}}+a_{{6}}b_{{6}}+a_{{7}}b_{{7}} \]
from Serge from the net:
restart; with(geom3d): plane(OYZ,x=0,[x,y,z]): plane(OXZ,y=0,[x,y,z]): plane(OXY,z=0,[x,y,z]): c:=1/2:r:=1/4: L:=combinat[permute]([-c$3,c$3],3): S:=seq(sphere(s||i,[point(A||i,op(op(i,L))),r]),i=1..8): draw([OYZ,OXZ,OXY,S]);
Use evalb(). For example evalb(I*sinh(x)=sin(I*x)); gives true
The above does not always work. Only sure way is to do this
> m1 := exp(I*n*x); m2 := (cos(n*x)+I*sin(n*x)); simplify(m1-m2); simplify(m1-convert(m2,exp));
Function by Robert Israel from the net:
restart; thefacts:= [seq(i!,i=2..20)]: getfacts:= proc(x::{algebraic,series}) local i; if type(x, {`+`,`*`,series}) then map(getfacts,x) elif type(x, fraction) then getfacts(numer(x))/getfacts(denom(x)) elif type(x,`^`) then getfacts(op(1,x))^op(2,x) elif type(x,negint) then -getfacts(-x) elif type(x,posint) then for i from 1 to 19 while irem(x, thefacts[i]) = 0 do od: if i = 1 then x elif thefacts[i-1] = x then ``(i)! else ``(i-1)!*getfacts(x/thefacts[i]) fi else x fi end; getfacts(series(sin(x),x));
\[ \text {series} \left ( x-{\frac {{x}^{3}}{ \left ( \left ( 3 \right ) \right ) !}}+{\frac {{x}^{5}}{ \left ( \left ( 5 \right ) \right ) !}}+O \left ( {x}^{7} \right ) ,x,7 \right ) \]
?updates,maple10
Maple 2020.
restart; PDE := diff(u(x,y), y$2 ) + diff(u(x,y), x$2) = 0; BC:= u(x,0)=0, u(x,100)=100, u(0,y)=0, u(10,y)=0; sol:=pdsolve(PDE,[BC] ,numeric); Error, (in pdsolve/numeric) unable to handle elliptic PDEs
Compare to
restart; PDE := diff(u(x,y), y$2 ) + diff(u(x,y), x$2) = 0; BC:= u(x,0)=0, u(x,100)=100, u(0,y)=0, u(10,y)=0; sol:=pdsolve([PDE,BC]);
\[ u \left ( x,y \right ) =\sum _{n=1}^{\infty }-200\,{\frac { \left ( \left ( -1 \right ) ^{n}-1 \right ) {{\rm e}^{10\,\pi \,n}}\sin \left ( 1/10\,n\pi \,x \right ) \left ( {{\rm e}^{1/10\,n\pi \,y}}- {{\rm e}^{-1/10\,n\pi \,y}} \right ) }{\pi \,n \left ( {{\rm e}^{20\,\pi \,n}}-1 \right ) } } \]
Create a new matrix, by appending some rows of one matrix to rows from another matrix:
restart; with(LinearAlgebra): A:=< <1|2|3> , <4|5|6> >;
\[ \left [ \begin {array}{ccc} 1&2&3\\ \noalign {\medskip }4&5&6 \end {array} \right ] \]
B:=< <7|8|10> , <11|12|13> , <14|15|16> >;
\[ \left [ \begin {array}{ccc} 7&8&10\\ \noalign {\medskip }11&12&13 \\ \noalign {\medskip }14&15&16\end {array} \right ] \]
Now append first row of A to last 2 rows of B
C:=< A[1,1..-1] , B[2..-1,1..-1] >;
\[ \left [ \begin {array}{ccc} 1&2&3\\ \noalign {\medskip }11&12&13 \\ \noalign {\medskip }14&15&16\end {array} \right ] \]
# Now append first column of A to first 2 rows of B A[1..-1,1]; B[1..2,1..-1]; C:=< A[1..-1,1] | B[1..2,1..-1] >;
\[ \left [ \begin {array}{cccc} 1&7&8&10\\ \noalign {\medskip }4&11&12&13 \end {array} \right ] \]
#Now remove the middle row of B B; B:=<B[1,1..-1] , B[-1,1..-1] >;
\[ \left [ \begin {array}{ccc} 7&8&10\\ \noalign {\medskip }14&15&16 \end {array} \right ] \]
#now set the diagonal elements of B to be 0 B:=RandomMatrix(3); for i from 1 to 3 do B[i,i]:=0; end do: B;
\[ B:=\left [ \begin {array}{ccc} 0&99&92\\ \noalign {\medskip }8&0&-31 \\ \noalign {\medskip }69&44&0\end {array} \right ] \] \[ \left [ \begin {array}{ccc} 0&99&92\\ \noalign {\medskip }8&0&-31 \\ \noalign {\medskip }69&44&0\end {array} \right ] \] To find inverse.
restart; with(LinearAlgebra): A:=Matrix( [ [2,0],[4,2] ]); MatrixInverse(A);
\[ \left [ \begin {array}{cc} 1/2&0\\ \noalign {\medskip }-1&1/2 \end {array} \right ] \]
To check that for any matrix A, then A*transpose(A) is always a matrix which is symmetrical
A:=RandomMatrix(2,3); A.Transpose(A);
\[ A:=\left [ \begin {array}{ccc} 99&44&-31\\ \noalign {\medskip }29&92&67 \end {array} \right ] \]
\[ \left [ \begin {array}{ccc} 99&44&-31\\ \noalign {\medskip }29&92&67 \end {array} \right ] \]
how to create a random lower triangular matrix?
restart; with(LinearAlgebra); A:=RandomMatrix(4,4,outputoptions=[shape=triangular[lower]]);
\[ \left [ \begin {array}{cccc} 67&0&0&0\\ \noalign {\medskip }-31&92&0&0 \\ \noalign {\medskip }44&29&99&0\\ \noalign {\medskip }69&8&27&-4 \end {array} \right ] \]
restart; with(LinearAlgebra); A:=RandomMatrix(5); LinearAlgebra:-Map[(i,j)->evalb(i=j)](x->1,A);
\[ A:= \left [ \begin {array}{ccccc} 1&-98&-76&-4&29\\ \noalign {\medskip }-38& 1&-72&27&44\\ \noalign {\medskip }-18&57&1&8&92\\ \noalign {\medskip }87& 27&-32&1&-31\\ \noalign {\medskip }33&-93&-74&99&1\end {array} \right ] \] \[ \left [ \begin {array}{ccccc} 1&-98&-76&-4&29\\ \noalign {\medskip }-38& 1&-72&27&44\\ \noalign {\medskip }-18&57&1&8&92\\ \noalign {\medskip }87& 27&-32&1&-31\\ \noalign {\medskip }33&-93&-74&99&1\end {array} \right ] \]
eq:=3*x^3+2*x^2+x+5=0; s:=[evalf(solve(eq,x))]; mul(s[i],i=1..nops(s));
Gives
restart; eq:=3*x+4*y+2*z=10; plot3d(solve(eq,z),x=-5..5,y=-5..5,axes=normal);
One can also use impliticplot3d
restart; with(plots): implicitplot3d(3*x+4*y+2*z=10, x=-5..5,y=-5..5, z=-20..20,axes=normal);
From http://www.mapleprimes.com/questions/40470-Trigonometric-Function-To-Sinc-Function
Maple doesn’t have a sinc function. If you mean the function sinc(x) = sin(x)/x, you could say something like
> eval(expr, {sin = (x -> x*sinc(x)), cos = (x -> (x+Pi/2)*sinc(x+Pi/2)), tan = (x -> x*sinc(x)/(x+Pi/2)/sinc(x+Pi/2))});
restart; with(LinearAlgebra): A:=Matrix([[1,0,1,0,1],[0,1,0,1,0]]); NullSpace(A); ColumnSpace(A);
Go to tools->optiopn, and Display, and select Maple notation for input display.
solve(x^2-sin(x),x); RootOf(-sin(_Z)+_Z^2) allvalues(%); RootOf(-sin(_Z)+_Z^2, 0.), RootOf(-sin(_Z)+_Z^2, .8767262154) evalf(%); 0., .8767262154
Use Map with filter
A:=< 1,2,3;4,5,6;7,8,9>; LinearAlgebra:-Map[(i,j)->evalb(i=j)](x->x+1,A);
Go to http://www.maplesoft.com/support/help/search.aspx
and type say updates,Maple17,DE in the small box there.
From http://www.mapleprimes.com/questions/201092-How-To-Insert-New-Paragraph-On-Its-Own by Carl Love:
I use these special keystrokes constantly in my Maple worksheet typing: Ctrl-J: Insert execution group below cursor. Ctrl-K: Insert execution group above cursor. Ctrl-T: Switch from executable code mode to text mode (for entering extended formatted comments). Ctrl-M: Switch from text mode to executable code mode. Shift-Enter (or Shift-Return): Begin a new line in the same execution group. Func-3: Split execution group into two (at cursor). Func-4: Join cursor execution group with execution group below.
Use the read command, as in read "mycode.mpl" where mycode.mpl is plain text file that contains maple code
New packages are module, which allows using packageName:-function() since it is easier. Old packages use tables which needs packageName[function]() which is not common.
To find if package is based on module or not, use the command
type(combstruct,'`module`');
This will return true or false. To know if name is package use the command
type(combstruct,'package');
file_name :=StringTools:-SubstituteAll(file_name,":","-");
restart; c:= i->([i/(1+i),0],1/(1+i)): d:= i->([1,1/i],1/i): geometry:-circle(c1,[geometry:-point(o,2/3,0),1/3],[x,y]): geometry:-circle(c2,[geometry:-point(o,1,1),1],[x,y]): geometry:-intersection(o,c1,c2,[u,v]): plots:-display(plottools:-circle(c(2)),plottools:-circle(d(1)),geometry:-draw(o));
To know more about the intersection, use this:
geometry:-detail(o);
Use symbolic option
restart; simplify(ln(3^x/2^y) =ln(n),symbolic);
How to convert \[ \frac {3+2\sinh (x)^2}{\sinh (x)^2\tanh (x)} \] to \[ 3 \coth ^3(x)-\coth (x) \]
restart; e := (3+2*sinh(x)^2)/(sinh(x)^2*tanh(x)); expand(student[changevar](sinh(x)^2=tanh(x)^2/(1-tanh(x)^2),e));
restart; try fd :=-1; fd := fopen("C:\\output3.txt",APPEND,TEXT); catch: print(`Unable to open file, error is`); print(StringTools:-FormatMessage(lastexception[2])); end try: if not(evalb(fd=-1)) then #file open ok str:="hello world"; try fprintf(fd,"%s\n",str); catch: print(`failed to append to file, error is`); print(StringTools:-FormatMessage(lastexception[2])); finally: close(fd); end try; fi:
To find in which library a command is do
with(LibraryTools); FindLibrary('int',all); #find which library command int is in "C:\Program Files\Maple 18\lib\update.mla", "C:\Program Files\Maple 18\lib\DEsAndMathematicalFunctions18.mla", "C:\Program Files\Maple 18\lib\maple.mla"
To get content of library do
restart; with(LibraryTools): LibLocation:=cat(kernelopts(mapledir),"/lib/maple.mla"); c:=ShowContents(LibLocation);
Then can use this to print the name of each symbol/command, and then use whattype command to find its type
seq(c[i,1],i=1..20);
To get list of Maple kernel builtin commands and symbols, use this. Written by Acer from Maple prime site:
restart: interface(warnlevel=0): started := false: T := 'T': for i from 1 to 1000 do f := eval(parse(cat("proc() option builtin=",i,"; end proc"))); p := (s->StringTools:-Take(s,StringTools:-Search(";",s)-1))(convert(eval(f),string)[26..]); if not type(parse(p),posint) then T[i] := p; started := true; else if started then i:=1000; next; end if; end if; end do: i; [ entries(T,nolist) ]; nops(%);
The above gives on Maple 18.02 the following
["crinterp", "equation", "`{}`", "even", "debugopts", "embedded_imaginary", "define_external", "embedded_real", "coeff", "cx_zero", "coeffs", "embedded_axis", "conjugate", "constant", "convert", "cx_infinity", "dlclose", "identical", "divide", "hfloat", "`done`", "function", "`$`", "fraction", "denom", "float", "degree", "finite", "disassemble", "extended_rational", "diff", "extended_numeric", "frem", "`union`", "frontend", "upperbound", "exports", "writeto", "factorial", "`xor`", "evalgf1", "type", "expand", "typematch", "entries", "unames", "evalb", "unbind", "`evalf/hypergeom/kernel`", "atomic", "hfarray", "anything", "hastype", "complex", "has", "boolean", "goto", "`:-`", "gmp_isprime", "`!`", "genpoly", "anyfunc", "gc", "algebraic", "SFloatMantissa", "ssystem", "Scale10", "`stop`", "Scale2", "sort", "SearchText", "`[]`", "`~`", "`subset`", "~Array", "subsindets", "~Matrix", "streamcall", "~Vector", "subs", "Unordered", "table", "ToInert", "system", "_hackwareToPointer", "substring", "UpdateSource", "subsop", "_maplet", "trunc", "_jvm", "`kernel/transpose`", "_treeMatch", "tcoeff", "_savelib", "taylor", "abs", "rtable_num_dims", "addressof", "rtable_num_elems", "_unify", "rtable_options", "_xml", "rtable_redim", "`and`", "rtable_scale", "andmap", "rtable_scanblock", "alias", "rtable_size", "anames", "rtable_sort_indices", "assign", "savelib", "assemble", "rtable_zip", "array", "select", "appendto", "searchtext", "cat", "series", "callback", "selectremove", "bind", "sign", "attributes", "setattribute", "ormap", "ArrayOptions", "order", "Array", "parse", "`**`", "overload", "`*`", "`::`", "numer", "CopySign", "numelems", "`^`", "`or`", "`||`", "op", "nops", "seq", "normal", "time", "`not`", "piecewise", "numboccur", "`?[]`", "userinfo", "modp2", "inner", "mods", "timelimit", "mvMultiply", "traperror", "negate", "rtable_normalize_index", "call_external", "rtable_is_zero", "assigned", "rtable_indfns", "evalf", "rtable_histogram", "eval", "evaln", "rtable_eval", "truefalse", "evalhf", "rtable_convolution", "tabular", "mul", "rtableInfo", "zppoly", "`if`", "rtable", "uneval", "remove", "sfloat", "rhs", "specfunc", "readlib", "string", "reduce_opr", "symbol", "ASSERT", "`?()`", "realcons", "TRACE", "`quit`", "relation", "_local", "pointto", "sequential", "add", "print", "set", "SFloatExponent", "iolib", "radical", "SDMPolynom", "`int/series`", "protected", "Record", "irem", "procedure", "Re", "iquo", "poszero", "isqrt", "real_infinity", "RETURN", "is_gmp", "ratpoly", "`+`", "lcoeff", "rational", "OrderedNE", "kernelopts", "range", "Object", "NumericEventHandler", "icontent", "numeric", "NumericStatus", "igcd", "odd", "NumericClass", "ilog10", "nonpositive", "NumericEvent", "ilog2", "nonreal", "`implies`", "posint", "NameSpace", "indets", "positive", "NextAfter", "indices", "polynom", "MPFloat", "`intersect`", "pos_infinity", "MorrBrilCull", "`<`", "member", "neg_infinity", "Im", "maxnorm", "name", "`<>`", "max", "negint", "`<=`", "map2", "negative", "modp1", "nonnegative", "FromInert", "modp", "negzero", "EqualStructure", "`minus`", "nonposint", "`>=`", "min", "nonnegint", "`>`", "DefaultUnderflow", "lexorder", "imaginary", "`=`", "lhs", "indexable", "ERROR", "ldegree", "indexed", "EqualEntries", "length", "integer", "macro", "list", "DEBUG", "map", "literal", "`..`", "lowerbound", "`module`", "Default0", "lprint", "moduledefinition", "DefaultOverflow"] 296
This one has one solution
eq:=diff(u(z),z$2)+(k-1)*diff(u(z),z)/z+lambda*exp(u(z))=0; sol:=dsolve({subs({k=1,lambda=2},eq),u(0)=1,u(1)=0},numeric,u(z), method=bvp[midrich],'abserr'=0.001); plots[odeplot](sol);
This solved coupled ODE’s, so there are 2 solutions. Say \(x_1(t)\) and \(x_2(r)\), It is a little tricky to plot all solutions generated, but here is an example
restart; R := 0.4; px := 32000; Mm := 0.1; Ds := 9; DO2 := 7.2; YXS := 0.3; KS := 10; Sp := 30; Cb := 8; KO2 := 0.2; R0 := 0.000001; YXO := 0.42857; Vs := px*1/YXS*(Mm*x2(r))/(KS + x2(r))*x1(r)/(KO2 + x1(r)); Vo := px*1/YXO*(Mm*x2(r))/(KS + x2(r))*x1(r)/(KO2 + x1(r)); eqs := diff(x1(r),r$2) + 2/r*diff(x1(r),r)= Vo/DO2, diff(x2(r),r$2) + 2/r* diff(x2(r),r)= Vs/Ds; ic:=D(x1)(R0)=0,x1(R) = Cb,D(x2)(R0)= 0, x2(R) = Sp; sol:=dsolve({eqs,ic},numeric,{x1(r),x2(r)},'abserr'=.52,'maxmesh'=1000,output=listprocedure);
And now to plot do
x1Sol:=rhs(sol[2]); plot(x1Sol(r),r=0..0.4); x2Sol:=rhs(sol[4]); plot(x2Sol(r),r=0..0.4);
For say Bessel ode of order zero:
eq:= x^2*diff(y(x),x$2)+x*diff(y(x),x)+x^2*y(x)=0; DEtools[indicialeq](eq,x,0,y(x)); #x^2 = 0
The third argument above is the singularity point of interest. So we have two roots, both zero. These are now used for finding the power series solution \(y(x)\) if needed.
Another example, is Bessel of order 1
eq:= x^2*diff(y(x),x$2)+x*diff(y(x),x)+(x^2-1)*y(x)=0; DEtools[indicialeq](eq,x,0,y(x)); #x^2-1 = 0
This below by Axel Vogt posted on sci.math.symbolic which does a nice job of formatting output to specific width.
split_for_print:=proc(expr, len) # expr = some Maple expression # len = length to split with line breaks local L,s,tmp,j; s:=convert(expr, string); L:=[StringTools:-LengthSplit(s, len)]; for j from 1 to nops(L) do # if j = nops(L) then printf("%s ;", L[-1]) if j = nops(L) then printf("%s", L[-1]) else printf("%s\\\n", L[j]); end if; end do: end proc; evalf[100](Pi); split_for_print(%, 40); 3.14159265358979323846264338327950288419\ 7169399375105820974944592307816406286208\ 998628034825342117068
for VIM
in vim, type set syntax=maple after putting the file maple.vim in ~/.vim/syntax/maple.vim. I found maple.vim in above link.
For Maple IDE
use packages(); to find what packages loaded. use unwith to remove package
packages(); [] with(DynamicSystems): packages(); [DynamicSystems] unwith(DynamicSystems); packages(); []
To write \(y'(x)=x\), one way is diff(y(x),x)=x and another is D(y)(x)=x. To write \(y''(x)=x\), one way is diff(y(x),x$2)=x and another is (D@@2)(y)(x)=x.
To convert from one form to another use convert(eq,diff) or convert(eq,D)
to solve \(\frac {\partial u(x,t)}{\partial t}=k \frac {\partial ^2 u(x,t)}{\partial x^2}\) with homogeneous dirichlet boundary conditions \(u(0,t)=0,u(L,t)=0\) the commands are
restart; pde:=diff(u(x,t),t)=k*diff(u(x,t),x$2); bc:=u(0,t)=0,u(L,t)=0; sol:=pdsolve([pde,bc]) assuming 0<L:
Which gives
\[ u \left ( x,t \right ) =\sum _{{\it \_Z1}=1}^{\infty }{\it \_C1} \left ( {\it \_Z1} \right ) \sin \left ( {\frac {\pi \,{\it \_Z1}\,x}{L}} \right ) {{\rm e}^{-{\frac {k{\pi }^{2}{{\it \_Z1}}^{2}t}{{L}^{2}}}}} \]
Which can be made more readable as follows
sol:=algsubs(_Z1=n,sol): sol:=algsubs(Pi*n/L=lambda(n),sol);
\[ u \left ( x,t \right ) =\sum _{n=1}^{\infty }{\it \_C1} \left ( n \right ) \sin \left ( x\lambda \left ( n \right ) \right ) {{\rm e}^{-kt \left ( \lambda \left ( n \right ) \right ) ^{2}}} \]
For homogeneous Neumann B.C., at \(x=0\), let \(\frac {\partial u}{\partial x}=0\) and at \(x=L\) let \(u(L,t)=0\), the solution it gives looks different than my hand solution
restart; pde:=diff(u(x,t),t)=k*diff(u(x,t),x$2); bc:=D[1](u)(0,t)=0,u(L,t)=0; pdsolve([pde,bc]) assuming 0<L;
It gives
\[ u \left ( x,t \right ) ={\it \_C3}\,{\it \_C2}\, \left ( {{\rm e}^{1/4\,{\frac {2\,i\pi \,xL-k{\pi }^{2}t}{{L}^{2}}}}}+{{\rm e}^{-1/4\,{\frac {\pi \, \left ( 2\,ixL+k\pi \,t \right ) }{{L}^{2}}}}} \right ) \]
I need to look more into the above and see if this comes out to be the same as my hand solution.
Another example, with initial conditions now given
restart; pde:=diff(u(x,t),t)=k*diff(u(x,t),x$2); bc:=D[1](u)(0,t)=0,u(L,t)=0; ic:=u(x,0)=f(x); sol:=pdsolve([pde,bc,ic],u(x,t)) assuming 0<L; sol1:=algsubs(_Z2=n,sol);
The result is
\[ u \left ( x,t \right ) =\sum _{n=1}^{\infty } \left ( 2\,{\frac {1}{L}{{\rm e}^{-1/4\,{\frac {k{\pi }^{2}t \left ( 1+2\,n \right ) ^{2}}{{L}^{2}}}}}\cos \left ( 1/2\,{\frac {\pi \,x \left ( 1+2\,n \right ) }{L}} \right ) \int _{0}^{L}f \left ( x \right ) \cos \left ( 1/2\,{\frac {\pi \,x \left ( 1+2\,n \right ) }{L}} \right ) \,{\rm d}x} \right ) \]
Another example
restart; pde:=diff(u(x,t),t)=k*diff(u(x,t),x$2); bc:=D[1](u)(0,t)=0,u(L,t)=0; ic:=u(x,0)=3*sin(Pi*x/L)-sin(3*Pi*x/L); sol:=pdsolve([pde,bc,ic],u(x,t)) assuming 0<L; sol1:=algsubs(_Z2=n,sol);
\[ u \left ( x,t \right ) =\sum _{n=1}^{\infty }768\,{\frac {1}{\pi \, \left ( 16\,{n}^{4}+32\,{n}^{3}-136\,{n}^{2}-152\,n+105 \right ) }{{\rm e}^{-1/4\,{\frac {k{\pi }^{2}t \left ( 1+2\,n \right ) ^{2}}{{L}^{2}}}}}\cos \left ( 1/2\,{\frac {\pi \,x \left ( 1+2\,n \right ) }{L}} \right ) } \]
Another example
restart; pde:=diff(u(x,t),t)=k*diff(u(x,t),x$2); bc:=u(0,t)=0,u(L,t)=0; ic:=u(x,0)=3*sin(Pi*x/L)-sin(3*Pi*x/L); sol:=pdsolve([pde,bc,ic],u(x,t)) assuming 0<L;
\[ u \left ( x,t \right ) =\sin \left ( {\frac {\pi \,x}{L}} \right ) {{\rm e}^{-9\,{\frac {{\pi }^{2}kt}{{L}^{2}}}}} \left ( -2\,\cos \left ( 2\,{\frac {\pi \,x}{L}} \right ) +3\,{{\rm e}^{8\,{\frac {{\pi }^{2}kt}{{L}^{2}}}}}-1 \right ) \]
The above answer seems wrong. There is not even a summation in it. It is different from my hand solution. Look more into it.
assume( A::AndProp(NonZero,constant) );
Now can use is(A,constant);
Add this
expr:=diff(y(x),x); Typesetting:-Settings(typesetprime=true, prime=x):
The above will display the expression as \(y'(x)\). To make it now show the \(x\) do
expr:=diff(y(x),x); Typesetting:-Settings(typesetprime=true, prime=x): Typesetting:-Suppress(y(x));
Now it will show the expression as just \(y'\). For all the above to work, make sure you have Typesetting level set to Extended in the GUI.
This is done inside Tools->Options->Display menu.
To clear all the above Typesetting, do restart or do Typesetting:-Unsuppress(y(x))
check for ‘=‘ as follows
eq:= x=1; whattype(eq); # `=` if whattype(eq) = `=` then print("yes"); else print("no"); fi; "yes"
check for ‘set‘ as follows
eq:= {diff(y(x),x)=1,x(0)=1}; if whattype(eq) = `set` then print("yes"); else print("no"); fi; "yes"
The Maple syntax for seeting initial and boundary conditions is very confusing, as compared to Mathematica, which seems to me to be simpler. So I wrote this to remind me of the syntax each time.
For PDE, assuming dependent variable is \(u(x,t)\) then
Conditions | Maple code |
\(u(0,t)=0\) | u(0,t)=0 |
\(\frac {\partial u}{\partial x}=0\) at \(x=0\) | D[1](u)(0,t)=0 |
\(\frac {\partial ^2 u}{\partial x^2}=0\) at \(x=0\) | D[1,1](u)(0,t)=0 |
\(\frac {\partial ^3 u}{\partial x^3}=0\) at \(x=0\) | D[1,1,1](u)(0,t)=0 |
\(\frac {\partial u}{\partial t}=0\) at \(t=0\) | D[2](u)(x,0)=0 |
\(\frac {\partial ^2 u}{\partial t^2}=0\) at \(t=0\) | D[2,2](u)(x,0)=0 |
\(\frac {\partial ^3 u}{\partial t^3}=0\) at \(t=0\) | D[2,2,2](u)(x,0)=0 |
Notice the syntax for the last one above. It is (D[1]@@2)(u)(0,t)=0 and not (D@@2)[1](u)(0,t)=0
For an ODE, assuming dependent variable is \(y(x)\) then the syntax is
Conditions | Maple code |
\(y(0)=0\) | y(0)=0 |
\(\frac {dy}{dx}=0\) at \(x=0\) | D(y)(0)=0 |
\(\frac {d^2 y}{d x^2}=0\) at \(x=0\) | (D@@2)(y)(0)=0 |
I could only find a way to export to eps
plotsetup(default): plotsetup(postscript, plotoutput=`t.eps`, plotoptions=`color,portrait,height=300`); plot(sin(x),x=-Pi..Pi,'gridlines'); plotsetup(default):
Make sure not to put : at the end of the plot command! else it will not be exported. It has to end with ;
This will same it to t.eps in the currentdir() location. Then used ps2pdf t.eps t.pdf to convert it to PDF. Or just ps2pdf t.eps it will automatically create t.pdf
Or ps2pdf -dCompatibilityLevel=1.4 t.eps but may it is best to do
ps2pdf -dCompatibilityLevel=1.4 -dEmbedAllFonts=true t.eps
Also try adding
-dPDFSETTINGS=/printer
to the above. This tells it to optimize it for printing.
Another example of a direction field for an ODE
plotsetup(postscript, plotoutput=`t0.eps`, plotoptions=`color,portrait,height=300`); ode:= diff(y(x),x) = 3*x^2 - 1; DEtools:-DEplot( ode, y(x), x=-2..2, [y(0) = 0], y=-2..2, linecolour=red, color = blue, stepsize=.05,arrows=MEDIUM ); plotsetup(default);
To find roots of \( (3+4 i)^{1/3}\), do
fsolve(z^3=(3+4*I),z); #gives -1.26495290635775+1.15061369838445*I, -.363984239564424-1.67078820068900*I, 1.62893714592218+.520174502304545*I
A:= Matrix(2, 2, {(1, 1) = 0, (1, 2) = 0, (2, 1) = 0, (2, 2) = 2}); f:=x->`if`(x<>0,x*LinearAlgebra:-IdentityMatrix(2),0*Matrix(2)); B:=map(f,A);
Which gives
\[ \left [ \begin {array}{cc} \left [ \begin {array}{cc} 0&0 \\ \noalign {\medskip }0&0\end {array} \right ] & \left [ \begin {array} {cc} 0&0\\ \noalign {\medskip }0&0\end {array} \right ] \\ \noalign {\medskip } \left [ \begin {array}{cc} 0&0 \\ \noalign {\medskip }0&0\end {array} \right ] & \left [ \begin {array} {cc} 2&0\\ \noalign {\medskip }0&2\end {array} \right ] \end {array} \right ] \]
now
r:=Matrix(convert(B,listlist))
Gives
\[ \left [ \begin {array}{cccc} 0&0&0&0\\ \noalign {\medskip }0&0&0&0 \\ \noalign {\medskip }0&0&2&0\\ \noalign {\medskip }0&0&0&2\end {array} \right ] \]
Maple has a simple but easy to use pattern matching, which works well. Here are some example. For each case, will show what pattern to detect and how to do it. I am still not very good at pattern matching in Maple and will need to make improvement in this with time.
Detect \(\sqrt (x y)\) in expression.
restart; expr:= sin(x)*sqrt(x*y); if patmatch(expr,a::anything*(b::anything*x*y)^(c::anything),'la') then assign(la); if c =1/2 or c=-1/2 then print("found sqrt(x*y)"); else print("did not find sqrt(x*y)"); fi; fi;
But if the expression was \(\sin (x)\sqrt {x y}+3\) then the above would fail, because there are a term after \(\sqrt {x y}\), so the pattern has to change to
restart; expr:= sin(x)*sqrt(x*y)+3; if patmatch(expr,a::anything*(b::anything*x*y)^(c::anything)+d::anything,'la') then assign(la); if c =1/2 or c=-1/2 then print("found sqrt(x*y)"); else print("did not find sqrt(x*y)"); fi; fi;
use trigsubs, very useful command. For example
trigsubs(cos(theta)^3)
Gives
\[ [1/2\,\cos \left ( \theta \right ) +1/2\,\cos \left ( 2\,\theta \right ) \cos \left ( \theta \right ) ,1/4\,\cos \left ( 3\,\theta \right ) +3/4\,\cos \left ( \theta \right ) ] \]
Given \(f(x,y,z)=x^2 z+y^3 z^2-xyz\) we want to find its directional derivative along the vector \(n\).
One way
n:=<-1,0,3>; g:=VectorCalculus[Gradient](x^2*z+y^3*z^2-x*y*z, [x,y,z]); Student[VectorCalculus][DotProduct](g,n/LinearAlgebra[Norm](n,2))
Gives
\[ -{\frac { \left ( 2\,xz-yz \right ) \sqrt {10}}{10}}+{\frac { \left ( 6\,{y}^{3}z+3\,{x}^{2}-3\,xy \right ) \sqrt {10}}{10}} \]
Another is
Student[MultivariateCalculus][DirectionalDerivative](x^2*z+y^3*z^2-x*y*z, [x,y,z], [-1,0,3]);
Gives the same result.
For simple variable, use assigned
restart; x:=10: assigned(x) true assigned(y) false
For a field in table do
restart; A:=table(["x"=10,"y"=20]): assigned(A["x"]) true assigned(A["z"]) false
For field in Record, I do not know how yet, other than using try catch, as assigned does not seem to work for Record fields.
restart; A:=Record('x'=10,'y'=20); try assigned(A:-x) catch: print("no such field in record") end try; true try assigned(A:-z) catch: print("no such field in record") end try; "no such field in record"
Use dsolve(ode,Lie)
To find symmetries, do
DEtools:-symgen(ode,y(x),HINT=[c__1+c__2*x+c__3*y,c__4+c__5*x+c__6*y])
or just
DEtools:-symgen(ode,y(x))
To debug it do
stopat(`ODEtools/symgen`); before calling dsolve or DEtools:-symgen
Given
\[ 3+x +\sqrt {-4 a c +b^{2}}+\sin \left (y \right )+x^{3} \sqrt {39}+\sqrt {\cos }x \] Find terms that are sqrt. Use indets
restart; expr_with_radical:= 3+x+sqrt(b^2-4*a*c)+sin(y)+x^3*sqrt(39)+sqrt(cos(x));| indets(expr_with_radical, algebraic^fraction)
\( \{ \sqrt {39}, \sqrt {-4 a c +b^{2}}, \sqrt {\cos }x \} \)
Alternative is to use type radical
restart; expr_with_radical:= 3+x+sqrt(b^2-4*a*c)+sin(y)+x^3*sqrt(39)+sqrt(cos(x));| indets(expr_with_radical, radical)
\( \{ \sqrt {39}, \sqrt {-4 a c +b^{2}}, \sqrt {\cos }x \} \)
given \[ {\mathrm e}^{\frac {2 \ln \left (\sqrt {p^{2}+1}+p \right )+2 \ln \left (a \right )+\ln \left (p^{2}+1\right ) a}{2 a}}+{\mathrm e}^{3 x} \]
simplify(expr) does not work. So tried subsindets
restart; expr := exp((2*ln(sqrt(p^2 + 1) + p) + 2*ln(a) + ln(p^2 + 1)*a)/(2*a))+ exp(3*x); subsindets(expr,'specfunc( anything, exp )',f->(`if`(has(op(1,f),'ln'),expand(f),f)))
\[ \left (\sqrt {p^{2}+1}+p \right )^{\frac {1}{a}} a^{\frac {1}{a}} \sqrt {p^{2}+1}+{\mathrm e}^{3 x} \]
It is possible to also try simplify(expr,exp) in some cases, but for the above example, this did not work, i.e. it did not simplify it.
I wanted to simplify an expression which could have csgn() in it, and find all the arguments.
\[ \frac {1+\mathrm {csgn} \left (a \right ) a}{3 \mathrm {csgn} \left (b \right ) b} \] One way is
restart; expr:=(1+csgn(a)*a)/(3*csgn(b)*b): expr:=subsindets(expr,'specfunc( anything, csgn )',f->1);
\[ \frac {1+a}{3 b} \]
Given sol:=1/2*2^(1/2)*csgn(x)*x*csgn(y); how to find all symbols inside csgn which will be \(x,y\) in this case?
restart; sol:=1/2*2^(1/2)*csgn(x)*x*csgn(y); indets(sol,'specfunc( anything, csgn )'); vars:=subsindets(%,'specfunc( anything, csgn )',f->op(f))
Gives {x, y}
Now if we want to simplify the above solution by assuming that all variables inside vars are positive, how to do that?
restart; sol:=1/2*2^(1/2)*csgn(x)*x*csgn(y); indets(sol,'specfunc( anything, csgn )'); vars:=subsindets(%,'specfunc( anything, csgn )',f->op(f)); simplify(sol) assuming op(map2(`<`,0,vars))
Gives \(\frac {\sqrt {2}\, x}{2}\). Notice in the above the use of op(map2(`<`,0,vars)), this will generate the sequence 0 < x, 0 < y automatically. op is needed otherwise the result will be {0 < x, 0 < y} which will give syntax error when passed to assuming
Ofcourse, it would have been also possible to just write
simplify(sol) assuming positive;
And get the same result. But sometimes we might want to specify which variables are to be assumed positive and not all of them at once in the expression.
I wanted to replace |expr| by (expr)
One way is
restart; expr:=u(x) = _C1*exp(-3*x^(1/3)*sqrt(c))*(3*x^(1/3)*sqrt(c) + 1) + _C2*exp(3*x^(1/3)*sqrt(c))*abs(-1 + 3*x^(1/3)*sqrt(c));
\[ u \left (x \right ) = \textit {\_C1} \,{\mathrm e}^{-3 x^{\frac {1}{3}} \sqrt {c}} \left (3 x^{\frac {1}{3}} \sqrt {c}+1\right )+\textit {\_C2} \,{\mathrm e}^{3 x^{\frac {1}{3}} \sqrt {c}} {| -1+3 x^{\frac {1}{3}} \sqrt {c}|} \]
expr:=subsindets(expr,'specfunc( anything, abs )',f->op(f));
\[ u \left (x \right ) = \textit {\_C1} \,{\mathrm e}^{-3 x^{\frac {1}{3}} \sqrt {c}} \left (3 x^{\frac {1}{3}} \sqrt {c}+1\right )+\textit {\_C2} \,{\mathrm e}^{3 x^{\frac {1}{3}} \sqrt {c}} \left (-1+3 x^{\frac {1}{3}} \sqrt {c}\right ) \]
Given \[ \left [\begin {array}{cccc}1 & -1 & 0 & 2 \\1 & 2 & 2 & -2 \\0 & 2 & 3 & -1 \end {array}\right ] \]
Find its Null, Row and Column space basis vectors.
restart; A:=Matrix([[1,-1,0,2],[1,2,2,-2],[0,2,3,-1]]); LinearAlgebra:-NullSpace(A)
\[ \left \{ \left [\begin {array}{c}0 \\2 \\-1 \\1 \end {array}\right ] \right \} \]
restart; A:=Matrix([[1,-1,0,2],[1,2,2,-2],[0,2,3,-1]]); LinearAlgebra:-RowSpace(A)
\[ \left [\left [\begin {array}{cccc}1 & 0 & 0 & 0 \end {array}\right ], \left [\begin {array}{cccc}0 & 1 & 0 & -2 \end {array}\right ], \left [\begin {array}{cccc}0 & 0 & 1 & 1 \end {array}\right ]\right ] \]
restart; A:=Matrix([[1,-1,0,2],[1,2,2,-2],[0,2,3,-1]]); LinearAlgebra:-ColumnSpace(A)
\[ \left [\left [\begin {array}{c}1 \\0 \\0 \end {array}\right ], \left [\begin {array}{c}0 \\1 \\0 \end {array}\right ], \left [\begin {array}{c}0 \\0 \\1 \end {array}\right ]\right ] \]
Given \[ \left [\begin {array}{cccc}1 & -4 & -3 & -7 \\2 & -1 & 1 & 7 \\1 & 2 & 3 & 11 \end {array}\right ] \]
Find the new form after Gaussian elimination
restart; A:=Matrix([[1,-4,-3,-7],[2,-1,1,7],[1,2,3,11]]); LinearAlgebra:-GaussianElimination(A);
\[ \left [\begin {array}{cccc}1 & -4 & -3 & -7 \\2 & -1 & 1 & 7 \\1 & 2 & 3 & 11 \end {array}\right ] \]
Given matrix \[ \left [\begin {array}{ccc}5 & 2 & 18 \\0 & 1 & 4 \\4 & 1 & 12 \end {array}\right ] \]
Find its Reduced Echelon form.
restart; A:=Matrix([[5,2,18],[0,1,4],[4,1,12]]); Student:-LinearAlgebra:-ReducedRowEchelonForm(A)
\[ \left [\begin {array}{ccc}1 & 0 & 2 \\0 & 1 & 4 \\0 & 0 & 0 \end {array}\right ] \]
Another option is
restart; A:=Matrix([[5,2,18],[0,1,4],[4,1,12]]); MTM:-rref(A)
\[ \left [\begin {array}{ccc}1 & 0 & 2 \\0 & 1 & 4 \\0 & 0 & 0 \end {array}\right ] \]
Given matrix \[ \left [\begin {array}{cc}1 & 1 \\2 & 3 \\4 & 5 \end {array}\right ] \] How to add row \[ [a, b] \] to end of the matrix?
restart; A:=Matrix([[1,1],[2,3],[4,5]]); the_row:=convert([a,b],Vector['row']); ArrayTools:-Concatenate(1,A,the_row);
\[ \left [\begin {array}{cc}1 & 1 \\2 & 3 \\4 & 5 \\a & b \end {array}\right ] \]
For an example, How to find list of all \(\ln \) functions in this expression?
\[ \ln \left ({| x +1|}\right )+2 x \ln \left (x \right )+\sin \left (x \right ) \]
restart; expr:=ln(abs(x+1))+2*x*ln(x)+sin(x); tmp := indets(expr,'specfunc(anything,ln)'); # tmp := {ln(x), ln(abs(x + 1))}
To pick only \(\ln \) functions which has \(abs\) inside them anywhere, replace the above with
restart; expr:=ln(abs(x+1))+2*x*ln(x)+sin(x); lis:=indets(expr,'specfunc(anything,ln)'); select(Z->has(Z,abs),lis) # tmp := {ln(abs(x + 1))}
Or, better alternative to the above is
restart; expr:=ln(abs(x+1))+2*x*ln(x)+sin(x); indets(expr,'specfunc( satisfies(u->has(u,abs)) ,ln )'); # tmp := {ln(abs(x + 1))}
Given
\[ \sin \left (x \right )+\ln \left ({| x |}\right )+\ln \left (x +\frac {{| y |}}{\sqrt {{| x +3|}}}\right )+\ln \left (x^{3}\right )+\cos \left ({| x |}\right ) \]
How to remove the absolute, the ones only inside each \(\ln \) in the above expression?
restart; expr:=sin(x)+ln(abs(x))+ln(x+abs(y)/sqrt(abs(x+3)))+ln(x^3)+cos(abs(x)); expr:=evalindets(expr,'specfunc(ln)',f->evalindets(f,'specfunc(abs)',f->op(1,f))) # sin(x) + ln(x) + ln(x + y/sqrt(x + 3)) + ln(x^3) + cos(abs(x))
\[ \sin \left (x \right )+\ln \left (x \right )+\ln \left (x +\frac {y}{\sqrt {x +3}}\right )+\ln \left (x^{3}\right )+\cos \left ({| x |}\right ) \]
Given
\[ -\frac {\left (\ln \left (\frac {\left (b +\sqrt {b^{2}+y \left (x \right )^{2}}\, \mathrm {signum}\left (b \right )\right ) b}{y \left (x \right )}\right )+\ln \left (2\right )\right ) \mathrm {signum}\left (b \right )}{b} = \mathit {\_C1} +\frac {-\ln \left (a \right )+\ln \left (x \right )-\ln \left (a +\sqrt {a^{2}+x^{2}}\, \mathrm {signum}\left (a \right )\right )-\ln \left (2\right )}{{| a |}} \]
How to find all arguments of signum and simplify the above by assuming they are all positive?
restart; expr:=-(ln((b + sqrt(b^2 + y(x)^2)*signum(b))*b/y(x)) + ln(2))*signum(b)/b = _C1 + (-ln(a) + ln(x) - ln(a + sqrt(a^2 + x^2)*signum(a)) - ln(2))/abs(a); lis:=indets(expr,'specfunc(anything,signum)'); assum:=convert(map(x->op(1,x)>0,lis),list); simplify(expr,assume=assum);
\[ \frac {-\ln \left (b \right )-\ln \left (\frac {b +\sqrt {b^{2}+y \left (x \right )^{2}}}{y \left (x \right )}\right )-\ln \left (2\right )}{b} = \frac {\mathit {\_C1} a -\ln \left (a \right )-\ln \left (a +\sqrt {a^{2}+x^{2}}\right )+\ln \left (x \right )-\ln \left (2\right )}{a} \]
Given
\[ -\frac {\left (\ln \left (\frac {\left (b +\sqrt {b^{2}+y \left (x \right )^{2}}\, \mathrm {signum}\left (b \right )\right ) b}{y \left (x \right )}\right )+\ln \left (2\right )\right ) \mathrm {signum}\left (b \right )}{b} = \mathit {\_C1} +\frac {-\ln \left (a \right )+\ln \left (x \right )-\ln \left (a +\sqrt {a^{2}+x^{2}}\, \mathrm {signum}\left (a \right )\right )-\ln \left (2\right )}{{| a |}} \]
How to replace all signum by 1?
restart; expr:=-(ln((b + sqrt(b^2 + y(x)^2)*signum(b))*b/y(x)) + ln(2))*signum(b)/b = _C1 + (-ln(a) + ln(x) - ln(a + sqrt(a^2 + x^2)*signum(a)) - ln(2))/abs(a); evalindets(expr, 'specfunc(anything,signum)', f -> 1);
\[ -\frac {\ln \left (\frac {\left (b +\sqrt {b^{2}+y \left (x \right )^{2}}\right ) b}{y \left (x \right )}\right )+\ln \left (2\right )}{b} = \textit {\_C1} +\frac {-\ln \left (a \right )+\ln \left (x \right )-\ln \left (a +\sqrt {a^{2}+x^{2}}\right )-\ln \left (2\right )}{{| a |}} \]
given an ode
\[ y \left (x \right ) = \left (\frac {d}{d x}y \left (x \right )\right )^{3} y \left (x \right )^{2}+2 x \left (\frac {d}{d x}y \left (x \right )\right ) \]
do change of variable \(u(x)=y(x)^2\)
restart; ode:=y(x)=diff(y(x),x)^3*y(x)^2+2*x*diff(y(x),x); new_ode:=PDEtools:-dchange({y(x)=sqrt(u(x))},ode,{u});
\[ \sqrt {u \left (x \right )} = \frac {\left (\frac {d}{d x}u \left (x \right )\right )^{3}}{8 \sqrt {u \left (x \right )}}+\frac {x \left (\frac {d}{d x}u \left (x \right )\right )}{\sqrt {u \left (x \right )}} \]
given an ode
\[ \frac {d^{2}}{d t^{2}}y \left (t \right )+y \left (t \right ) = 2 t \]
do change of variable \(t=\tau + \pi \)
restart; ode:=diff(y(t),t$2)+y(t)=2*t; PDEtools:-dchange({t=tau+Pi},ode,known={t},unknown={tau},params=Pi)
\[ \frac {d^{2}}{d \tau ^{2}}y \left (\tau \right )+y \left (\tau \right ) = 2 \tau +2 \pi \]
it is important to use params=Pi. Watch what happens if we do not do that
restart; ode:=diff(y(t),t$2)+y(t)=2*t; PDEtools:-dchange({t=tau+Pi},ode,known={t},unknown={tau});
\[ \frac {d^{2}}{d \tau ^{2}}y \left (\tau , \pi \right )+y \left (\tau , \pi \right ) = 2 \tau +2 \pi \] Which is not what we want.
This verifies solution given in https://math.stackexchange.com/questions/3477732/can-t-see-that-an-ode-is-equivalent-to-a-bessel-equation Where a change of variables on \[ \xi ^2 \frac {d^2\eta }{d\xi ^2} + \xi \frac {d\eta }{d\xi } - (\xi ^2+n^2)\eta =0 \] Was made using \[ \eta =\frac {y}{x^\alpha }, \quad \xi =\beta x^\gamma , \] To produce the ode \[ \frac {d^2y}{dx^2} - \frac {(2\alpha -1)}{x}\frac {dy}{dx} - (\beta ^2 \gamma ^2 x^{2\gamma -2}+\frac {n^2\gamma ^2-\alpha ^2}{x^2})y=0. \] In Maple the above is done using
restart; ode := zeta^2*diff(eta(zeta),zeta$2) + zeta*diff(eta(zeta),zeta) - (zeta^2 + n^2)*eta(zeta) = 0; the_tr:={zeta=beta*x^gamma,eta(zeta)=y(x)/x^alpha}; PDEtools:-dchange(the_tr,ode,{y(x),x},'known'={eta(zeta)},'uknown'={y(x)},'params'={alpha,beta,gamma}); simplify(%); numer(lhs(%))=0; simplify(numer(lhs(%))/(x^(1-alpha)))=0; numer(lhs(%))=0; collect(%,[y(x),diff(y(x),x),diff(y(x),x$2)]);
Which gives \[ \left (-\gamma ^{2} x^{-1+2 \gamma } \beta ^{2} x -\gamma ^{2} n^{2}+\alpha ^{2}\right ) y \left (x \right )+\left (-2 \alpha x +x \right ) \left (\frac {d}{d x}y \left (x \right )\right )+x^{2} \left (\frac {d^{2}}{d x^{2}}y \left (x \right )\right ) = 0 \]
Here is another example. Here to make change of variables to polar coordinates by making \(x=r \cos \theta \) and \(y=r \sin \theta \) The ode is \[ \frac {y-x y'}{\sqrt {1+(y')^2}}=x^2+y^2 \]
In Maple
restart; ode := (y(x)-x*diff(y(x),x))/sqrt(1+ diff(y(x),x)^2) = x^2+y(x)^2; the_tr:={x=r(t)*cos(t),y(x)=r(t)*sin(t)}; PDEtools:-dchange(the_tr,ode,{r(t),t},'known'={y(x)},'uknown'={r(t)});
Which gives
\[ \frac {r \left (t \right ) \sin \left (t \right )-\frac {r \left (t \right ) \cos \left (t \right ) \left (\left (\frac {d}{d t}r \left (t \right )\right ) \sin \left (t \right )+r \left (t \right ) \cos \left (t \right )\right )}{\left (\frac {d}{d t}r \left (t \right )\right ) \cos \left (t \right )-r \left (t \right ) \sin \left (t \right )}}{\sqrt {1+\frac {\left (\left (\frac {d}{d t}r \left (t \right )\right ) \sin \left (t \right )+r \left (t \right ) \cos \left (t \right )\right )^{2}}{\left (\left (\frac {d}{d t}r \left (t \right )\right ) \cos \left (t \right )-r \left (t \right ) \sin \left (t \right )\right )^{2}}}} = r \left (t \right )^{2} \left (\cos ^{2}\left (t \right )\right )+r \left (t \right )^{2} \left (\sin ^{2}\left (t \right )\right ) \]
Here is another example. Where we want to change \(R(r)\) to \(y(x)\) everywhere
\[ \frac {d^{2}}{d r^{2}}R \left (r \right )+\frac {d}{d r}R \left (r \right )+R \left (r \right ) = 0 \]
restart; ode:=diff(R(r),r$2)+diff(R(r),r)+R(r)=0; the_tr:={r=x,R(r)=y(x)}; PDEtools:-dchange(the_tr,ode,{y(x),x},'known'={R(r),r},'uknown'={y(x),x});
\[ \frac {d^{2}}{d x^{2}}y \left (x \right )+\frac {d}{d x}y \left (x \right )+y \! \left (x \right ) = 0 \]
The format of the transformation is old_independent_variable=new_independent_variable and old_dependent_variable=new_dependent_variable
Use LinearAlgebra:-Adjoint and then transpose the result. Since the Adjoint is the transpose of the cofactor.
Given
\[ \left [\begin {array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 10 \end {array}\right ] \]
then
restart; A:=Matrix([[1,2,3],[4,5,6],[7,8,10]]); LinearAlgebra:-Transpose(LinearAlgebra:-Adjoint(A))
\[ \left [\begin {array}{ccc} 2 & 2 & -3 \\ 4 & -11 & 6 \\ -3 & 6 & -3 \end {array}\right ] \]
Make a phase plot of \[ \frac {d^{2}}{d t^{2}}x \left (t \right )+\frac {\frac {d}{d t}x \left (t \right )}{2}+x \left (t \right ) = u \left (t \right ) \]
By plotting \(x(t)\) vs \(x'(t)\) without solving the ODE.
restart; alias(DS=DynamicSystems): ode := diff(x(t),t$2) +1/2*diff(x(t),t)+ x(t) = u(t); sys:=DS:-DiffEquation(ode,'outputvariable'=[x(t)],'inputvariable'=[u(t)]); sys0:=DS:-StateSpace(sys); eq1:=diff(x1(t),t)=sys0:-a[1,..].Vector([x1(t),x2(t)]); eq2:=diff(x2(t),t)=sys0:-a[2,..].Vector([x1(t),x2(t)]); DEtools:-DEplot([eq1,eq2],[x1(t),x2(t)],t=0..35,[[x1(0)=1,x2(0)=1]],x1=-2..2,x2=-2..2, numpoints=200, linecolor=black, axes=boxed);
When finding eigenvectors of matrix, using LinearAlgebra, the vectors are not normalized. How to normalized them so the length is one?
One way is
restart; LA:=LinearAlgebra; Sx:=Matrix([[0,1,0],[1,0,1],[0,1,0]]); #this finds eigenvectors in v lam,v:=LA:-Eigenvectors(Sx); #this normalize it B:=map(n -> v[.., n]/norm(v[.., n], 2), [$1..LA:-RowDimension(v)]): B:=`<|>`(op(B)); #this converts the list back to matrix.
\[ v=\left [\begin {array}{ccc} -1 & 1 & 1 \\ 0 & \sqrt {2} & -\sqrt {2} \\ 1 & 1 & 1 \end {array}\right ] \]
\[ B=\left [\begin {array}{ccc} -\frac {\sqrt {2}}{2} & \frac {1}{2} & \frac {1}{2} \\ 0 & \frac {\sqrt {2}}{2} & -\frac {\sqrt {2}}{2} \\ \frac {\sqrt {2}}{2} & \frac {1}{2} & \frac {1}{2} \end {array}\right ] \]
Given expression \(3 \sin \left (x \right )+t +3 f \left (x , t\right ) t +g \left (x , t\right )\) find if it contains function \(f()\).
Use indets with specfunc(f)
restart; expr := 3*sin(x)+t+3*f(x,t)*t+g(x,t); res := indets(expr, specfunc(f)); if numelems(res)<>0 then print("Found f(x,t)"); else print("could not find f(x,t)"); fi;
"Found f(x,t)"
Given expression \(3 \sin \left (x \right )+t +3 f \left (x , t\right ) t +g \left (x , t\right )\) find all functions, if any, in the expression.
Use indets with function
restart; expr := 3*sin(x)+t+3*f(x,t)*t+g(x,t); res := indets(expr,function); if numelems(res)<>0 then print("Found these functions",res); else print("could not find any function)"); fi;
"Found these functions", {f(x, t), g(x, t), sin(x)}
Given expression \(3 \sin \left (x \right )+t +3 f \left (x , t\right ) t +g \left (x , t\right )\) find all functions, if any, in the expression but exclude the math functions such as \(\sin \) in the above.
restart; expr := 3*sin(x)+t+3*f(x,t)*t+g(x,t); res := indets(expr, And( function, Not(typefunc(mathfunc)))); if numelems(res)<>0 then print("Found these functions",res); else print("could not find any function)"); fi;
"Found these functions", {f(x, t), g(x, t)}
use op
restart; op(1..,f(x,t)) x, t
Note that op(0,f(x,t)) finds the function name.
restart; expr := 3*sin(z)+t+3*f(z,t,y)*t+g(x,t); res := indets(expr, patfunc(identical(z), anything)); if numelems(res)<>0 then print("Found these functions",res); else print("could not find any function)"); fi;
gives
"Found these functions", {f(z, t, y), sin(z)}
expr := 3*sin(z)+t+3*f(z,t,y)*t+g(x,t); res := indets(expr, patfunc(anything, identical(t), anything)); if numelems(res)<>0 then print("Found these functions",res); else print("could not find any function)"); fi;
gives
"Found these functions", {f(z, t, y), g(x, t)}
expr:=`ℏ`*x
gives
\[ \hslash x \]
Notice, the ; is needed. This `&hbar`*x will not work. It must be `ℏ`*x
First example
restart; VectorCalculus:-SetCoordinates( 'cartesian'[x,y,z] ); F:=VectorCalculus:-VectorField(<y,-x,0>);
\begin {align*} F &= y \mathbf {\bar {e}_{x}}-x \mathbf {\bar {e}_{y}} \end {align*}
And now
VectorCalculus:-Curl(F);
\[ -2 \mathbf {\bar {e}_{z}} \]
Second example
restart; VectorCalculus:-SetCoordinates( 'cartesian'[x,y,z] ); F:=VectorCalculus:-VectorField(<y*z^2,x*z^2+2,2*x*y*z-1>);
\begin {align*} F &= y \,z^{2} \mathbf {\bar {e}_{x}}+(x \,z^{2}+2) \mathbf {\bar {e}_{y}}+(2 x y z -1) \mathbf {\bar {e}_{z}} \end {align*}
And now
VectorCalculus:-Curl(F);
\[ 0 \] Since Curl is zero, field is conservative.
Third example, in cylinderical coodinates
restart; VectorCalculus:-SetCoordinates( 'cylindrical'[rho,phi,z] ); F:=VectorCalculus:-VectorField(<0,-rho,2>);
\begin {align*} F &= -\rho \mathbf {\bar {e}_{\phi }}+2 \mathbf {\bar {e}_{z}} \end {align*}
And now
VectorCalculus:-Curl(F);
\[ 2 \mathbf {\bar {e}_{z}} \]
Use Student:-LinearAlgebra:-GaussJordanEliminationTutor( A, output=steps ) Where \(A\) is your augmented matrix.
Do not use the Maple command LinearAlgebra:-ColumnSpace for this. it gives the columns in the RREF. The correct way is to obtain the corresponding columns of the pivot columns in the original matrix \(A\). Hence use the command Basis like this
A:=Matrix([[1,0,0],[1,1,1]]); LinearAlgebra:-Basis([seq(A[..,i],i=1..LinearAlgebra:-ColumnDimension(A) )]);
Which gives
\[ \left [\left [\begin {array}{c} 1 \\ 1 \end {array}\right ], \left [\begin {array}{c} 0 \\ 1 \end {array}\right ]\right ] \]
If you use ColumnSpace command you’ll get this
A:=Matrix([[1,0,0],[1,1,1]]); LinearAlgebra:-ColumnSpace(A);
\[ \left [\left [\begin {array}{c} 1 \\ 0 \end {array}\right ], \left [\begin {array}{c} 0 \\ 1 \end {array}\right ]\right ] \]
These are different. Basis is the correct command to use, which matches the standard definition in textbooks.
Given expression such as \(3+(1+x)\sin x\) or \(3+(1+x)\sin ^2 x\) use select to find any polynomial * sin^n subexpressions.
restart; mytype_1 := ''`*`'( {polynom(And(algebraic, satisfies(u -> not has(u, I))),x), Or( 'specfunc(sin)'^integer, 'specfunc(sin)') } )'; select(type, 3+(1+x)*sin(x),mytype_1); select(type, 3+(1+x)*sin(x)^2,mytype_1);
Gives
(1 + x) sin(x) 2 (1 + x) sin(x)
restart; my_type:=''`*`'( { Or('specfunc'(sin),'specfunc'(sin)^Or(integer,rational)), Or('specfunc'(cos),'specfunc'(cos)^Or(integer,rational))})'; type(sin(x)^2*cos(x)^3,my_type); type(sin(x)^2*cos(x),my_type); type(sin(x)*cos(x),my_type); type(cos(x)*sin(x)^(1/2),my_type); true true true true
I could not find a way to avoid writing Or('specfunc'(sin),'specfunc'(sin)^Or(integer,rational) in order to match both \(\sin x\) and \(\sin ^2 x\). For these things, I find Mathematica patterns more flexiable. The above can be done as follows in Mathematica
ClearAll[x,n,m,any] patt=any_.*Sin[_]^n_. * Cos[_]^m_. MatchQ[Sin[x]^2*Cos[2*x]^3,patt] MatchQ[Sin[x]^2*Cos[x],patt] MatchQ[Sin[x]*Cos[x],patt] MatchQ[Cos[x]*Sin[x],patt] True True True True
In Mathematica n_. says basically to match \(\sin x\) or \(\sin ^2 x\) since the dot says to match zero or more. So no need to duplicate things as I did above in Maple. There might be a way to do the same in Maple using structured type, but I could not find it. In General, I find patterns in Mathematica more flexible and easier to use for this sort of thing. Maple has patmatch command, but not as easy to use as Patterns in Mathematica.
In Maple 2021, it is now possible to use object:-method(arg) notation. This makes is easier to use OOP in maple. To do this, use _self as follows
restart; person:=module() option object; local name::string:=""; local age::integer:=0; export get_name:=proc(_self,$) return _self:-name; end proc; export set_name:=proc(_self,name::string,$) _self:-name:=name; end proc; export get_age:=proc(_self,$) return _self:-age; end proc; export set_age:=proc(_self,age::integer,$) _self:-age:=age; end proc; end module;
And now make an object and use it as follows
o:=Object(person) o := Object<<1846759887808>> o:-get_name(); "" o:-get_age(); 0 o:-set_name("joe doe"); o:-get_name(); "joe doe"
Add ModuleCopy proc in the class. This will automatically be called to initialize the object.
Here is an example
restart; ODE:=module() option object; local ode:=NULL; local y::symbol; local x::symbol; local sol; export ModuleCopy::static := proc( _self::ODE, proto::ODE, ode, func, $ ) print("Initilizing object with with args: ", [args]); _self:-ode:= ode; _self:-y:=op(0,func); _self:-x:=op(1,func); end proc; export dsolve::static:=proc(_self,$) _self:-sol := :-dsolve(ode,y(x)); end proc; export get_sol::static:=proc(_self,$) return sol; end proc; end module;
And now make an object and use it as follows
o:=Object(ODE, diff(y(x),x)+y(x)=sin(x), y(x)); o:-dsolve(): o:-get_sol(); #y(x) = -1/2*cos(x) + 1/2*sin(x) + exp(-x)*_C1
So a constructor just makes it easier to initialize the object without having to make a number of set() calls to initialize each memeber data.
This is done using overload with different ModuleCopy proc in the class.
Here is an example. Lets make a constructor that takes an ode and initial conditions, and one that only takes an ode with no initial conditions.
restart; ODE:=module() option object; local ode:=NULL; local y::symbol; local x::symbol; local ic:=NULL; local sol; export ModuleCopy::static:= overload( [ proc( _self::ODE, proto::ODE, ode, func, $ ) option overload; _self:-ode:= ode; _self:-y:=op(0,func); _self:-x:=op(1,func); end proc, proc( _self::ODE, proto::ODE, ode, func, ic, $ ) option overload; _self:-ode:= ode; _self:-y:=op(0,func); _self:-x:=op(1,func); _self:-ic :=ic; end proc ] ); export dsolve::static:=proc(_self,$) if evalb(ic=NULL) then sol := :-dsolve(ode,y(x)); else sol := :-dsolve([ode,ic],y(x)); fi; end proc; export get_sol::static:=proc(_self,$) return sol; end proc; end module;
And now use it as follows
o:=Object(ODE, diff(y(x),x)+y(x)=sin(x), y(x), y(0)=0); o:-dsolve(): o:-get_sol(); #y(x) = -1/2*cos(x) + 1/2*sin(x) + 1/2*exp(-x) o:=Object(ODE, diff(y(x),x)+y(x)=sin(x), y(x)); o:-dsolve(): o:-get_sol(); #y(x) = -1/2*cos(x) + 1/2*sin(x) + exp(-x)*_C1
In the child class you want to extend from the parent class, add option object(ParentName);
Here is an example
restart; module ODE() option object; local ode; export set_ode::static:=proc(_self,ode,$) _self:-ode :=ode; end proc; export get_ode::static:=proc(_self,$) return _self:-ode; end proc; end module; #create class/module which extends the above module second_order_ode() option object(ODE); export get_ode_order::static:=proc(_self,$) return 2; end proc; end module;
In the above second_order_ode inherts all local variables and functions in the ODE class and adds new proc. Use as follows
o:=Object(second_order_ode); #create an object instance o:-set_ode(diff(y(x),x)=sin(x)); o:-get_ode(); o:-get_ode_order();
Note that the child class can not have its own variable with the same name as the parent class. This is limitation. in C++ for example, local variables in extended class overrides the same named variable in the parent class.
Even if the variable have different type, Maple will not allow overriding. For example, this will fail
restart; module ODE() option object; local ode; local id::integer; export set_ode::static:=proc(_self,ode,$) print("Enter ode::set_ode"); _self:-ode :=ode; end proc; export get_ode::static:=proc(_self,$) return _self:-ode; end proc; end module; module second_order_ode() option object(ODE); local id::string; export get_ode_order::static:=proc(_self,$) return 2; end proc; end module; Error, (in second_order_ode) local `id` is declared more than once
There might be a way to handle this, i.e. to somehow exlicitly tell Maple to override parant class proc or variable name in the child. I do not know now. The above is using Maple 2021.1
The trick is not to use static to override the base class function, and to use _self to refer to base class functions as own functions after extending. Also just use _self and not _self::person
Here is an example.
person:=module() option object; local age::integer:=100; export ModuleCopy::static:= proc(_self,proto::person, age::integer,$) _self:-age := age; end proc; export process::static:=proc(_self,$) local o; print("In base class process..."); if age<20 then o:=Object(young_person,age); o:-process(); else o:=Object(old_person,age); o:-process(); fi; end proc; local print_age::static:=proc(_self,$) print("age = ",_self:-age); end proc; end module; #---- extend the above class module young_person() option object(person); process:=proc(_self,$) print("In young_person process"); _self:-print_age(); end proc; end module; module old_person() option object(person); process::static:=proc(_self,$) print("In old_person process"); _self:-print_age(); end proc; end module;
Now to make 2 new classes that extend the above.
#---- extend the above class module young_person() option object(person); process:=proc(_self,$) print("In young_person process"); _self:-print_age(); end proc; end module; module old_person() option object(person); process::static:=proc(_self,$) print("In old_person process"); _self:-print_age(); end proc; end module;
Here is an example of usage
p:=Object(person,80); p:-process() "In base class process..." "In old_person process" "age = ", 80 p:=Object(person,10); p:-process() "In base class process..." "In young_person process" "age = ", 10
The above in Maple 2022.1
A Maple Object can be used a record type in other languags, such as Ada or Pascal. This example shows how to define a local type inside a proc and use it as record.
restart; foo:=proc(name::string,age::integer)::person_type; local person_type:=module() #this acts as a record type option object; export name::string; export age::integer; end module; local person::person_type:=Object(person_type); person:-name:=name; person:-age:=age; return person; end proc; o:=foo("joe doe",100); o:-name; "joe doe" o:-age; 100
In the above person is local variable of type person_type. In the above example, the local variable was returned back to user. But this is just an example. One can declare such variables and just use them internally inside the proc only. This method helps one organize related variables into one record type. The type can also be made global if needed.
use indets with type 'indexed'
expr:=16*a[3]+6*a[1]; terms:=indets(expr,'indexed'); terms := {a[1], a[3]} #to find maximum index, then do map(x->op(x),terms) {1, 3}
For integration do
Student:-Calculus1:-ShowSolution(Int(x*sin(x),x));
The steps are displayed. This does not work all the time. For example
integrand:=x*y(x)*diff(y(x),x$2)+x*(diff(y(x),x))^2-y(x)*diff(y(x),x); Student:-Calculus1:-ShowSolution(Int(integrand,x));
gives
Error, (in Student:-Calculus1:-ShowSolution) unable to determine which calculus operation is being applied in this problem; you can provide this information as the 2nd argument on your call to Rule or Hint
For differential equations, support is limited but these are the steps
restart; ode:=diff(y(x),x)=sin(x); Student:-ODEs:-ODESteps(ode)
Prints the steps. If IC is there, then
restart; ode:=diff(y(x),x)=sin(x); ic:=y(0)=1; Student:-ODEs:-ODESteps([ode,ic])
Use FileTools:-ListDirectory
dir_name:="C:/tmp"; currentdir(dir_name); #cd to directory files_to_process := FileTools:-ListDirectory(dir_name,'all','returnonly'="*.tex"): numelems(files_to_process) 100
In the above, files_to_process is a list of the files in the current folder with extension .tex
There was a case when I needed to delete lines from text file that contains a say "foo" as an example.
This is what I did. use readline to read the lines, check, and if the line contains "foo" skip, else write the line to a temporary file. At the line, use Rename to rename the temporary file to the file being read.
dir_name:="C:/tmp"; currentdir(dir_name); tmp_file_name := "TMP.txt"; source_file_name := "source.txt"; file_id := fopen(tmp_file_name,WRITE): line := readline(source_file_name): while line<>0 do if not StringTools:-Has(line,"foo") then fprintf(file_id,"%s\n",line); fi; line := readline(source_file_name): od: fclose(file_id); FileTools:-Rename(tmp_file_name,source_file_name,force=true);
Given say \(\frac {d^{2}}{d x^{2}}y \left (x \right )+n \left (\frac {d}{d x}y \left (x \right )\right )+3 = \sin \left (x \right )\) how to find all variables and functions in it, not including math functions such as \(\sin x\)?
So the result should be \(n,x,y(x)\).
ode:=diff(y(x),x$2)+n*diff(y(x),x)+3=sin(x); vars:=indets(ode, Or( And(symbol,Not(constant)), And(function,Not(typefunc(mathfunc)) ) )) #gives # vars := {n, x, diff(y(x), x), diff(y(x), x, x), y(x)}
I still need to work on excluding derivatives from the search.
I had case where I needed to check if something is integer or not. The problem is that the result had a symbol \(n\) in it. I need a way to tell Maple that to check if the result can be an integer given that \(n\) is also an integer.
Using type does not work, since can’t use assumptions. One way is to use coulditbe as follows
restart; expr:=n-1+2*m; vars:=indets(expr,And(symbol,Not(constant))); coulditbe(expr,integer) assuming op(map(Z->Z::integer,vars)) # true
In the above indets(expr,And(symbol,Not(constant))) picks all variables in the expression, and assuming op(map(Z->Z::integer,vars)) makes assumption that each is integer.
Sometimes it is useful to invert an ode. i.e. make the independent variable the dependent variable, and the dependent variable the independent. For example, given \[ 1+\left (\frac {x}{y \left (x \right )}-\sin \left (y \left (x \right )\right )\right ) \left (\frac {d}{d x}y \left (x \right )\right ) = 0 \] We want the ode to become \[ -\sin \left (y \right ) y +y \left (\frac {d}{d y}x \left (y \right )\right )+x \left (y \right ) = 0 \]
This can be done as follows
restart; ode:=1+ (x/y(x)-sin(y(x) ))*diff(y(x),x)=0; tr:={x=u(t),y(x)=t}; ode:=PDEtools:-dchange(tr,ode); ode:=eval(ode,[t=y,u=x]); ode:=simplify(ode);
\[ \frac {-\sin \left (y \right ) y +y \left (\frac {d}{d y}x \left (y \right )\right )+x \left (y \right )}{y \left (\frac {d}{d y}x \left (y \right )\right )} = 0 \]
In this case, we can get rid of the denomator, but this is a manual step for now.
ode:=numer(lhs(ode))=0;
\[ -\sin \left (y \right ) y +y \left (\frac {d}{d y}x \left (y \right )\right )+x \left (y \right ) = 0 \]
The above can now be solved more easily for \(x(y)\) than solving the orignal ode for \(y(x)\).
Given \(9 x^{5}+4 x^{4}+3 x^{3}+x^{2}+x +1\) how to truncate it, so that all terms of \(x^3\) and higher are removed?
This can be done as follows
restart; p:=1+x+x^2+3*x^3+4*x^4+9*x^5; simplify(p,{x^3=0})
\[ x^{2}+x +1 \]
Sometimes it is useful to make a small local piece of code inside a proc, with its own local variables that do not interfer with the variables of the proc. In Ada, this is done using declare clause for example. In Maple on can do the same as follows
restart; foo:=proc() local n; n:=10; proc() local n; n:=99; print("inside inner proc, n=",n); end proc(); print("n=",n); end proc; foo();
Which prints
"inside inner proc, n=", 99 "n=", 10
Notice the end of the inner anonymous proc above. It has end proc(); and not end proc; as normal proc. This defines the inner proc and calls it at same time. All the local variables inside the anonymous proc only exist inside that proc and go away after the call, and they do not interfer with the outer proc variables. This way we can declare temporary variables and use them where they are needed.
There was a case where I was making lots of calls from many places to pne specific proc inside a module. I did not want to keep using the long name each time.
the command alias did not work. After some trial and error, found that using use works. Here is the solution. First this is the original layout
restart; A:=module() export B:=module() export foo:=proc() print("in A:-B:-foo()"); end proc; end module; export C:=module() export boo:=proc() print("in A:-C:-boo()"); A:-B:-foo(); end proc; end module