Maple Questions and Posts

These are Posts and Questions associated with the product, Maple

Is it possible to configure newer maple versions to use a different file extension ?

I have a lot of  Maple 9 files  with .mw extension. I dont want them opened and saved by a later version as they are valuable and actually work better than later maple versions which throws unneccesary signum errors. The results are verified so the signum errors are bogus in the recent maple versions running the same file.

Particularly, can I configure e.g. Maple 2022 to save to a different file extension say .mww or similar rather than .mw so I can avoid destroying to original 9.5 files?

Hi everyone!  I'm trying to study a certain function.  The output says that, from -5 to 5, the output is undefined.  Am I doing something wrong?

Thanks in advance.

range_not_undefined.mw

Dear friends,

I need a procedure to classify a list of polynomials by their leading monomials. For example, if F = [x^2 - y - 1, y^2 - y, x^2 - 4, y^3 - 1, z^2 - 4] and a < be the lex ordering s.t. z<y<x, it should return [[x^2 - y - 1, x^2 - 4], [y^3 - y, y^3 - 1], [z^2 - 4]]. 

I appreciate any help you can provide.

Sincerely,

A gardener wants to spread 25 roses over an area so that there are 5 roses in each of 15 straight rows. The roses should be arranged rotationally symmetrically so that more than 3/4 of them are less than half as far from the center of symmetry as the outermost ones and that the center of symmetry itself remains unplanted. How is such an arrangement possible?

What is the correct syntax to do this change of variable from the text book:

The problem is that using PDEtools:-dchange, it wants the transformation to have form { old = new}, i.e. x=...  so I can not write  z=g(x) in the transformation. 

For example

ode:= diff(y(x),x$2)+diff(y(x),x)+y(x)=sin(x);
PDEtools:-dchange({z= g(x)},ode,known={x},unknown={z});

Error, (in dchange/info) missing a list with the new variables
And if I first solve for x so that I can write the transformation with x on left side, it still does not work

ode:= diff(y(x),x$2)+diff(y(x),x)+y(x)=sin(x);
PDEtools:-dchange({x=RootOf(g(_Z) - z)},ode,known={x},unknown={z});

Where RootOf(g(_Z) - z) was result of solve(z=g(x),x);

I am sure this can be done in Maple, I just do not know the right syntax to use with dchange.

Maple 2024.2

What systematic methods can be used to determine the optimal parameters in a long equation involving two independent variables, and how do techniques like separation of variables, balancing principles, or dimensional analysis aid in simplifying and solving such equations?

parameters_x_t.mw

Imagine that the following summation needs to be constructed to create a graph. Suppose the text below provides us with this relationship between the equations

The table below further provides us with such relationships.

If we assume that the unprovided constants are equal to 1, then what does a graph look like for the remaining variables?

I have difficulty implementing a system containing sums

I am trying to model the change in bloodglucose when performing a OGTT (Oral glucose tolerance test). In connection to this I've created a compartmentmodel consisting of two compartments; one for the stomach and one for the blood. Based on this compartmentmodel I've formulated two differentialequations describing how the glucose concentration in respectively the stomach and the blood changes. I've then solved this system of differential equations and I'm now trying to adjust the variables to make the graphs look like the one from a glucose tolerance test but I'm having trouble creating an Explore-plot.

restart

 

 

 

Absorption from stomach

diff(Cm(t), t) = -Ka*Cm(t)                                  (1)

 

Solution to (1)

Cm = c*exp(-Ka*t)                                              (2)

 

Glucose concentration in blood

diff(Cb(t), t) = Ka*Cm(t)-Ku*Cb(t)                (3)

 

(2) Is put into (3)

diff(Cb(t), t) = Ka*c*exp(-Ka*t)-Ku*Cb(t)          (4)

 

(Ku*Cb(t)) gets added

diff(Cb(t), t)+Ku*Cb(t) = Ka*c*exp(-Ka*t)        (5)

 

Solution to (5)

"Cb(t):=(e)^(-&int;Ku &DifferentialD;t)*&int;Ka*( c0*(e)^(-Ka*t))*(e)^(&int;Ku &DifferentialD;t) &DifferentialD;t+c*(e)^(-&int;Ku &DifferentialD;t)" = proc (t) options operator, arrow, function_assign; exp(-(int(Ku, t)))*(int(Ka*c0*exp(-Ka*t)*exp(int(Ku, t)), t))+c*exp(-(int(Ku, t))) end procNULL

 

