acer

32348 Reputation

29 Badges

19 years, 330 days
Ontario, Canada

Social Networks and Content at Maplesoft.com

MaplePrimes Activity


These are replies submitted by acer

@nm I think that your question was quite unclear about that point.

I think that it's still unclear exactly what your trying to accomplish. Why use a text editing program to write an explicit string in  a Maple procedure which itself simply writes out that string elsewhere. Why not use the text editor to write the output file directly? In that scenario you could import that string as a string and not get hit by the backslash terminator issue at all (ie. without having to work around it or use an explicit escape token or an extra blank space etc). You could import it, optionally alter it, and then export is once again without ever having to be bothered by writing explicit escape sequences or extra blank spaces after trailing backslash instances.

Btw, your posted Maple source has a syntax error, missing a statement terminator/separator (color or semicolon) after the local declaration. After fixing that then it seemed to me that the only issue was in the backslash as line continuation character for Maple code. But I could get the final process_file procedure to work regardless of whether I used read or readbytes, after handling the terminating backslash.

I still think it's very odd that you're apparently not very upset by having to deal with escaping backslashes but inconsistently much more concerned with anything extra related to newlines. But I can think of several other ways to get the newline following a terminating backslash without having to introduce an extra blank space. They don't all need \n after each line -- I just put those in for clarity because your restrictions weren't clear to me.

@vv For fun,

restart;

plot3d(evalc(Re(sqrt(1/(x+I*'convert(y,rational)'))*erf(sqrt(x+I*y)))),
       x = -2 .. 2, y = -2 .. 2,
       orientation=[-110,80,0]);

f:=z->sqrt(1/z)*erf(sqrt(z)):
f(0):=1:
A:=Matrix(40,40, (i,j)-> evalf(Re(f((i-20)/10 + I*(j-20)/10)))):
plots:-surfdata(A, view=-3..3, orientation=[-110,80,0]);

...compared with

B:=Matrix(40,40, (i,j)-> evalhf(Re(f((i-20)/10 + I*(j-20)/10)))):
plots:-surfdata(B, view=-3..3, orientation=[-110,80,0]);

evalf(Re(f((0-20)/10 + I*(20-20)/10)));
                          -2.668000514

evalf(Re(f((0.0-20.0)/10.0 + I*(20.0-20.0)/10.0)));
                          2.668000512

sqrt(1/(-2.0+0.0*I)), sqrt(1/(-2.0));
              0. - 0.7071067812 I, 0.7071067812 I

sqrt(-0.5-0.0*I), sqrt(-0.5);
              0. - 0.7071067812 I, 0.7071067812 I

@Elisha You misspelled stepsize as stepsise.

 

Please don't post duplicates of the problem, as you try and figure out correct syntax and problem formulation.

@animeplot I could spend some time on the weekend writing Maplet code to do all of that, so try and see what might be happening. But it'd save time and effort (and possibly red-herrings if my code did something importantly different) if you could just let me look at your full source.

If you'd rather not post it all here (in a single worksheet of zipped file) as an uploaded attachment on a Comment/Reply then please feel free to send me a private message via Mapleprimes. I'd respond via emai, and then you'd have an email address to send it to. I understand, if you are not free to do this, though.

