acer

32333 Reputation

29 Badges

19 years, 320 days
Ontario, Canada

Social Networks and Content at Maplesoft.com

MaplePrimes Activity


These are answers submitted by acer

You could try,

seq([eval(t,1),length(t)], t in anames(':-user'));

or make your own more complicated version. See ?length

acer

You can apply both those rules, together or separately. Below they are applied separately. Is that what you mean?

restart:

ee:=cos(3*x)*cos(x) + sin(3*x)*sin(x):

applyrule(cos(a::integer*x)*cos(b::integer*x)
          =1/2*(cos((a-b)*x)+cos((a+b)*x)),
          ee);

           1            1                           
           - cos(2 x) + - cos(4 x) + sin(3 x) sin(x)
           2            2                           

applyrule(sin(a::integer*x)*sin(b::integer*x)
          =1/2*(cos((a-b)*x)-cos((a+b)*x)),
          ee);

                             1            1         
           cos(3 x) cos(x) + - cos(2 x) - - cos(4 x)
                             2            2         

If both are applied, then the terms collapse, and produce just cos(2*x).

acer

A := Matrix([[a, b], [b, c]], shape = symmetric, attributes = [positive_definite]):

B := LinearAlgebra:-LUDecomposition(A, method = Cholesky);
Bhat := simplify(B) assuming real, positive;
map(normal, Bhat.Bhat^%T - A );

F := LinearAlgebra:-LUDecomposition(A, method = Cholesky, conjugate=false);
map(normal, F.F^%T - A );

If you go with conjugate=false then you might still want to simplify under the assumption of being positive, depending on example.

acer

In 16.01 on 64bit Linux on an Intel i5, after about 5 minutes,

SolveTools:-SemiAlgebraic({f1+f2 = 5, f3+f4 = 11/2,
0 <f1, 0 < f2, 0 < f3, 0 < f4,
6 < f2+f3, 6 < f2+f4,
7 < f1+f4, 8 < f1+f3},
[f1,f2,f3,f4]);

[]

which, with [] as output, means no solutions.

More quickly,

SolveTools:-SemiAlgebraic({ a + b = 1, a > 0, b > 1, c > 0 }, {a,b,c});

[]

However, the computation time grows quickly with problem size, for this approach.

The `solve` command is using an older, faster, and buggier algorithm here.

acer

Instead of using a table (or list) and complexplot you could instead use a hardware datatype Matrix and call plots:-pointplot.

First, create a Matrix M like so,

   M := Matrix( 10^6, 2, datatype=float[8] ):

Then populate the first column of M with the real values and the second column with the imaginary values. If possible, alter your original code to do this directly instead of producing a table (or list) of complex values and copying values over into M by using `Re` and `Im`.

Then you could plot it with something like,

   plots:-pointplot( M );

If done right then this should be able to display the graphic of the plot in a matter of seconds rather than hours.

Your statement that you don't want an approximation is unclear. All plots turn any exact data into floating-point numbers at some point before rendering.

acer

Are you looking for something like this, perhaps?

F:=x->parse(sprintf("%.7f",x)):

F(66666.123456789);
                                66666.1234568

F(0.123456789);
                                  0.1234568

F(0.12345);
                                  0.1234500

expr:=(lambda1-2.9881355172134833*lambda2
       +16.044692204509636*lambda1^2
       -114.31727386075951*lambda1*lambda2
       +202.36051939112247*lambda2^2):

subsindets(expr,float,F);
                                                           2
           lambda1 - 2.9881355 lambda2 + 16.0446922 lambda1 

                                                                 2
              - 114.3172739 lambda1 lambda2 + 202.3605194 lambda2 

acer

If I have a hyperlink in a Maple worksheet which is of type URL and with target,

file:///C:/Users/Acer/Documents/22-19217.pdf

then clicking on it opens a new page in my web-browser. In my Maple 16's Tools->Options->General the web-browser is set as "System Default", which happens to be Chrome on my Windows 7. And my Chrome browser is configured to open PDF files inlined.

This is just simple use of the "file" URI scheme. Is that the kind of thing that you are trying to do?

Or were you hoping to have Maple itself directly open some other (dedicated) PDF reader, bypassing web-browsers, and using some mechanism other than URL?

acer

It shouldn't be too hard to write one's own procedure to do this.

