Carl Love

Carl Love

28070 Reputation

25 Badges

13 years, 31 days
Himself
Wayland, Massachusetts, United States
My name was formerly Carl Devore.

MaplePrimes Activity


These are answers submitted by Carl Love

It's fairly easy. Here's a worksheet for it.


Finding the permutation that transforms one list into another

restart:

We start with a basic alphabet. This will work with any list of distinct elements.

L:= [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]:

We scramble it two ways. This will simulate your original two lists (which, of course, must be permutations of each other for this to work).

L||(1..2):= 'combinat:-randperm(L)' $ 2;

[c, h, i, l, g, q, u, k, v, x, m, y, b, s, n, a, r, j, t, p, f, z, o, w, e, d], [e, j, q, w, z, m, f, t, y, i, s, u, v, x, b, c, n, k, o, r, h, a, p, l, d, g]

Now we find the permutation that transforms L1 to L2.

Pdjc:= (`convert/disjcyc`@sort)~([L1,L2], output= permutation):

Pdjc1to2:= group:-mulperms(group:-invperm(Pdjc[2]), Pdjc[1]);

[[1, 25, 26, 5, 22, 16], [2, 18, 8, 19, 23, 20, 17, 15, 13, 9, 12, 7, 21], [3, 6, 11, 14, 10], [4, 24]]

That's the permutation that we want expressed in disjoint cycle (disjcyc) notation. To use it as an index, it needs to be in permlist notation.

P:= convert(Pdjc1to2, permlist, nops(L1));

[25, 18, 6, 24, 22, 11, 21, 19, 12, 3, 14, 7, 9, 10, 13, 1, 15, 8, 23, 17, 2, 16, 20, 4, 26, 5]

Finally, we show that P does indeed transform L1 into L2:

L1[P];

[e, j, q, w, z, m, f, t, y, i, s, u, v, x, b, c, n, k, o, r, h, a, p, l, d, g]

evalb(% = L2);

true

 

Now I put that together into a procedure that returns the permutation in disjcyc notation. If you need permlist notation, it's just a trivial change to the last line.

Perm1to2:= proc(L1::list, L2::list)
uses G= group;
local
     S1:= {L1[]},     
     Pdjc:= (`convert/disjcyc`@sort)~([L1,L2], output= permutation)
;
     if S1 <> {L2[]} or nops(L1) <> nops(S1) then
          error "Invalid input: Lists must have distinct elements and be "
               "permutations of each other"
     end if;
     G:-mulperms(G:-invperm(Pdjc[2]), Pdjc[1])
end proc:

 


Download permL1toL2.mw

Use the command Elements:

Elements(P2);

lprint(%);

{Perm([]), Perm([[1, 3, 5]]), Perm([[1, 5, 3]])}

Using the example that you provided, and automating the process of making the assumptions:

B:= [a-1, b+2, b-c, a*c-1]:
f:= a^2*c-a*c-a+1:
is(f <> 0) assuming (B <>~ 0)[];

     true

Unlike assume, assumptions made with assuming only last for duration of one command.

Since the x doesn't explicitly appear in g, you'd need to use

f:= unapply(piecewise(x<0, 0, x>0, g), x);

If you use the arrow form, then the x that appears in g isn't the same variable as the x to the left of the arrow: The former is a global variable, and the latter is a parameter.

This is almost certainly on a list of the top ten most-common Maple errors.

The button that you want is already there. It's the !!! in the middle of the top row of the tool bar.

The documentation about this use of % is at ?value.

The entire purpose of the command

%piecewise(``, x+y-2*z = 1, ``, 2*x+y-3*z = 5, ``, -x+y+z = 1);

is to achieve a certain prettyprinted effect: the equations in a column with a large curly brace on the left side. This was never intended to be converted from its inert form to active form. This command has no relation mathematically or computationally to the piecewise command; its only relation to piecewise is that its author wanted to display some equations in a manner similar to the way that Maple displays piecewise functions.

The name u remains---and must remain---entirely symbolic after the call to dsolve. Indeed, it is unusual (although not impossible) for any command to change the value of a name without an explicit assignment statement. If you do want a function that returns numeric evaluations of u, do this:

U:= X-> eval(u(x), num_n(X));

Now U(1) will return 1.

To load the contents of an audio file into a numeric Vector, use the command AudioTools:-Read (see ?AudioTools,Read).

