MaplePrimes Posts

MaplePrimes Posts are for sharing your experiences, techniques and opinions about Maple, MapleSim and related products, as well as general interests in math and computing.

Latest Post
  • Latest Posts Feed
  • The Maple help contains a nice example of a puzzle solver named alphametic,  see  ?Iterator,Permute.
    The goal is to determine the distinct digits represented by letters which satisfy a given  equation. The provided solved example is:

            "16540*781 = 12904836 + 12904"
    i.e.  m=1, a=6, p=5 etc.

    It's worth studying the program (written as a module) because it includes a few useful techniques.
    I would suggest the following exercise for a Maple (young) programmer.

    1.  When solving the "classical" puzzle  "FORTY+TEN+TEN=SIXTY", instead of the correct answer "29786+850+850=31486",   you will see
    "2978Y+850+850=3148Y".
    Try to find what's going on and correct the code.

    2. The solutions given by alphametic include numbers beginning with a zero.
    Execute e.g. .
    Modify the code to produce only standard numbers.

     

    Here is a simple collection of Python scripts that allows Maple code to be embedded directly within a LaTeX document. The scripts will process the LaTeX document, calling Maple as required, making the Maple output directly accessible in the LaTeX document. The source, including extensive examples, can be found at https://github.com/leo-brewin/hybrid-latex. This  library also supports inclusion of active Mathematica, Matlab, Python and Cadabra code within LaTeX documents.

    Here is a simple example (based on maple/example-01 in the GitHub site)

    \documentclass[12pt]{mpllatex}
    
    \begin{document}
    
    \section*{Calculus}
    
    \begin{maple}
       ans := diff(x*sin(x),x):                          # mpl (ans.501,ans)
       ans := eval(diff(x*sin(x),x),x=Pi/4):             # mpl (ans.502,ans)
       ans := int(2*sin(x)^2, x=a..b):                   # mpl (ans.503,ans)
       ans := int(2*exp(-x^2),x=0..infinity):            # mpl (ans.504,ans)
       ans := ''int(2*exp(-x^2),x=0..infinity)'':        # mpl (lhs.504,ans)
       ans := int(int(x^2 + y^2,  y=0..x),x=0..1):       # mpl (ans.505,ans)
       ans := ''int(int(x^2 + y^2,  y=0..x),x=0..1)'':   # mpl (lhs.505,ans)
    \end{maple}
    
    \begin{align*}
       &\mpl*{ans.501}\\
       &\mpl*{ans.502}\\
       &\mpl*{ans.503}\\
       \mpl{lhs.504}&=\Mpl{ans.504}\\
       \mpl{lhs.505}&=\Mpl{ans.505}
    \end{align*}
    
    \end{document}
    

    and here is the corresponding output

    example-01.pdf

     

    Let us consider

    plots:-inequal(max(1, min(x, 2))+max(1, min(y, 2)) <= 3, x = -4 .. 4, y = -4 .. 4);


    and compare it with

    plots:-implicitplot(max(1, min(x, 2))+max(1, min(y, 2)) = 3, x = -4 .. 4, y = -4 .. 4, gridrefine = 2);

    The latter plot must be a subset of the former plot, but it isn't so. bug_in_inequal.mw

    Maple users frequently solve differential equations. If you want to use the results later in Maple, you need to deconstruct the solution, and then assign the functions -- something that isn't done automatically in Maple. We wrote a multi-purpose routine to help you out. For instance, suppose you solve a simple linear system of equations:

    restart;
    
    eqs := { x + y = 3, x - y = 1 };
    soln := solve( eqs ); # { x = 2, y = 1 }
    x, y; # plain x and y

    To assign the values from the solution to the corresponding variables:

    assign( soln );
    x, y; # 2, 1

    This won't work for solutions of differential equations:

    restart;
    
    sys := { D(x)(t) = y(t), D(y)(t) = -x(t), x(0) = 1, y(0) = 0 };
    soln := dsolve( sys ); # { x(t) = cos(t), y(t) = -sin(t) }
    assign( soln );
    x(s), y(s); # plain x(s) and y(s)

    To make this work, we wrote this multi-purpose routine:

    restart;
    
    # Type for a variable expression, e.g. x=5.
    TypeTools:-AddType( 'varexpr', u -> type( u, 'And'('name','Non'('constant'))='algebraic' ) ):
    
    # Type for a function expression, e.g. f(x)=x^2.
    TypeTools:-AddType( 'funcexpr', u -> type( u, 'function'('And'('name','Non'('constant')))='algebraic' ) ):
    
    # Procedure to assign variable and function expressions.
    my_assign := proc( u :: {
            varexpr, 'list'(varexpr), 'rtable'(varexpr), 'set'(varexpr),
            funcexpr, 'list'(funcexpr), 'rtable'(funcexpr), 'set'(funcexpr)
    }, $ )
    
            local F, L, R, V:       
    
            # Map the procedure if input is a data container, or apply regular assign(), where applicable.
            if not u :: {'varexpr','funcexpr'} then
                   map( procname, u ):
                   return NULL:
            elif u :: 'varexpr' then
                   assign( u ):
                   return NULL:
            end if:       
    
            L, R := lhs(u), rhs(u):
            F := op(0,L): 
            V := [ indets( L, 'And'( 'name', 'Non'('constant') ) )[] ]:    
    
            map( assign, F, unapply( R, V ) ):
            return NULL:
    
    end proc:
    
    # Example 1.
    
    eqs := { x + y = 3, x - y = 1 };
    my_assign( solve( eqs ) );
    'x' = x, 'y' = y; # x=1, y=2
    
    # Example 2.
    
    unassign( 'x', 'y' ):
    E := [ f(x,y) = x + y, g(x,y) = x - y ];
    my_assign( E );
    'f(u,v)' = f(u,v), 'g(u,v)' = g(u,v); # f(u,v)=u+v, g(u,v)=u-v
    
    # Example 3.
    
    sys := { D(x)(t) = y(t), D(y)(t) = -x(t), x(0) = 1, y(0) = 0 };
    soln := dsolve( sys );
    my_assign( soln ):
    'x(s)' = x(s); # x(s)=cos(s)
    'y(s)' = y(s); # y(s)=-sin(s)

    Fourteen year old Lazar Paroski is an exceptional student. Not only is he an overachiever academically, but he has a passion to help struggling students, and to think of innovative ways to help them learn. Lazar is particularly fond of Math, and in his interactions with other students, he noticed how students have a hard time with Math.

    Putting on his creative cap, Lazar came up with the idea of an easily accessible “Math Wall” that explains simple math concepts for students in a very visual way.

    “The Music Wall on Pinterest was my inspiration,” says Lazar. “I thought I can use the same idea for Math, and why not a Math Wall”?

    "The math wall is basically all the tools you'll have on the wall in your classroom outside," said Lazar. Making the Math Wall and getting it set up, took time and effort. But he had help along the way, which, fueled by his passion and enthusiasm, helped turn his creative dream into reality. Lazar received a grant of $6000 from the local government to implement the project; his teachers, principal and family helped promote it; and the community of parents provided encouragement.

    The Math Wall covers fundamental math concepts learnt in grades 1 to 6. Lazar engaged with over 450 students in the community to understand what would really be helpful for students to see in this Math Wall, and then he carefully picked the top themes he wanted to focus on.

    The three meter Math Wall is located in the Morrison community park, and was officially inaugurated by the Mayor of Kitchener in July 2018. Many students have already found it to be useful and educative. Parents who bring their children to the park stop by to give their kids a quick math lesson.

    At Maplesoft, we love a math story like this! And that too in our backyard! We wanted to appreciate and encourage Lazar and his efforts in making math fun and easy and accessible to students. So we invited Lazar to our offices, gifted him a copy of Maple, and heard more about his passion and future plans. “In many ways, Lazar embodies the same qualities that Maplesoft stands for – making it easy for students to understand and grasp complex STEM concepts,” said Laurent Bernardin, Maplesoft’s Chief Operating Officer. “We try to impress upon students that math matters, even in everyday life, and they can now use advanced, sophisticated technology tools to make math learning fun and efficient.”

    We wish Lazar all the very best as he thinks up new and innovative ways to spread his love for math to other kids. Well done, Lazar!

     

     

    You might recall this image being shared on social media some time ago.

    Source: http://cvcl.mit.edu/hybrid_gallery/monroe_einstein.html

    Look closely and you see Albert Einstein. However, if you move further away (or make the image smaller), you see Marilyn Monroe.

    To create the image, the high spatial frequency data from an image of Albert Einstein was added to the low spatial frequency data from an image of Marilyn Monroe. This approach was pioneered by Oliva et al. (2006) and is influenced by the multiscale processing of human vision.

    • When we view objects near us, we see fine detail (that is, higher spatial frequencies dominate).

    • However, when we view objects at a distance, the broad outline has greater influence (that is, lower spatial frequencies dominate).

    I thought I'd try to create a similar image in Maple (get the complete application here).

    Here's an overview of the approach (as outlined in Oliva et al., 2006). I used different source images of Einstein and Monroe.

    Let's start by loading some packages and defining a few procedures.

    restart:
    with(ImageTools):
    with(SignalProcessing):
    
    fft_shift := proc(M)
       local nRows, nCols, quad_1, quad_2, quad_3, quad_4, cRows, cCols;
       nRows, nCols := LinearAlgebra:-Dimensions(M):
       cRows, cCols := ceil(nRows/2), ceil(nCols/2):
       quad_1 := M[1..cRows,      1..cCols]:
       quad_2 := M[1..cRows,      cCols + 1..-1]:  
       quad_3 := M[cRows + 1..-1, cCols + 1..-1]:
       quad_4 := M[cRows + 1..-1, 1..cCols]:
       return <<quad_3, quad_2 |quad_4, quad_1>>:
    end proc:
    
    PowerSpectrum2D := proc(M)
       return sqrt~(abs~(M))
    end proc:
    
    gaussian_filter := (a, b, sigma) -> Matrix(2 * a, 2 * b, (i, j) -> evalf(exp(-((i - a)^2 + (j - b)^2) / (2 * sigma^2))), datatype = float[8]):

    fft_shift() swaps quadrants of a 2D Fourier transform around so that the zero frequency components are in the center.

    PowerSpectrum2D() returns the spectra of a 2D Fourier transform

    gaussian_filter() will be used to apply a high or low-pass filter in the frequency domain (a and b are the number of rows and columns in the 2D Fourier transform, and sigma is the cut-off frequency.

    Now let's import and display the original Einstein and Monroe images (both are the same size).

    einstein_img := Read("einstein.png")[..,..,1]:
    Embed(einstein_img)

    marilyn_img  := Read("monroe.png")[..,..,1]:
    Embed(monroe_img)

    Let's convert both images to the spatial frequency domain (not many people know that SignalProcessing:-FFT can calculate the Fourier transform of matrices).

    einstein_fourier := fft_shift(FFT(einstein_img)):
    monroe_fourier   := fft_shift(FFT(monroe_img)):

    Visualizing the power spectra of the unfiltered and filtered images isn't necessary, but helps illustrate what we're doing in the frequency domain.

    First the spectra of the Einstein image. Lower frequency data is near the center, while higher frequency data is further away from the center.

    Embed(Create(PowerSpectrum2D(einstein_fourier)))

    Now the spectra of the Monroe image.

    Embed(Create(PowerSpectrum2D(monroe_fourier)))

    Now we need to filter the frequency content of both images.

    First, define the cutoff frequencies for the high and low pass Gaussian filters.

    sigma_einstein := 25:
    sigma_monroe   := 10:

    In the frequency domain, apply a high pass filter to the Einstein image, and a low pass filter to the Monroe image.

    nRows, nCols := LinearAlgebra:-Dimension(einstein_img):
    
    einstein_fourier_high_pass := einstein_fourier *~ (1 -~ gaussian_filter(nRows/2, nCols/2, sigma_einstein)):
    monroe_fourier_low_pass    := monroe_fourier   *~ gaussian_filter(nRows/2, nCols/2, sigma_monroe):

    Here's the spectra of the Einstein and Monroe images after the filtering (compare these to the pre-filtered spectra above).

    Embed(Create(PowerSpectrum2D(einstein_fourier_high_pass)))

    Embed(Create(PowerSpectrum2D(monroe_fourier_low_pass)))

    Before combining both images in the Fourier domain, let's look the individual filtered images.

    einstein_high_pass_img := Re~(InverseFFT(fft_shift(einstein_fourier_high_pass))):
    monroe_low_pass_img    := Re~(InverseFFT(fft_shift(monroe_fourier_low_pass))):

    We're left with sharp detail in the Einstein image.

    Embed(FitIntensity(Create(einstein_high_pass_img)))

    But the Monroe image is blurry, with only lower spatial frequency data.

    Embed(FitIntensity(Create(monroe_low_pass_img)))

    For the final image, we're simply going to add the Fourier transforms of both filtered images, and invert to the spatial domain.

    hybrid_image := Create(Re~(InverseFFT(fft_shift(monroe_fourier_low_pass + einstein_fourier_high_pass)))):
    Embed(hybrid_image)

    So that's our final image, and has a similar property to the hybrid image at the top of this post.

    • Move close to the computer monitor and you see Albert Einstein.
    • Move to the other side of the room, and Marilyn Monroe swims into vision (if you're myopic, just take off your glasses and don't move back as much).

    To simulate this, here, I've successively reduced the size of the hybrid image

    And just because I can, here's a hybrid image of a cat and a dog, generated by the same worksheet.

    Set of vector mechanics exercises in the plane and space using the result technique in line (combining the key ALT + ENTER) also the unit package using the law of the triangle. It is observed that the solution is totally optimal. I leave your constructive criticism to the community's criteria. I hope that someone will raise an alternative solution using the minimum number of lines but that the students will learn. In spanish.

    Ejercicios_de_Vectores_Fuerza_y_Proyecciones_2D_y_3D.mw

    Lenin Araujo Castillo

    Ambassador of Maple

    Important use of the embedded components called Shortcut applied to vector mechanics exercises for engineering students. This makes each solution of each problem open independently and thus this way to explain in class. To use this worksheet, first unzip all the files in a single folder. In spanish

    Equilibrium_with_Shortcut.zip

    Lenin Araujo Castillo

    Ambassador of Maple

    If one looks in the profile of Rouben Rostamian , then one sees that any search in his Posts, Questions, Answers, and Replies is linked with MaplePrimes only. I informed  MaplePrimes staff about that disturbance without any effect. Using the opportunity, I'd like to pay attention of MaplePrimes users to many clones in the forum. This is a problem for ages: clones vote up themselves and impose one's opinion on  others. Several years ago some clones were deleted. It would be nice to continue that process.

    I have recently visited the Queen's House at Greenwich  (see wiki),  an  important building in British architectural history (17th century).
    I was impressed by the Great Hall Floor, whose central geometric decoration seems to be generated by a Maple program :-)

    Here is my code for this. I hope you will like it.

    restart;
    with(plots): with(plottools):
    n:=32: m:=3:#    n:=64: m:=7:
    
    a[0], b[0] := exp(-Pi*I/n), exp(Pi*I/n):
    c[0]:=b[0]+(a[0]-b[0])/sqrt(2)*exp(I*Pi/4):  
    for k to m+1 do  
      c[k]:=a[k-1]+b[k-1]-c[k-1];
      b[k]:=c[k]*(1+exp(2*Pi*I/n))-b[k-1];
      a[k]:=conjugate(b[k])  od:
    b[-1]:=c[0]*(1+exp(2*Pi*I/n))-b[0]:
    a[-1]:=conjugate(b[-1]):
    c[-1]:=a[-1]+b[-1]-c[0]:
    seq( map[inplace](evalf@[Re,Im], w), w=[a,b,c] ):
    Q:=polygonplot([seq([a[k],c[k],b[k],c[k+1]],k=0..m-1), [c[m],a[m],b[m]], [a[-1],b[-1],c[0]]]):
    display(seq(rotate(Q, 2*k*Pi/n, [0,0]),k=0..n-1), disk([0,0],c[m][1]/3), axes=none, size=[800,800], color=black);
    

    Avatar images are displayed with fixed size. When scaling the font, the title is offended by the avatar image. Please change this behaviour.

    In this app you can visualize the location of the points in the different quadrants, also calculate the distance between two points. Finally the calculation of the coordinates of the midpoint. With these applications can be combined to study different cases between distance between two points and midpoint. Generated in Maple for students of secondary education and pre-calculation. In Spanish

    Distance_between_two_points_and_midpoint.mw

    Lenin Araujo Castillo

    Ambassador of Maple

     

    Hello,

    At the moment there is no support on GitHub for language recognition and syntax highlighting for Maple. I think better support for Maple on GitHub would be a good thing:

    1. It makes Maple more recognizable, for example in language searches such as this one for one of its competitors.
       
    2. The list of currently supported languages is long and even contains many obscure entries. Maple is not obscure and deserves to be there.

    So, why am I posting this here, as it concerns GitHub more than Maple? The reason is that adding support for new languages is often done by GitHub users themselves, using the Linguist library mentioned on this help page. The process does not seem very difficult to me, but it requires a few careful steps.

    Referring to those steps:

    1. I think it would be nice to add support for the extensions , and .
       
    2. Perhaps this project by @Daniel Skoog could be used for syntax highlighting? However, currently it does not have a license.
       
    3. Does anybody know of a body of Maple source code that is representative of the modern Maple language as a whole? Probably it should be available under a permissive open source license such as MIT or BSD. (I am not sure whether GPLed work would qualify.)
       
    4. I know of a few Maple projects by others that are maintained on GitHub, such as the ParametricMatrixTools package and some packages by Daniel Skoog. If there are other Maple projects being maintained on GitHub, it would be good to know about them in the comments.

    So, in summary, could you perhaps help me with the above Steps 2, 3 and 5 or, if you prefer, could you take care of them yourself and open a pull request, so Maple on GitHub can literally get the recognition it deserves?

    My best wishes,

    Sebastiaan Janssens.

     

    We produce only one rotation of the cube by the angle Pi/2, and then repeat it at the following points, changing the colors of the faces in turn. And so the illusion is created that the cube is rolling along a straight line without slipping.
    (Just a picture without any sense.) cube_without_slipping.mw

    Hi Primes Users,

    We’re back with another tech support challenge that we wanted to share with you!

    A customer had been having issues launching Maplets using the standard double-clicking method. This is a known issue that rarely occurs, but is being addressed for a future release. In the meantime, we were able to provide this person with a command-prompt-based way of opening the Maplet, and we thought it would be great to share in case you run into the same kind of problem.

    After suggesting a few workarounds, our Team Lead was able to offer a command-prompt based way of solving the problem. Since command prompts are the target of batch scripts, which we had already used as a workaround for another issue, we just needed a way of programmatically creating scripts based on the command prompt code for each file.

    Using various commands from the FileTools package (including a technique suggested by our Team Lead), we were able to put together code that takes all files in a particular folder (namely, a folder named “Maplets” on the Desktop), and creates a new batch script from a template that is based on the command prompt code (provided that the template is saved in the same Maplets folder under the file name “Maplet script”):

    restart; with(FileTools): username := kernelopts(username):
    
    directory := cat("C:\\Users\\", username, "\\Desktop\\Maplets"):
    
    dir := ListDirectory(directory): dir := Basename~(dir):
    
    main := cat(directory, "\\Maplet script.txt"): body := Import(main):
    
    
    n := numelems(dir):
    
    for i to n do
    
    script := cat(directory, "\\launch ", dir[i], ".txt");
    
    batch := cat(directory, "\\launch ", dir[i], ".bat");
    
    newbody := StringTools:-Substitute(body, "name", dir[i]);
    
    Export(script, newbody);
    
    Rename(script, batch);
    
    end do:
    
    
    Script template:
    
    
    if not "%minimized%"=="" goto :minimized
    
    set minimized=true
    
    start /min cmd /C "%~dpnx0"
    
    goto :EOF
    
    :minimized
    
    
    "C:\Program Files\Maple 2018\bin.X86_64_WINDOWS\mapletviewer.exe" "C:\Users\%USERNAME%\Desktop\Maplets\name.maplet"

    Before using the Maplet script:

    After using the Maplet script:

    If the appropriate executable is referenced, and the relevant file paths are adjusted accordingly, one should be able to adapt this process to other programs and their corresponding files.  In fact, any batch script that needs to be modified programmatically can be modified using these techniques.  Does anyone have other useful batch scripts that they’ve modified programmatically in Maple using similar techniques?

    *(including dragging the files to the executable directly, which only seemed to work when the executable was in its original directory)

    First 46 47 48 49 50 51 52 Last Page 48 of 308