Here's a quick and rough example. With a few edits it could be made to insert circular rather than rectangular boundaries, or to allow options to specify say the center of the magnification subwindow (instead of using offsetx and offsety as below). With more effort it might be made clever about placement of the magnification subwindow (according to available whitespace, or whether the curve's region of interested is in/decreasing, etc).

This is very rough. Amongst other restrictions, it can only use `plot` on expression `f`, and it assumes that the PLOT data structure produced by plot(f,x=a..b) will consist of a certain structure of CURVES and Matrix data.

 

restart:

ins:=proc( f, x, a, b, suba, subb,
          {scalex::numeric:=3}, {scaley::numeric:=3},
          {offsetx::numeric:=-2}, {offsety::numeric:=1},
          {plotoptions::list:=[]}, {subplotoptions::list:=[]} )
local P,Pin,PinMat,PinVec1,PinVec2,T,minx,maxx,miny,maxy,
      pl1,pl2,plb,plr,plt,pll,pb,pr,pt,pl,fsuba,fsubb;
uses plottools;
  P:=plot(f,x=a..b,op(plotoptions));
  Pin:=plot(f,x=suba..subb,op(subplotoptions));
  T:=transform((x,y)->[scalex*x+offsetx,scaley*y+offsety]);
  Pin:=T(Pin);
  PinMat:=op([1,1],Pin);
  PinVec1,PinVec2:=PinMat[1..-1,1],PinMat[1..-1,2];
  minx,maxx:=min(PinVec1),max(PinVec1);
  miny,maxy:=min(PinVec2),max(PinVec2);
  plb:=line([minx,miny],[maxx,miny],'thickness'=0);
  plr:=line([maxx,miny],[maxx,maxy],'thickness'=0);
  plt:=line([maxx,maxy],[minx,maxy],'thickness'=0);
  pll:=line([minx,maxy],[minx,miny],'thickness'=0);
  fsuba,fsubb:=evalf(eval(f,x=suba)),evalf(eval(f,x=subb));
  pb:=line([suba,fsubb],[subb,fsubb],'thickness'=0);
  pr:=line([subb,fsubb],[subb,fsuba],'thickness'=0);
  pt:=line([subb,fsuba],[suba,fsuba],'thickness'=0);
  pl:=line([suba,fsuba],[suba,fsubb],'thickness'=0);
  pl1:=line([suba,fsuba],
            [scalex*suba+offsetx,scaley*fsuba+offsety],
            'linestyle'='dot');
  pl2:=line([subb,fsubb],
            [scalex*subb+offsetx,scaley*fsubb+offsety],
            'linestyle'='dot');
  plots:-display(P, pb, pr, pt, pl,
                 Pin, plb, plr, plt, pll, pl1, pl2,
                 'view'=[0..maxx+1,-1..maxy+1], _rest);
end proc:

ins(sin(t)+1/40*sin(40*t), t, 0, 6, 2, 3,
    scaling = constrained);

ins(sin(t)+1/40*sin(40*t), t, 0, 6, 2, 2.5,
    scalex = 6, scaley = 6, offsetx = -9, offsety=-2,
    plotoptions = [color = green],
    subplotoptions = [adaptive = 12, resolution = 1600,
                      numpoints = 1000, color = blue],
    scaling = constrained);

ins(sin(t)+1/40*sin(40*t), t, 0, 8, 5, 6,
    scalex = 6, scaley = 6, offsetx = -29, offsety=9,
    plotoptions = [color = green],
    subplotoptions = [adaptive = 12, resolution = 1600,
                      numpoints = 1000, color = blue],
    scaling = constrained);

 

 

Download insertmag.mw

I'm sure that lots of improvements are possible, to make this more robust, less buggy, or more general.

I don't understand why there are gridlines showing in the above plots, inlined here (by maplenet?). There are no such gridlines in the plot outputs displayed in ther actual worksheet. This is what the middle plot actually looks like,

ps. Please don't feel compelled to spend time reporting bugs in this rough proto-code... unless you want to be a viking and post improvements.

acer

restart:
f := (x,y) -> x*y+x^2+1:  # this expects two arguments
g := t -> (2*t, 3*t):     # this returns an expression sequence

(f@g)(x);
                               2    
                           10 x  + 1

unapply( (f@g)(x), x );

                                 2    
                        x -> 10 x  + 1


restart:
f := (V::Vector) -> V[1]*V[2]+V[1]^2+1:   # this expects a Vector
g := t -> <2*t, 3*t>:                     # this returns a Vector

