acer

30385 Reputation

29 Badges

18 years, 264 days
Ontario, Canada

Social Networks and Content at Maplesoft.com

MaplePrimes Activity


These are answers submitted by acer

I wouldn't prefer the LinearAlgebra:-Column command for any example for which Matrix-indexing is convenient and terse. That's just a personal preference.

Eg,

M := LinearAlgebra:-RandomMatrix(5);

Matrix(5, 5, {(1, 1) = -81, (1, 2) = -98, (1, 3) = -76, (1, 4) = -4, (1, 5) = 29, (2, 1) = -38, (2, 2) = -77, (2, 3) = -72, (2, 4) = 27, (2, 5) = 44, (3, 1) = -18, (3, 2) = 57, (3, 3) = -2, (3, 4) = 8, (3, 5) = 92, (4, 1) = 87, (4, 2) = 27, (4, 3) = -32, (4, 4) = 69, (4, 5) = -31, (5, 1) = 33, (5, 2) = -93, (5, 3) = -74, (5, 4) = 99, (5, 5) = 67})

seq(M[..,i],i=1..5);

Vector(5, {(1) = -81, (2) = -38, (3) = -18, (4) = 87, (5) = 33}), Vector(5, {(1) = -98, (2) = -77, (3) = 57, (4) = 27, (5) = -93}), Vector(5, {(1) = -76, (2) = -72, (3) = -2, (4) = -32, (5) = -74}), Vector(5, {(1) = -4, (2) = 27, (3) = 8, (4) = 69, (5) = 99}), Vector(5, {(1) = 29, (2) = 44, (3) = 92, (4) = -31, (5) = 67})

Download Matrix_Cols.mw

Your code has several invalid calls to int, and several missing commas in the code of the plot calls.

Please compare worksheets.

ode_Plots_error_ac.mw

Do you mean something like the following? We can get similar effects using a loop, or using seq.

M := Matrix(4,4):

for i from 1 to 4 do
  for j from 1 to i do
    M[i,j] := [i,j];
  end do;
end do:

M;

Matrix(4, 4, {(1, 1) = [1, 1], (1, 2) = 0, (1, 3) = 0, (1, 4) = 0, (2, 1) = [2, 1], (2, 2) = [2, 2], (2, 3) = 0, (2, 4) = 0, (3, 1) = [3, 1], (3, 2) = [3, 2], (3, 3) = [3, 3], (3, 4) = 0, (4, 1) = [4, 1], (4, 2) = [4, 2], (4, 3) = [4, 3], (4, 4) = [4, 4]})

seq( seq( [i,j], j=1..i ), i=1..4);

[1, 1], [2, 1], [2, 2], [3, 1], [3, 2], [3, 3], [4, 1], [4, 2], [4, 3], [4, 4]

 

Download loop_ex1.mw

Ok, so there are a few issues to deal with.

1) Instead of using _rest to pass along any extra options to the plotting commands I set it up to use a new keyword option plopts. That avoids a clash with using the lowercase names for Qdim's keyword options. There are several stock Library commands that use such an approach. (You can back that out, and use the capitalized names or other, if you prefer. I just wanted to show this to you.)
2) I also made the point and line options work, by having Qdim explicitly name a terse substitute pt for plottools in its uses syntax. I also did the same for plots in that uses. This allows for reasonably terse (but understandable) code.
3) I also made Qdim's lowercase print option work, by invoking the global command by :-print instead.
4) I also put uneval quotes around keyword options in use in Qdim, and uneval quotes around the global versions of (stock unprotected) names used as option values. This is to guard against Qdim breaking if any of these names got assigned some values at the top-level. I used maplemint to discover such.

I suggest you stress test (as your examples do).

restart;

# changed  points   to point
#          linetype to line
#          scl      to scale   # lower case dont know if clashes
#          clr      to colour
#          prnt     to print

Prntmsg:="y"; Geomclr:="Blue";

"y"

