acer

32637 Reputation

29 Badges

20 years, 51 days
Ontario, Canada

Social Networks and Content at Maplesoft.com

MaplePrimes Activity


These are answers submitted by acer

You could also solve the characteristic polynomial of dFxdU, without having to convert to rationals.

solve(charpoly(dFxdU,lambda),lambda);
                                    (1/2)       /                      (1/2)\
                  rho u + (rho g pt)         1. \-1. rho u + (rho g pt)     /
u, u, u, u, u, u, -----------------------, - --------------------------------
                            rho                            rho               

BTW, you might wish to also consider using the more modern LinearAlgebra, VectorCalculus, and Matrix rather than linalg and array. It doesn't make things easier for your mixed symbolic+float dFxdU, but some aspects can be easier such as no need for evalm and no last_name_eval.

acer

An important difference is that you introduced floating-point values into dFxdU (eg, 0.5 rather than 1/2).

If I replace those three instances of 0.5 in the creation of dFxdU by the exact quanity 1/2 then I get these results,

> eigenvalues(dFxdU);
                      (1/2)                       (1/2)                  
    rho u + (rho g pt)         -rho u + (rho g pt)                       
    -----------------------, - ------------------------, u, u, u, u, u, u
              rho                        rho                             

If your matrix, with a mix of floats and multiple variables, has already been created then you can convert the floats to rationals like this,

> map(convert, dFxdU, rational);

ps. There are quite a few corners of Maple which have difficulty with the mix of multivariable expressions containing floating-point numbers. On the one hand, there are actually some poorly understood areas for such input. But there are also some tasks for which straightforward approaches can lead to decent answers (ie. for some such low order eigensystems, by computing the nullspace of the characteristic Matrix with lambda replaced by each explicit eigenvalue). There are parts of Maple where a practical approach is missing on the grounds that the general case is not possible or completely understood.

acer

It seems that your procedure p produces some nonnumeric results under evalhf (which is the numeric interpreter that plot uses by default).

> evalhf(p(0.02));
                              Float(undefined)

Try this, as a workaround,

plot(t -> evalf[Digits](p(t)), 0.0 .. 0.1);

acer

One way to look at it:
> rsolve(Q(k,x)=Q(k-1,x)+1,Q(n,x));
                                  Q(0, x) + n
 
> eval(%, Q(0,x)=x);
                                     x + n

acer

This one can also be done using int, without changing variables. (A matter of taste, whether figuring out the intersections is easier or not, for this example.)

> int(piecewise(x<1,2*x,2/x)-piecewise(x<1,1/x,x),x=1/sqrt(2)..sqrt(2));
                                   1      
                                   - ln(2)
                                   2      

acer

1) The command with should not be used inside a proc or a module. The help-page for with says that. I quote:

- The with command is effective only at the top level, and
  intended primarily for interactive use. Because with operates
  by using lexical scoping, it does not work inside the bodies
  of procedures, module definitions, or within statements.
  See the examples at the end of this help topic.

2) You have saved the module Phys_Quant_ex_0 with the global binding for diffindice. Rebinding diffindice interactively by issuing with(Math_Tools_ex) at the top-level in a new session will not affect the name diffindice that was saved in the module. (That is an intended part of the design of modules, and lots of stuff depends on that desirable behaviour.)

Either look at the help-page for use, or utilize the syntax Math_Tools_ex:-diffindice inside the body of module Phys_Quant_ex_0.

acer

Eigenvectors returns both the eigenvalues and the eigenvectors. So your assignments to (and use of) vec[1] and vec[2] are misguided.
> with(LinearAlgebra):
> M := Matrix(2, 2, [[r, r^2], [r^2, 1/r]]):
> vals,vecs := Eigenvectors(M):

> simplify(M.vecs-vecs.DiagonalMatrix(vals));
                                   [0    0]
                                   [      ]
                                   [0    0]

> simplify(vals[1]*vecs[1..-1,1] - M.vecs[1..-1,1]);
                                      [0]
                                      [ ]
                                      [0]

acer

It wasn't clear to me whether you wanted 1000 decimal digits or 1000 dozenal digits.

> F:=proc(x,b::posint,N::posint)
> local y,p:
> if b>16 then error; end if;
> y:=subs([10=A,11=B,12=C,13=D,14=E,15=F],
>         ListTools:-Reverse(
>   convert(floor(evalf[floor(N*ln(b)/ln(10))](x*b^N)),base,b))):
> p:=nops(y)-N;
> cat(op(y[1..p]),".",op(y[p+1..N]));
> end proc:

> # simple test case
> ans := F(sqrt(31793),12,60);
     ans := 12A.38075AB57660B4819B0B955BAA84365B892465A102072B7A53109A398

> Digits:=floor(60*ln(12)/ln(10)):