(f@g)(x);
                               2    
                           10 x  + 1

unapply( (f@g)(x), x );

                                2    
                       x -> 10 x  + 1

acer

Try the ScatterPlot command, to apply lowess smoothing of the data. You can adjust various options (eg. bandwidth, degree).

P:=Statistics:-ScatterPlot(xyData[1..-1,1],xyData[1..-1,2],lowess,bandwidth=1/20):

P;

Given P the plot structure which displays as above, generated by the ScatterPlot command, you can extract the new, smoothed data (as a new Matrix).

newdata:=plottools:-getdata(P)[2,3]:

plots:-display(Array([plots:-pointplot(xyData),
                      plots:-pointplot(newdata)]));

acer

The 3rd suggestion below, of faking the axes on the smaller, acaled & shifted subplot, is the kind of thing that some people enjoy coding.

The Label in the worksheet's 1st suggestion doesn't inline properly to this site's maplenet, so here that one is (after manually doing bmp-jpg just so I could upload it). I didn't bother inlining the density plot from the 2nd suggestion below, as it makes the worksheet huge.


 

restart:

with(ImageTools):

1st way, by printing both plots to image file, reading in and overlaying those images,

and placing resulting image on a Label component. This is easy.

plotsetup(default):

p1:=plot(sin(x),x=0..2*Pi,tickmarks=[decimalticks,default],
         axesfont=[Helvetica,10,bold],color=blue):

fn:=cat(kernelopts(homedir),"/fn.bmp"):

plotsetup(bmp,plotoutput=fn,plotoptions="height=400,width=600");

print(p1):
plotsetup(default):

fclose(fn): Threads:-Sleep(1):

img:=Read(fn):
rtable_dims(%);

p2:=plot(cos(x),x=0..2*Pi,tickmarks=[decimalticks,default],
         axesfont=[Helvetica,20],labels=[``,``],color=blue):

fn2:=cat(kernelopts(homedir),"/fn2.bmp"):

plotsetup(bmp,plotoutput=fn2,plotoptions="height=400,width=600");

print(p2):
plotsetup(default):

fclose(fn2): Threads:-Sleep(1):

img2:=Read(fn2):

img2:=Scale(img2,0.40):
img2:=Threshold(img2,0.85):
rtable_dims(img2);

#View(img2);
#View(imgnew);

imgnew:=SetSubImage( img, img2, 20, 330 ):
Write(fn,imgnew):

DocumentTools:-SetProperty(Label0,image,fn);

 
 

 2nd way, as density plot produced from overlaid images.

This would look better it the axes were thickened up, and perhaps the curves too, before the earlier

stage of conversion to image. Also GUI performance of 2D densitiy plots is very slow. Don't right-click on it.
nb. This would be also easier if one could place a background image on a regular plot.

 

restart:

with(ImageTools):

plotsetup(default):

p1:=plot(sin(x),x=0..2*Pi,tickmarks=[decimalticks,default],
         axesfont=[Helvetica,16],color=blue,thickness=3,
         axis=[thickness=3]):

fn:=cat(kernelopts(homedir),"/fn.bmp"):

plotsetup(bmp,plotoutput=fn,plotoptions="height=400,width=600");

print(p1): plotsetup(default):

fclose(fn): Threads:-Sleep(1): img:=Read(fn):

p2:=plot(cos(x),x=0..2*Pi,tickmarks=[decimalticks,default],
         axesfont=[Helvetica,30],labels=[``,``],color=blue,
         thickness=5,axis=[thickness=4]):

fn2:=cat(kernelopts(homedir),"/fn2.bmp"):

plotsetup(bmp,plotoutput=fn2,plotoptions="height=400,width=600");

print(p2): plotsetup(default):

fclose(fn2): Threads:-Sleep(1): img2:=Read(fn2):

img2:=Scale(img2,0.40):
img2:=Threshold(img2,0.85):

imgnew:=SetSubImage( img, img2, 20, 330 ):

m,n := ImageTools:-Width(imgnew),ImageTools:-Height(imgnew):

C:=ArrayTools:-Alias(imgnew,[m*n,3]):

ArrayTools:-DataTranspose(C,n,m,1):

P:=ArrayTools:-Alias(C,[m,n,3]):

P:=ArrayTools:-FlipDimension(P,2):

p:=plots:-densityplot(1,x=1..m,y=1..n,axes=none,scaling=constrained,

                      style=patchnogrid,gridlines=false,grid=[m,n]):