"Blue"

Qdim := proc(P1, P2, {Q:=[ NULL,:-align={':-left'}]},
                     {vec1::list:=[NULL,:-align={':-below',':-right'}]},
                     {scale::{list,numeric}:=1},
                     {leader::{-1,0,1}:= 1},
                     {dimofset::{1,2,3,4,5,6}:=1},
                     {point::list:=['color' = ':-blue', symbol = ':-solidcircle', 'symbolsize' = 8]},
                     {line::list:=['thickness'=3]},
                     {colour::`string`:="blonde"},
                     {print:=Prntmsg},
                     {plopts::list:=[]})
description " plots Quadrance symbol and value (Q)";
uses pl=plots, pt=plottools; # RationalTrigonometry;
local a,f,g,h,v1,delta,mp, BoxQ,Qsymbol,pt1,pt2,pt3,pt4,Scl,
      ptxtp1,ptxtp2,txtplt1,txtplt2,plttyp,thk,l12,pts12;

if P1[1]::{list, Vector[row]} then
   pt1:=`if`(P1[1]::Vector[row],convert(P1[1],list),P1[1]);
   plttyp:=`if`(nops(pt1)=3,3,2); # print(pt1,plttyp);
   ptxtp1:=[op(pt1),op(P1[2..-1])];
   txtplt1:=true;  
 else
   pt1:=`if`(P1::Vector[row],convert(P1,list),P1);#print(pt1);
   plttyp:=nops(pt1);
   txtplt1:=false;
end if;    

if P2[1]::{list, Vector[row]} then
   pt2:=`if`(P2[1]::Vector[row],convert(P2[1],list),P2[1]);#print(pt2);
   if plttyp<>nops(pt2) then error `different dimension in inputs`end if;
   ptxtp2:=[op(pt2),op(P2[2..-1])];
   txtplt2:=true;
 else
   pt2:=`if`(P2::Vector[row],convert(P2,list),P2);#print(pt2);
   if plttyp<>nops(pt2) then error `different dimension in inputs`end if;
   txtplt2:=false;
end if;

#if scl::numeric then
    Scl:=scale;
 #else
  # pt3:=`if`(scl[1]::Vector[row],convert(scl[1],list),scl[1]);
   #pt4:=`if`(scl[2]::Vector[row],convert(scl[2],list),scl[2]);
    #if plttyp = 2 then
     #  Scl:=evalf(sqrt(Quadrance(pt3,pt4,"b","n")/Quadrance(pt1,pt2,"b","n")));
     #else
      # Scl:=evalf(sqrt(Quadrance(pt3,pt4,"n")/Quadrance(pt1,pt2,"n")));
   # end if;
#end if;
if plttyp =2 then
     a :=Scl* dimofset*0.1*leader*[-pt2[2]+pt1[2], pt2[1]-pt1[1]]; #dimension leader lines
  else
     a :=Scl* dimofset*0.1*leader*[-pt2[2]+pt1[2], pt2[1]-pt1[1],pt2[3]-pt1[3]]; #dimension leader lines
end if;
delta:=Scl*(pt2-pt1);
mp:=(1-1/2)*pt1+1/2*pt2;  #midpoint of line
#print(Scl,a,delta,mp);
if plttyp = 2 then
    BoxQ:=[[a[1]+mp[1]+.05*delta[1]-.01*delta[2],a[2]+mp[2]+.05*delta[2]+.01*delta[1]],
           [a[1]+mp[1]-.05*delta[1]-.01*delta[2],a[2]+mp[2]-.05*delta[2]+.01*delta[1]],
           [a[1]+mp[1]-.05*delta[1]+.01*delta[2],a[2]+mp[2]-.05*delta[2]-.01*delta[1]],
           [a[1]+mp[1]+.05*delta[1]+.01*delta[2],a[2]+mp[2]+.05*delta[2]-.01*delta[1]]];
 else
    BoxQ:=[[a[1]+mp[1]+.05*delta[1]-.01*delta[2],a[2]+mp[2]+.05*delta[2]+.01*delta[1],a[3]+mp[3]+.05*delta[3]],
           [a[1]+mp[1]-.05*delta[1]-.01*delta[2],a[2]+mp[2]-.05*delta[2]+.01*delta[1],a[3]+mp[3]-.05*delta[3]],
           [a[1]+mp[1]-.05*delta[1]+.01*delta[2],a[2]+mp[2]-.05*delta[2]-.01*delta[1],a[3]+mp[3]-.05*delta[3]],
           [a[1]+mp[1]+.05*delta[1]+.01*delta[2],a[2]+mp[2]+.05*delta[2]-.01*delta[1],a[3]+mp[3]+.05*delta[3]]];