Solution to (1)

  "Cm(t):=  c0*(e)^(-Ka*t)" = proc (t) options operator, arrow, function_assign; c0*exp(-Ka*t) end procNULL

  NULL

Explore(plot([Cb(t), Cm(t)], t = 0 .. 100, y = 0 .. 50), parameters = [Ka = 0 .. 10, Ku = 0 .. 10, c0 = 0 .. 20, c = 0 .. 20], initialvalues = [Ka = 1, Ku = 1, c0 = 1, c = 1])Warning, expecting only range variable t in expression -exp(-Ku*t)*Ka*c0/(Ka-Ku)*exp(-Ka*t+Ku*t)+c*exp(-Ku*t) to be plotted but found names [Ka, Ku, c, c0]

 

Download Explore_plot.mw

About once a year Advent of Code give you a problem that is a gift if you are using a computer algebra system. This year that day was Day 13. The day 13 problem was one of crazy claw machines.  Each machine has two buttons that can be pressed to move the claw a given number of X and Y positions and a prize at a given position. A buttons cost 3 tokens to press, and B buttons cost 1 token to press, and we are asked to find the minimum number of tokens needed, IF it is possible to reach the prize. The data presented like so:

Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400

Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176

...

Some times the input is harder to parse than the problem is so solve, and this might be one of those cases.  I tend to reach for StringTools to take the input apart, but today the right tool is the old school C-style sscanf (after using StringSplit to split at every double linebreak).

machinesL := StringTools:-StringSplit(Trim(input), "\n\n");
machines := map(m->sscanf(m,"Button A: X+%d, Y+%d\nButton B: X+%d, Y+%d\nPrize: X=%d, Y=%d"), machinesL):

Now we have a list of claw machine parameters in the form [A_x, A_y, B_x, B_y, P_x, P_y] and we need to turn those into equations that we can solve. We want the number of A presses a, and B presses b to get the claw to the P_x, P_y position of the claw, it is simple to just write them down:

for m in machines do
   eqn := ({m[1]*a+m[3]*b=m[5], m[2]*a+m[4]*b=m[6]});
end do;

Now because of the discrete nature of this problem, we need our variables a and b to be non-negative integers.  When solving this, I first reached for isolve like this:

tokens := 0;
for m in machines do
   eqn := ({m[1]*a+m[3]*b=m[5], m[2]*a+m[4]*b=m[6]});
   sol := isolve(eqn);
   if sol <> NULL then
      tokens := tokens + eval(3*a+b, sol);
   end if;
end do;

Now, sometimes Advent of Code inputs contain a lot of hidden structure.  I wrote the code above, it worked on the sample input, so I tried it immediately on my real input (about 300 claw machines like the above) and IT WORKED.  But, you might notice that this code does not deal with a couple cases that could have appeared.  In particular, it doesn't check that the solutions are positive.  It also doesn't handle cases where there is more than one possible solution.  The former is easy to check

if sol <> NULL and eval(a,sol) >= 0 and eval(b,sol) >= 0 then

Unfortunately isolve does not handle inequalities, but you could try with solve, but it doesn't save us any checking, because we'd still have to check if the solutions are integers, so we might as well have just solved the equation and then checked if it were a nonnegative integer.

tokens := 0;
for m in machines do
   eqn := {m[1]*a+m[3]*b=m[5], m[2]*a+m[4]*b=m[6], a>=0, b>=0};
   sol := solve(eqn);
   if type(eval(a,sol), integer) and type(eval(b,sol),integer) then
      tokens := tokens + eval(3*a+b, sol);
   end if;
end do;
ans1 = tokens;

In the multiple solution case we get something like {a = 3 - 2*b, 0 <= b, b <= 3/2} which has some great information in it but might be hard to handle programmatically, so let's see what isolve does with those cases to see if it's easier to deal with

> eqn := { 17*a + 84*b = 7870, 34*a + 168*b = 15740 }:
> constr := { a >= 0, b>= 0 }:
> sol := isolve(eqn);
               sol := {a = 458 - 84 _Z1, b = 1 + 17 _Z1}

> constr := eval({ a >= 0, b>= 0 }, sol):
            const := {0 <= 1 + 17 _Z1, 0 <= 458 - 84 _Z1}

> obj := eval(3*a+b, sol);
                         obj := 1375 - 235 _Z1