p:=subsindets(p,specfunc(anything,COLOR),z->COLOR(RGB,P)):

p;

 

 3rd way, by faking the axes on the subplot as a combination of lines and text, and then using plottools
to transform it -- scale and shift -- and then using plots:-display to overlay in the usual way. Left as

exercise for the reader, because it is finicky work to get the faked axes to look exactly the same as usual.

 

 

Download plotinplot2.mw

acer

I'm glad that people new to Maple don't have to figure out existing code with statements such as `yrt`, `corp`, `esu`, and `eludom`. I don't see that much merit in being terse and slick at the expense of clarity.

These choices were made apparent in Maple 6 (...in Jacques' time), and this all reflects the preferences of the designers and decision makers.

acer

Suppose that you have implemented a Maple program which can be easily split (parellelized) at a high juncture in the code, but for which each computational "thread" involves thread-unsafe operations (eg. calls to Library routines such a `int`, `is`, `limit`, etc). You may not be able to apply the Threads package in order to parellelize the total computation, because the thread-unsafe procedures could clobber each others' global state. In such a situation, you might be able to gain a performance improvement on a single multicore machine by using the Grid toolbox.

Perhaps someone could find the time to illustrate with an example, showing not only a performance gain from using Grid but also demonstrating failure via Theads. The reason I mention parellelizing at a high point in the code is that overhead of Grid is probably not negligible. I'm just guessing, but perhaps a difficult symbolic definite integration example using several methods in parallel.

acer

If you keep having these kinds of troubles (this is the thrid time, at least?~), then why not switch from 2D Math input to 1D Maple notation?

acer

I found it tough to get Maple to look at y=7, x=1..3 as one of the canditate ranges for which the objective is purely real. I was trying to code it in such a way as to give Maple as little help and prodding as I could.

One thing that made this tougher than it ought to be is that I wasn't sure how hard I should try and get Maple to go from something like, {x>=1,x<=3} to x=1..3.  (See the member of newS in the attached worksheet, which correspondes to this.) This aspect makes a difference because, Optimization:-Maximize seems to go awry when this restriction is passed as a pair of constraints, but succeeds when it is passed as simple bounds. See end of attached worksheet.

 

restart:

interface(warnlevel=0):

obj:=sqrt((x-1)*(y-x))+sqrt((7-y)*(1-x))+sqrt((x-y)*(y-7));

((x-1)*(y-x))^(1/2)+((7-y)*(1-x))^(1/2)+((x-y)*(y-7))^(1/2)

plot3d([Re,Im](obj), x=-2..3, y=0..11, color=[red,blue], axes=box);

S:=[solve(evalc(Im(obj)))]:  # takes a little while

newS:={seq(solve(s union {x>=-2,x<=3,y>=0,y<=11}),s in S)};

{{x = 1, y = 1}, {x = 1, y = 4}, {x = 1, y = 7}, {x = 1, 1 <= y, y <= 7}, {x = y, 0 <= y, y <= 1}, {y = 7, x <= 3, 1 < x}}

for s in newS do
   try
      seql,sineq:=selectremove(type,s,`=`);
      ans:=Optimization:-Maximize(eval(obj,seql), sineq,
                                  initialpoint=[x=1/2,y=1/2]);
      print(ans[1],[ans[2][],seql[]]);
   catch:
   end try:
end do;

2.64575131106459072, [y = HFloat(5.551115123125783e-17), x = y]

for s in newS do
   try
      seql,sineq:=selectremove(type,s,`=`);
      ans:=Optimization:-Maximize(eval(obj,seql), sineq,
                                       initialpoint=[x=1,y=5]);
      print(ans[1],[ans[2][],seql[]]);
   catch:
   end try:
end do;

3., [y = HFloat(4.000000000000039), x = 1]

-0., [y = HFloat(1.0), x = y]

#plots:-display(Array([
#   plot([Re,Im](eval(obj,x=1)),y=0..11,view=0..5),
#   plot([Re,Im](eval(obj,y=7)),x=-2..3,view=0..5),  # method above missed this one
#   plot([Re,Im](eval(obj,x=y)),y=0..1,view=0..5) ]));

 

Download toughopt1.mw

For some reason maplenet is not inlining the resst of the sheet. See the link for a bit more.

acer

First 254 255 256 257 258 259 260 Last Page 256 of 336