end if;

if leader<>0  then
   thk:='thickness'=0
 elif line<>[] then
   thk:=line[op(ListTools:-Search(op(select(has,line,'thickness')),line))];
 else
   thk:='thickness'=0;
end if;

Qsymbol:= [pt:-line(pt1,pt1+a,'thickness'=0,plopts[]),
           pt:-line(pt1+a,mp-.05*delta+a,thk,plopts[]),
           pt:-line(op([BoxQ[1],BoxQ[2]]),'thickness'=0,plopts[]),
           pt:-line(op([BoxQ[2],BoxQ[3]]),'thickness'=0,plopts[]),
           pt:-line(op([BoxQ[3],BoxQ[4]]),'thickness'=0,plopts[]),
           pt:-line(op([BoxQ[4],BoxQ[1]]),'thickness'=0,plopts[]),
           pt:-line(pt2+a,mp+.05*delta+a,thk,plopts[]),
           pt:-line(pt2,pt2+a,'thickness'=0,plopts[])];
    
if point<>[]then           
pts12:=pt:-point([pt1,pt2],point[]);  #end points
else
pts12:=NULL;
end if;
if line<>[] then
l12:=pt:-line(pt1,pt2,line[]);
  else
  l12:=NULL;
  end if;
if plttyp = 2 then
    f := pl:-textplot([op((pt1+pt2)/2+1*(a)),op(Q)]);  #Quadrance text
   if txtplt1 then
      g := pl:-textplot( ptxtp1);
    else
      g:=NULL;
   end if;
   if txtplt2 then
      h := pl:-textplot( ptxtp2);
    else
     h:= NULL;
   end if;
    v1:=pl:-textplot([op((pt1+pt2)/2), op(vec1)]);#`#mover(mi("v"),mo("&rharu;"))`[1,2]   {':-below',':-right'}
 else

   f := pl:-textplot3d([op((pt1+pt2)/2+1*(a)),op(Q)]);
   if txtplt1 then
         g := pl:-textplot3d( ptxtp1);
      else
         g:=NULL;
   end if;
   if txtplt2 then
         h := pl:-textplot3d( ptxtp2);
      else
         h:=NULL;
   end if;
    v1:=pl:-textplot3d([op(pt1+pt2)/2,op(vec1)]);#`#mover(mi("v"),mo("&rharu;"))`[1,2]   {':-below',':-right'}
end if;
#print("pltyp" , plttyp)  ;
if print="y" then :-print(cat("Quadrance symbols  ",colour,"  geometry")); end if;
if leader = 0 then    
    pl:-display(pts12,f,g,h,Qsymbol,'axes'=':-none','scaling'=':-constrained');
 else       
         pl:-display(pts12,l12,f,g,h,Qsymbol,'axes'=':-none','scaling'=':-constrained');     
end if;
end proc:

maplemint(Qdim);