You can see it's easy to tell if these show up in your input, since your "token" total will have the _Zn variables in it.  Now, since everything is simple and linear here, it seems like you could use solve to find the rational value of _Z1 that makes obj=0 and then take the closest integer but it's not so simple, we actually have to deal with the contraints that a and b be positive too. So, it really just makes sense to bring out the big hammer of Optimization:-Minimize which allows us to directly optimize over just the integers.  So a full solution looks like this:

tokens := 0:
for m in machines do
   eqn := ({m[1]*a+m[3]*b=m[5], m[2]*a+m[4]*b=m[6]});
   sol := isolve(eqn);
   if sol = NULL then
      next;
   end if;
   constr := eval({ a >= 0, b>= 0 }, sol);
   obj := eval(3*a+b, sol);
   if not type(obj, constant) then
      tokens := tokens + Optimization:-Minimize( obj, constr, assume=integer )[1];
   elif andmap(evalb, constr) then
      tokens := tokens + obj; 
   end if;
end do;

But since we're bringing out the big hammer, why not just use Optimization in the first place.  The main reason is that Minimize doesn't simply return NULL when it doesn't work, instead it throws an exception, so we need to find all the exceptions that can occur and handle then with a try-catch, thus:

tokens := 0;
for m in machines do
   eqn := ({m[1]*a+m[3]*b=m[5], m[2]*a+m[4]*b=m[6]});
   try 
       sol := Optimization:-Minimize(3*a+b, eqn, 'assume'='nonnegint')[1];
       tokens := tokens + sol;
   catch "no feasible":
   end try; 
end do;
tokens;

(you can in fact omit the string in the catch: statement, but I can tell you from long experience that that is an excellent way to make your code much much harder to debug)

Alright, so how did people not using Maple solve this problem?  The easiest way to solve it, and the one used by all the cheaters scraping the website and using LLM-based code generators that auto-submit solutions to get into the Top 100, was to just check all possible a, b values in 0..100 and take the values than minimize 3*a+b when reaching the prize coordinates.  That's only feasible because the problem states the 100 is an upperbound for a and b, but it's also very fast (about 1/10 second in Maple):

tokens := 0:
for m in machines do;
sol := infinity;
for i from 0 to 100 do for j from 0 to 100 do
    if i*m[1]+j*m[3]=m[5] and i*m[2]+j*m[4]=m[6] and 3*i+j < sol then
        sol := 3*i+j;
    end if;
end do; end do;
tokens := tokens + ifelse(sol=infinity,0,sol);
end do;

It does not scale at all to part 2 (which modified everything to be bigger by about 10 trillion), and it seems that foiled all the LLM solvers. So, what solutions scaled in languages without integer equation solvers?  Well, the easiest solution is just to solve the general equation using paper and pencil


And you can just hard code that formula in, check that it gives integer values and compute the tokens. As long as you get unique solutions, that looks something like this

solveit := proc(m)
local asol := m[4]*m[5] - m[3]*m[6];
local bsol := m[1]*m[6] - m[2]*m[5];
local deno := m[1]*m[4] - m[2]*m[3];
if deno = 0 then return -2^63; end if; # multiple solution case - not handled
if asol mod deno = 0 and bsol mod deno = 0
   and (   ( deno>=0 and asol>=0 and bsol>=0 ) 
        or ( deno<=0 and asol<=0 and bsol<=0 ) )
then

    return 3*asol/deno+bsol/deno;
else
    return 0;
end if;
end proc:

Which if you have this in Maple, you can impress your friends by auto generating solutions in other languages. Here, for your FORTRAN friends

> CodeGeneration:-Fortran(solveit);