> convert(ans,decimal,12);
       178.3059168956543629146978561044118852999755964655120186918299562

> evalf(sqrt(31793)); # should be same as above
       178.3059168956543629146978561044118852999755964655120186918299562

> Digits:=10: # want F to work independent of top-level Digits setting

> # now, the posted question

> F(sqrt(2),12,1000);
1.4B79170A07B85737704B085486853504563650B559B8B79A401387B342380A998A173A951\
    303434821B55419A068816958B64282342A358A8947369B97237B9B04B656A072334932\
    8A219013A8B21AB42844A5758BA27B3A14317B17B28A4354B796260136269A55A79598A\
    4619BA2352A310A3373251B0598676B4537681A191A6901560B13362953A3B373054251\
    593693051410425656527080871A620766432B006383A272876409AB560250154713653\
    46AA731A9248B86B009972A5059115A10537765A3727300B71615798551101BB025B5A1\
    19781083699746484A9A0A5807960910B945AB250B74A6594723624594035156BB3A6A9\
    6559A453899500B6BB8811032B2332A74BB8070401B50A8A15BA2096184636714AB8894\
    749356151A36BA8AA424B6511A6AA35635A55848B5B4A9953B96478B317223B62700B28\
    4559B59A0AA34B6724497A247B53B8256881993B18A90A575862342586554334ABAB283\
    AA091186977782BB99734B16373A27B60A882935333325A1167A98A42B053831634948A\
    444A7572A993929440A412296997B297AA1810B79145B39974988B968B6731343532269\
    14236833678A02694B9A563B1017B953268692960AB384B15488A8B26808164413967B0\
    11056BA0A08BBAB3022935A1B6A096AA9A044836568294400477129BAA8048102482911\
    2B5

> length(%); # including the period
                                     1001

acer

Your data file is all ones and zeroes, so I presume you want that interpreted as a data set, say as discrete measurements of a square wave.

If that's right, then you could read it into Matrix using ImportMatrix, convert it to a Vector, and then run DiscreteTransforms:-FourierTransform on that. How you then wish to plot the frequency information is unclear, as you haven't mentioned anything about the sampling rate or time.

You can compare such DFT results with the continuous equivalent by searching  in google for  Fourier transform of a square  wave. (Eg, here, or the graphs here.)

I wonder, would it be useful for Maple to have something like Matlab's fftshift function?

acer

Could you use tensor[create] instead?

tensor[entermetric] eventually calls readline(), which calls iolib(2,..). And iolib is't checking IsWorksheetInterface() to acertain which interface is being used. So I don't see any way to trick it into behaving like it does in the commandline interface.

acer

Ok, so you can stuff all that data into a float[8] rtable (eg. Array), and plot that directly. See quickplot from R.Israel's Maple Advisor Database for a nice user-friendly routine for doing that. Here's an example of the kind of thing it does under the hood to make it more efficient for large numbers of points,

PLOT(POINTS(Array(1..3,1..2,
                  [[-0.5,1],[0.25,0],[0.5,-0.5]],
                  datatype=float[8])));

But a plot of a million points will likely still render too slowly and use a lot of memory. So instead of making a plot perhaps you should be thinking about making an image file directly, using the ImageTools package. In particular, ImageTools:-Create might help.

ps. There may also be an issue with your code. If you post it or upload it here, someone might be able to offer useful suggestions.

acer

Just use fclose on the file.

acer

> M:=ImportMatrix("foo.txt",source=Matlab):

> for i from 1 to 3 do
>   p[i],n[i] := M[i][1..3]^%T, M[i][4..-1]^%T;
> od:

> p[1],n[1],p[2],n[2],p[3],n[3];
                        [1]  [4]  [2]  [ 8]  [3]  [12]
                        [ ]  [ ]  [ ]  [  ]  [ ]  [  ]
                        [2], [5], [4], [10], [6], [15]
                        [ ]  [ ]  [ ]  [  ]  [ ]  [  ]
                        [3]  [6]  [6]  [12]  [9]  [18]

acer

> L1/2+L2;
                                                              -1
              [1, -1/2, 1/3, -1/4, 1/5, -1/6, 1/7, -1/8, 1/9, --]
                                                              10

> L1/2+L2/2;
                              -3                    -3        -3
             [3/4, -3/8, 1/4, --, 3/20, -1/8, 3/28, --, 1/12, --]
                              16                    32        40

...and so on.

If that's not what you want, then I cannot see what your goal is. What do you want to add together, to get the first element of the final result? Is it L1[1]/2 |+ L2[1]/2, or some mix of indices used for each list, or...?

acer

> subs((x-y)^(-1/2)=1/g,f2);
                                    a/g + b

acer

First 301 302 303 304 305 306 307 Last Page 303 of 339