Procedure Qdim( P1, P2, { Q := [NULL, :-align = {':-left'}], colour::string :=
    "blonde", dimofset::{1, 2, 3, 4, 5, 6} := 1, leader::{-1, 0, 1} := 1,
    line::list := [('thickness') = 3], plopts::list := [], point::list :=
    [('color') = (':-blue'), symbol = (':-solidcircle'), ('
symbolsize') = 8],
    print := Prntmsg, scale::{list, numeric} := 1, vec1::list := [NULL,
    :-align = {':-below', ':-right'}] } )
  These local variables were never used:  pt3, pt4
  These local variables were assigned a value, but otherwise unused:  v1

 

P1:=[2,3,6]:
P2:=[1,5,7]:
P3:=P1+1/3*(P2-P1)

[5/3, 11/3, 19/3]

plt1:=Qdim([P1,typeset("P1=",P1),align=below],[P2,P2,align=right ],
           dimofset=2,Q=["Q12\n",align =above],plopts=[colour=black]);

"Quadrance symbols  blonde  geometry"

plt2:=Qdim([P1,typeset("P1=",P1),align=below],[P3,P3,align=right ],
           scale=2,Q=["Q13\n",align =above],print="n");
#scl affects the linine up of dimesion lines prnt="n" no message displayed

plt3:=Qdim(P3,P2,scale=1,Q=["Q23\n",align =above],point=[],
           line=[],colour="RED");
#doesn't plot points and line. shows use of `clr`

"Quadrance symbols  RED  geometry"

plots:-display(plt1,plt2,plt3)

P5:=[1,2]:P6:=[-1,4]:

Qdim([P5,"P5   ",align={below,left}],[P6,"   P6",align={right}],
     Q=[typeset("\nQ[5,6]"),align={below,left}],line=[linestyle=dash],
     point=[symbolsize=20,symbol=solidcircle,colour=orange]);

"Quadrance symbols  blonde  geometry"

Qdim([P5,"P5   ",align={below,left}],[P6,"   P6",align={right}],
     leader=0,Q=[typeset("\nQ[5,6]"),align={below,left}],
     point=[symbolsize=18]);

"Quadrance symbols  blonde  geometry"

 

Download 2024-03-09_Example_parm_names_changed_acc.mw

I've used Maple 2024.0 here.

restart

expr1 := m^3*r*(cos(theta)^6*a^6-9*cos(theta)^4*a^4*r^2+11*cos(theta)^2*a^2*r^4-(1/3)*r^6)*(cos(theta)^2*a^2-(1/3)*r^2)/(r^2+cos(theta)^2*a^2)^9

expr2 := (a^8*(r^10-10*m*r^9+(5*(a^2+8*m^2))*r^8-80*m^3*r^7+(10*(a^4+12*a^2*m^2+8*m^4))*r^6+(4*(-15*a^4*m-40*a^2*m^3-8*m^5))*r^5+(10*(a^6+12*a^4*m^2+8*a^2*m^4))*r^4+(40*(-a^6*m-2*a^4*m^3))*r^3+(5*(a^8+8*a^6*m^2))*r^2-10*a^8*m*r+a^10)*cos(theta)^8-(1/3)*(28*(-30*sin(theta)^2*a^4*m*r^5*(1/7)+r^10-10*m*r^9+(5*(a^2+8*m^2))*r^8+(40*(-a^2*m-2*m^3))*r^7+(10*(a^4+12*a^2*m^2+8*m^4))*r^6+(32*(-5*a^2*m^3-m^5))*r^5+(10*(a^6+12*a^4*m^2+8*a^2*m^4))*r^4+(40*(-a^6*m-2*a^4*m^3))*r^3+(5*(a^8+8*a^6*m^2))*r^2-10*a^8*m*r+a^10))*a^6*r^2*cos(theta)^6+(14*(-260*sin(theta)^2*a^6*m*r^3*(1/7)+r^10-10*m*r^9+(5*(a^2+8*m^2))*r^8+(40*(-a^2*m-2*m^3))*r^7+(10*(a^4+12*a^2*m^2+8*m^4))*r^6+(4*(-15*a^4*m-40*a^2*m^3-8*m^5))*r^5+(10*(a^6+12*a^4*m^2+8*a^2*m^4))*r^4-80*a^4*m^3*r^3+(5*(a^8+8*a^6*m^2))*r^2-10*a^8*m*r+a^10))*a^4*r^4*cos(theta)^4-4*a^2*(-10*a^8*m*r*sin(theta)^2+r^10-10*m*r^9+(5*(a^2+8*m^2))*r^8+(40*(-a^2*m-2*m^3))*r^7+(10*(a^4+12*a^2*m^2+8*m^4))*r^6+(4*(-15*a^4*m-40*a^2*m^3-8*m^5))*r^5+(10*(a^6+12*a^4*m^2+8*a^2*m^4))*r^4+(40*(-a^6*m-2*a^4*m^3))*r^3+(5*(a^8+8*a^6*m^2))*r^2+a^10)*r^6*cos(theta)^2+(1/9)*r^8*(a^2-2*m*r+r^2)^5)*m^3*r/((r^2+a^2*cos(theta)^2)^9*(a^2-2*m*r+r^2)^5)

factor(expand(combine(expr2), trig))

(1/9)*r*m^3*(3*cos(theta)^2*a^2-r^2)*(3*cos(theta)^6*a^6-27*cos(theta)^4*a^4*r^2+33*cos(theta)^2*a^2*r^4-r^6)/(r^2+cos(theta)^2*a^2)^9

NULL

Download QuestionSimplifyMultivariateRationalFunction_ac.mw

Since simplify is not by itself (well, no longer, since M2023) finding the trig simplification then the key to my approach above is to force the trig combine of the sin and cos terms in the second expression. The subsequent trig expand gets the simpler thing with just cos.

I shall submit bug reports against the regression & weaknesses in simplify.

If you're going to use plot3d to construct 3d lines then you might as well pass the option grid=[2,2] and cut down the wasted memory. The default is [49,49], but you only need the end-points, so without that option your plot3d construction is unnecessarily about 25 times too big.

Similarly, if you're using spacecurve for mere lines and want solid colors then you could pass numpoints=2 to that command, again to avoid unnecessarily wasting time and space. (It's hard to measure the time gain, since the example is already very quick.)

That might all seem pedantic, but those kind of considerations can really come into play when one starts animating/exploring plots, etc.

But why not just use plottools:-line, with the two Vectors you already have? I mean, instantiating them both at the end-points for lambda. That get's that memory efficiency directly.

restart

with(plottools): with(plots,display):

l:=([2,-3,1],<3,7/9,6>):   # 3d line point + vector

P:=[7,-8,9]:

pl:=`+`~(lambda*l[2],l[1]): #3d line as vector eqn

vnl:=`-`~(pl,P) : #vector from Point P to 3D line

vnl.l[2] assuming `real` ; #dot product of vectors= 0 when perpendicular

(3694/81)*lambda-532/9

sol:=solve( {  }, [lambda] )[];

[lambda = 2394/1847]

intP:=eval(pl,sol):  #intersection point

l2:=P,eval(vnl,sol) :  #perpendicular 3D line through P

pl2:=`+`~(lambda*l2[2],l2[1]): #3D line as vector eqn

display(
      line(eval(pl,lambda=-.5),eval(pl,lambda=1.8),thickness=0,colour=orange),
      line(eval(pl2,lambda=-.5),eval(pl2,lambda=1.8),thickness=0,colour=purple),
      point(P,colour=blue ,symbolsize=15,symbol=solidsphere),
      point(l[1],colour=green ,symbolsize=15,symbol=solidsphere),
      point(eval(pl,sol),colour=red ,symbolsize=15,symbol=solidsphere),
      arrow(l,0.2, 0.4, 0.1,colour=green),
      arrow(l2,0.2, 0.4, 0.1,colour=blue),
      axes=normal,scaling=constrained);

Download Perpendicular_3D_lines_ac.mw

You might be able to get by with,

     is(simplify(tmp - r) = 0)

quite often.

I'm not sure what you want, as "simpler".

I haven't included anything like alias or LargeExpression:-Veil.

But maybe there are some ideas here for you (including a variety of "expression size" metrics),
expression_to_simplify_ideas.mw

You also asked about this behavior in August, 2021.

Your call to the parse command constructs the global name `a`, which is not your procedure's assigned local a.

restart;

p := proc()
  local a;
  return addressof(parse("a")),
         addressof(:-a),
         addressof(a);
end proc:

p();

36893628368009992380, 36893628368009992380, 36893628368009992636

Download parse_ex.mw

restart;

a := 17:

p := proc()
  local a;
  a := 25;
  return parse("a",statement);
end proc:

p();

17

Download parse_ex2.mw

That post had several comments removed, on different dates. (Spammers seem to latch on to Posts more than Questions.)

Sometimes this confuses the counter.

If the values of b is NULL then the call test(a,b) makes test receive just a as passed argument, since the expression sequence a,NULL collapses here. So then the second positional parameter of test (its own b parameter) can take on its default value.

The spelling is NULL, not Null as you had it.

Also, you had a colon (statement terminator) immediately after the closing bracket of the parameter spec of the definition of the procedure assigned to test2. For 2D Input mode that forms an out of place statement (albeit empty) if you want to have the local declarations following that.

nb. This site doesn't render the 3,2 that gets printed as a side-effect of the r() call. But it does all show in Maple's GUI.

test := proc (a := 1, b := 2) print(a, b); return a+b end proc

NULL

test2 := proc (a) local inner; inner := proc (b := NULL) return test(a, b) end proc; return inner end proc

NULL

r := test2(3)

inner

r(4)

7

r()

5

NULL

Download Curry_ac.mw

restart;

with(NumberTheory):

 

q := RepeatingDecimal(1/12);

_m140603429136128

nrp := NonRepeatingPart(q, output=float);

0.80e-1

rp := RepeatingPart(q, output=float);

0.3e-2

 

q := RepeatingDecimal(1/112);

_m140603325618240

NonRepeatingPart(q, output=float);

0.8900e-2

RepeatingPart(q, output=float);

0.285714e-4


Download rep_dec.mw

There are quite a few alternatives. For example, (using textplot rather than as a title, since you did),

   plots:-textplot( [ 3 ,3, Typesetting:-Typeset(A^``(1))(x) ] )

I didn't check for very high efficiency, though I made a few tweaks (putting the digits in sets, using ormap for quicker bailout instead of nops, etc).

What size of sets, and how many, do you need to handle?

A := {12, 17, 24, 28}:
B := {358, 568}:

TA:=table([map(a->a={StringTools:-Explode(convert(a,string))[]},A)[]]):
TB:=table([map(b->b={StringTools:-Explode(convert(b,string))[]},B)[]]):

{seq(seq(`if`(ormap(member,TA[a],TB[b]),
              NULL,parse(cat(a,b))),b=B),a=A)};

           {12358, 12568, 17358, 17568, 24358, 24568}

I didn't test whether parse(cat(a,b)) is a near-optimally efficient way do the blend. (I don't know whether all the second set's values will be of the same length, and that knowledge may bring improvements.)

For some kinds of problem like this the best approaches depend on the example class. One approach might be better for doing very many smaller examples, and another approach might be better for doing even a few very large examples. We haven't (yet) been informed of such details. Without knowing, there's less point in comparing the ormap'd member versus set intersection.

[edit] The above code rejects the unwanted results during the formation of the cartesian product. That's in contrast to, say, forming the whole cartesian product and only afterwards removing the unwanted values. Sometimes (but not for this small example) the whole cartesian product can be prohibitively large.

You could fill out the form for a Software Change Request (a euphemism for "bug report").

(Don't worry that it appears Maple-specific. Some person should read it and assign it appropriately.)

First 7 8 9 10 11 12 13 Last Page 9 of 316