Warning, the following variable name replacements were made: solveit -> cg
       integer function cg (m)
        doubleprecision m(*)
        integer asol
        integer bsol
        integer deno
        asol = int(-m(3) * m(6) + m(4) * m(5))
        bsol = int(m(1) * m(6) - m(2) * m(5))
        deno = int(m(1) * m(4) - m(2) * m(3))
        if (deno .eq. 0) then
          cg = -9223372036854775808
          return
        end if
        if (mod(asol, deno) .eq. 0 .and. mod(bsol, deno) .eq. 0 .and. (0
     # .le. deno .and. 0 .le. asol .and. 0 .le. bsol .or. deno .le. 0 .a
     #nd. asol .le. 0 .and. bsol .le. 0)) then
          cg = 3 * asol / deno + bsol / deno
          return
        else
          cg = 0
          return
        end if
      end

Another way that you might solve this without solve is to use a linear algebra library to solve the linear system.  It works even if you only have a numeric solver, but you have to be careful about checking for integers:

tokens := 0:
for m in machines do
    sol := LinearAlgebra:-LinearSolve(
               Matrix(1..2,1..2,[m[[1,3]],m[[2,4]]], datatype=float), 
               Vector(m[5..6], datatype=float));
    if abs(sol[1]-round(sol[1])) < 10^(-8) and abs(sol[2]-round(sol[2])) < 10^(-8)
       and sol[1] >= 0 and sol[2] >= 0
    then
       tokens := tokens + 3*sol[1]+sol[2];
    end if;
end do;

Finally, a lot of people solved this sort of thing with the Z3 Theorem prover from Microsoft research which is also way more than you need, but it mostly just uses SMTLIB, which we also have in a library for in Maple, and it can just be used in place of solve

tokens := 0;
for m in machines do
   eqn := {m[1]*a+m[3]*b=m[5], m[2]*a+m[4]*b=m[6], a>=0, b>=0};
   sol := SMTLIB:-Satisfy(eqn) assuming a::nonnegint, b::nonnegint;
   if sol <> NULL and type(eval(a,sol), integer) and type(eval(b,sol),integer) then
      tokens := tokens + eval(3*a+b, sol);
   end if;
end do;

Notice that Satisfy handled the multiple solution case just by choosing one of the many solutions. It is possible to get SMTLib to optimize but it is slightly more involved, and this post is already too long. This time, I've put all this work in worksheet: Day13-Primes.mw

Hi!

So I like to check that my manual integrations and/or maple integrations are equal with each other. I normally do this using the Test Relation function.

I was working on a problem and noticed that Maple didn't evaluate the integrals being the same, even though they presumedly are.

Could anyone shed some light on why I get this inequality?

Thanks in advance!

mapleintvsmanualint.mw

restartNULL

dn/dt = -r__S*V

 

We can define n as C*V 

dC*V/dt = -r__S*V

 

We can define the concentration C as S  

dS/dt = -r__S

 

where -r__S = V__max*[S]/(1+K__1*[S]+K__2*[S^2])

  

ds/dt = -V__max*[S]/(1+K__1*[S]+K__2*[S^2])=

 

1/dt = -V__max*[S]/((1+K__1*[S]+K__2*[S^2])*ds)

 

dt = (1+k__1*[S]+K__2*[S^2])*ds/(V__max*[S])

 

"&DifferentialD;t = 1/(`V__max`*[S])+`k__1`/(`V__max`)+(`K__2`*[S])/(`V__max`)*&DifferentialD;s"

 

int(1/(V__max*S)+K__1/V__max+K__2*S/V__max, S = S .. S__0)

 

`assuming`([simplify(combine*(int(1/(V__max*S)+K__1/V__max+K__2*S/V__max, S = S__ .. S__0)), size)], [S > 0, S__0 > S__])

combine*piecewise(And(0 < S__0, S__ < 0), undefined, (1/2)*(K__2*S__0^2-K__2*S__^2+2*S__0*K__1-2*K__1*S__+2*ln(S__0)-2*ln(S__))/V__max)

(1)

 

`assuming`([simplify(int(1/(V__max*S)+K__1/V__max+K__2*S/V__max, S = S__ .. S__0), size)], [S > 0, S__0 > S__])
  piecewise(And(0 < S__0, S__ < 0), undefined, (1/2)*(K__2*S__0^2-K__2*S__^2+2*S__0*K__1-2*K__1*S__+2*ln(S__0)-2*ln(S__))/V__max)NULL

 

 

maple*equation = manual*equation  NULL

(S__0^2*K__2-K__2*S^2+2*S__0*K__1-2*K__1*S+2*ln(S__0)-2*ln(S))/(2*V__max) = (ln(S__0/S)+K__1*(S__0-S)+(1/2)*(-S^2+S__0^2)*K__2)/V__max"(->)"false

   

eq1 := (S__0^2*K__2-K__2*S^2+2*S__0*K__1-2*K__1*S+2*ln(S__0)-2*ln(S))/(2*V__max)

 

eq2 := (ln(S__0/S)+K__1*(S__0-S)+(1/2)*(-S^2+S__0^2)*K__2)/V__max

 

eq1-eq2 = 0"(->)"false

 

(ln(S__0/S)+K__1*(S__0-S)+(1/2)*(-S^2+S__0^2)*K__2)/V__max = (ln(S__0/S)+K__1*(S__0-S)+(1/2)*(-S^2+S__0^2)*K__2)/V__max

 

Download mapleintvsmanualint.mw

The uploaded worksheet defines a surface.

I would like to code a ball rolling across this surface (and others) starting from an initial position on the surface and an initial velocity tangent to the surface, but I don't know how to do this.

What is the combination of physics (including gravity) and math that accomplishes this task?

Ball-rolling-on-a-surface.mw

Is there a trick to make Maple give same result below when using eval and limit?  

Attached worksheet. This comes in context of solving ode  using Laplace. Initial conditions are at zero. And need to solve for the constant of integration. 

It works when using eval, since Dirac(t) becomes Dirac(0), but when using Limit, Dirac(t) becomes zero and the _C1 is lost. I was wondering if limit should also return Dirac(0) like eval?

interface(version);

`Standard Worksheet Interface, Maple 2024.2, Windows 10, October 29 2024 Build ID 1872373`

Physics:-Version();

`The "Physics Updates" version in the MapleCloud is 1838 and is the same as the version installed in this computer, created 2024, December 2, 10:11 hours Pacific Time.`

restart;

e:=1/2*t+_C1*Dirac(t);

(1/2)*t+_C1*Dirac(t)

eval(e,t=0)

_C1*Dirac(0)

limit(e,t=0)

0

 

 

Download dirac_limit_dec_13_2024.mw

Some of the calculations mentioned here can be done in alternative programming languages, such as Python, C, and so on. However, I would like to reproduce exactly these graphs using Maple (without the need for programming commands, such as "if", "while", among others).

In the work I am trying to reproduce, we have "The evaluation of the influence of the inclusion of the broadband behavior of grounding systems in EMT-type programs in the evaluation of transients resulting from direct lightning strikes on transmission lines. The behavior of the grounding frequency is determined using an accurate electromagnetic model and included in the EMTP/ATP by means of an equivalent circuit derived from the Vector Fitting technique. In addition, the impact of the frequency dependence of soil parameters on the lightning performance of transmission lines is addressed." This may seem somewhat disconnected from reality for many, since it is a problem involving electrical engineering optimization.

Could someone help me reproduce these calculations? I have made little significant progress.

If you want to access the reference accounts, I'll send you the PDF

schroeder2017 [link to copyrighted material replaced by moderator]

Hello Dear Maple Users and Experts

I am running this code for N=3, but fsoolve can not work and did not give me any output. Could you help me how can I get the result?

Actually, I got the result for N=2. Exact solution is a[0]=0, a[1]=1, a[2]=1, b[1]^2=sqrt(2) and b[1]^2+b[2]^2=sqrt(3). But, for N=3, I can not receive any results from fsolve

Here is my code

restart;
Digits := 20;
L := 1;
N := 3;
alpha := 1;
xexact := t -> t^sqrt(2) + t^sqrt(3);
f := simplify(fracdiff(t^sqrt(2), t, alpha)) + simplify(fracdiff(t^sqrt(3), t, alpha));
f := unapply(f, t);
xapp := a[0] + sum(a[j]*t^sum(b[i]^2, i = 1 .. j), j = 1 .. N);
xapp := unapply(xapp, t);
xfrac := sum(a[jj]*simplify(GAMMA(sum(b[ii]^2, ii = 1 .. jj) + 1)/GAMMA(sum(b[ii]^2, ii = 1 .. jj) + 1 - alpha))*t^(sum(b[ii]^2, ii = 1 .. jj) - alpha), jj = 1 .. N);
xfrac := unapply(xfrac, t);
xfrac1 := sum(a[jj]*simplify(sum(b[ii]^2, ii = 1 .. jj)^(alpha + 1)/(sum(b[ii]^2, ii = 1 .. jj) - alpha))*t^(sum(b[ii]^2, ii = 1 .. jj) - alpha), jj = 1 .. N);
xfrac1 := unapply(xfrac1, t);
S1 := {seq(evalf(xfrac(k/(2*N)*L)) - evalf(f(k/(2*N)*L)) = 0, k = 1 .. 2*N)};
S2 := {xapp(0) = 0};
S := S1 union S2;
sol := fsolve(S);

First 48 49 50 51 52 53 54 Last Page 50 of 2216