@Rouben Rostamian  That is a very good answer (as is Kitonum's).

I have submitted a bug report, suggesting that the Help pages for commands like plottools:-disk contain such useful and directly accessible Examples. (That is to say, the details in the style option's description on the ?plot,options page are too far removed from the ?plottools,disk Help page.) And the same goes for several other plottools commands' individual Help pages.

[edited above]

@Christopher2222 That is because `sum` can act like `add` , in the sense of adding up a small finite number of terms. IIRC it is a cutoff of something like 1000 terms. So for that small range it acts like one of the earlier responses. Above that cutoff it tries for actual symbolic summation, striving for a closed form formula.

@Kitonum Ahh. Thanks. I ought to have tried at least this:
 

Q:=Sum(cos(2*Pi*k/(b-a+1)), k=a..b):
value(eval(Q,a=0));
                       0

@Kitonum 

restart;
Q:=combine(sum(cos(2*Pi*k/(b-a+1)), k=a..b)):

simplify(expand(simplify(convert(eval(Q,[a=0]),exp)))) assuming nonnegint; # job done
                             0

eval(numer(Q)/denom(Q), [a=0, b=214748363]); # for fun
                             0

@Preben Alsholm Professor Ogilvie's comments relate to the Classic GUI, I believe.

In the Classic GUI the double-underscore syntax for a name such as xxx__yyy does not produce pretty-printed output with a subscripted name. Moreover in the Classic GUI the mechanism for pretty-printing input does render indexed names as subscripted names, but it does not render such double-underscore syntax names as subscripted names.

 

It's a pity that it needs a followup call to simplify ( or combine, or convert(...,exp) ) to resolve the result to zero, especially when it can do these:

sum(sin(k), k=-a..a) assuming a::integer;

                    0

sum(sin(k), k=-a..a) assuming a::real;

                    0

@Rouben Rostamian  I could also note that the numeric values are attained when accessing the converted list.

And the behavior allows both the Vector and the list entries to be updated when the assigned values for a and b change. That aspect of consistency might be considered desirable.

restart;

V:=Vector([a,b]);

_rtable[18446884068502819054]

a,b := 2,3;

2, 3

L:=convert(V,list);

[a, b]

V[1], L[1];
V[2], L[2];

2, 2

3, 3

L;

[2, 3]

V;

_rtable[18446884068502819054]

lprint(V);

Vector[column](2, {1 = a, 2 = b}, datatype = anything, storage = rectangular, order = Fortran_order, shape = [])

lprint(eval(L,1)):

[a, b]

a,b := 7,8;

7, 8

V;

_rtable[18446884068502819054]

L;

[7, 8]

 

Download Vector_list.mw

@tomleslie 

Sure, that seems a fine way to compute r(n) quickly even for large n. Great point!

But the original question was about why n*exp(1)*GAMMA(n,1) didn't immediately produce an integer, so my Answer was intended as an explanation (and workaround) for using that closed-form result.

The crossover value of n for timing of my method and yours seems to be about n=2500 or so (on my 64bit Linux, Maple 2017.3). But your method is always quick, and certainly straightforward, while mine appears to require less increase in memory allocation.

restart;

r := rsolve({u(n)=n*(u(n-1)+1), u(0)=0}, u, 'makeproc'):

CodeTools:-Usage(r(1000)):

memory used=1.60MiB, alloc change=64.00MiB, cpu time=32.00ms, real time=31.00ms, gc time=12.00ms

restart;

r := rsolve({u(n)=n*(u(n-1)+1), u(0)=0}, u):

S:=unapply('simplify'(convert(simplify(value(r)),hypergeom)),n):

CodeTools:-Usage(S(1000)):

memory used=4.16MiB, alloc change=0 bytes, cpu time=8.00ms, real time=10.00ms, gc time=0ns

restart;

r := rsolve({u(n)=n*(u(n-1)+1), u(0)=0}, u, 'makeproc'):

CodeTools:-Usage(r(2500)):

memory used=10.70MiB, alloc change=64.00MiB, cpu time=36.00ms, real time=37.00ms, gc time=16.00ms

restart;

r := rsolve({u(n)=n*(u(n-1)+1), u(0)=0}, u):

S:=unapply('simplify'(convert(simplify(value(r)),hypergeom)),n):

CodeTools:-Usage(S(2500)):

memory used=28.68MiB, alloc change=3.41MiB, cpu time=36.00ms, real time=34.00ms, gc time=0ns

restart;

r := rsolve({u(n)=n*(u(n-1)+1), u(0)=0}, u, 'makeproc'):

CodeTools:-Usage(r(7000)):

memory used=94.35MiB, alloc change=123.49MiB, cpu time=163.00ms, real time=155.00ms, gc time=68.00ms

restart;

r := rsolve({u(n)=n*(u(n-1)+1), u(0)=0}, u):

S:=unapply('simplify'(convert(simplify(value(r)),hypergeom)),n):

CodeTools:-Usage(S(7000)):

memory used=251.22MiB, alloc change=27.50MiB, cpu time=384.00ms, real time=350.00ms, gc time=164.00ms

 


Download crossover.mw

Since Kitonum kindly pointed out that GAMMA(n,1) doesn't produce an "expanded" result like integer*exp(-1) for n>50, here is a revised version which does.

For large n>100 it is faster than evaluating the sum only after substituting the integer value of `n`. For very large n it is much faster.

restart;

r := rsolve({u(n)=n*(u(n-1)+1), u(0)=0}, u):

S:=unapply('simplify'(convert(simplify(value(r)),hypergeom)),n);

proc (n) options operator, arrow; simplify(n*exp(1)*(GAMMA(n)-hypergeom([n], [n+1], -1)/n)) end proc

seq(S(i), i=57..60);

110163588853530184980727482893521304479399855114493057608241578732074256106649, 6389488153504750728882194007824235659805191596640597341278011566460306854185700, 376979801056780293004049446461629903928506304201795243135402682421158104396956359, 22618788063406817580242966787697794235710378252107714588124160945269486263817381600

CodeTools:-Usage(S(7000)):

memory used=251.17MiB, alloc change=27.49MiB, cpu time=428.00ms, real time=357.00ms, gc time=200.00ms

restart;

r := rsolve({u(n)=n*(u(n-1)+1), u(0)=0}, u):

SS:=s->simplify(value(eval(r, n=s))):

seq(SS(i), i=57..60);

110163588853530184980727482893521304479399855114493057608241578732074256106649, 6389488153504750728882194007824235659805191596640597341278011566460306854185700, 376979801056780293004049446461629903928506304201795243135402682421158104396956359, 22618788063406817580242966787697794235710378252107714588124160945269486263817381600

CodeTools:-Usage(SS(7000)):
 

memory used=1.34GiB, alloc change=342.50MiB, cpu time=12.30s, real time=11.38s, gc time=2.14s

 

Download exp_combine_2.mw

Another faster way to get the final results as explicit integers, for n>50, is,

S:=unapply('combine'('convert'(simplify(value(r)),elementary),exp),n);

@Jjjones98 My code assumes (at least) that there is one local minimum per revolution, and that a full revolution involves rotating by two Pi radians, no? Do your parameter values change that!?

If in doubt then please just attach what you've got so far in an uploaded worksheet (bug green arrow). Hammering out such details would likely be easy to do. How long you'd need to wait would just depend on people's schedules (e.g. I'm away from a computer today)

First 262 263 264 265 266 267 268 Last Page 264 of 592