If your variables were actually indexed as j[4] rather than as j_4, then the Answer of AmirHosein would suffice. To work with the actual j_4, etc., you need to use type suffixed. For example,

M:= mul(j_||k^rand(0..2)(), k= 0..15);

PrefLen:= length(j_); #Prefix length of `j_`

J:= indets(M, suffixed(j_, nonnegint));

add(parse(substring(j, PrefLen+1..-1))*degree(M,j), j= J);

     67

You can save them anywhere. I put them all in one directory (or folder) called "C:/Maple_packages". But you can put them in separate directories (or folders). To activate a package, all you have to do is append its directory name to the predefined global sequence libname:

libname:= libname, "C:/Maple_packages";

Now you can access the commands and the help pages of the packages just like you do with any regular Maple package.

Make sure that you append to libname rather than overwrite it. DON'T do

libname:= "C:/Maple_packages"; #DON'T DO THIS!!!

And you probably shouldn't do this either:

libname:= "C:/Maple_packages", libname; #Don't do this unless you really know what you're doing.

Once you're satisfied that the package is something that you'd like to use regularly, you can put the command which appends to libname into an initialization file, and then you can pretty much forget about it: Those add-on packages will be just like regular Maple packages.

(The Reply was updated for clarity due to Preben's Reply below.)

If RR1 and RR2 are two RealRanges, then RR1 being a subset of RR2 is equivalent to

is('x' in RR2) assuming 'x' in RR1;

Of course, the quotes can be omitted if you know that x is unassigned.

Operator in can be replaced with operator ::, which saves typing four spaces:

is(x::RR2) assuming x::RR1;

(Don't take this to mean that in can usually be replaced by ::. It usually can't be.)

Yes, it's possible to get the entire history of optimizations done with the Optimization package (procedures Maximize, Minimize, LPSolve, and NLPSolve) by using the procedural form of input (i.e., the objective and constraints are specified by procedures rather than expressions). See ?Optimization,General,OperatorForm. A crude way to do this would be to print out the values of the arguments inside the procedures. A more refined way is to increment an index and save those values to a table or Array. I'll post an example later.

My first inclination was to use a try ... catch statement as suggested by Robert Lopez, but then I saw an easier way for your situation. The break statement exits a do loop. For your code, setting h[i+1] to 0 was equivalent to exiting the loop. Notice how the if statement first checks the type of h[i+1]. This makes it safe to compare it with 0.

restart;
p1[0]:=
     .989347189582843*x^2 - 0.139423979061219e-1*x -
     1.82559474469870e8*x^15 + 1.30761381361453e8*x^16 -
     6.88520063191821e7*x^17 + 2.51079317463498e7*x^18 -
     5.66094206949155e6*x^19 + 5.94129446612678e5*x^20 -
     6812.74182685426*x^5 + 59230.0931084044*x^6  -
     3.83520584559500e5*x^7 + 1.90126822307036e6*x^8  -
     7.34991883857609e6*x^9 + 2.24203561757434e7*x^10 -
     5.43284775909785e7*x^11 + 1.04806113793011e8*x^12 -
     1.60600324339222e8*x^13 + 1.94090536353833e8*x^14 +
     559.557918804679*x^4 - 30.6576714427729*x^3  -
     3.93727537464007e-15
:

h[1]:= -1;
for i to 149 do
     p1[i]:= p1[0]-i^2-i:
     h[i+1]:= fsolve(p1[i]-0.312e-1, x, -.2 .. 0);
     if h[i+1]::numeric implies h[i+1] >= 0 then  break  end if;
     print(i, h[i])
end do;

Since you defined h as a procedure (because of the arrow) rather than as an expression, you wouldn't use eval to evaluate it. Just use h(10).

There's a bug in your h. You need to change cos^4*(x) to cos(x)^4.

If you want an actual decimal evauluation, use h(10.); h(10) essentially gives just a substitution without any significant computation in this case.

Most of the plot commands will try to use hardware float arithmetic to evaluate your expression, but they will fail because of the extreme exponents. To counteract this, use

UseHardwareFloats:= false:

Now assign your expression to F (or whatever name you like), and plot like this:

plots:-complexplot(F, del= -1e-13..1e-13);

and

plot([Re,Im](F), del= -1e-13..1e-13);

There are many other options for visualizing a complex function.

First 246 247 248 249 250 251 252 Last Page 248 of 395