acer

32343 Reputation

29 Badges

19 years, 327 days
Ontario, Canada

Social Networks and Content at Maplesoft.com

MaplePrimes Activity


These are answers submitted by acer

The result from diff already had the completed square inside the radicals.

with(Typesetting)

Settings(typesetdot = true)

NULL

eq := l = sqrt((d-x(t))^2+h^2)+y(t)

l = ((d-x(t))^2+h^2)^(1/2)+y(t)

a := solve(eq, y(t))

-((d-x(t))^2+h^2)^(1/2)+l

a1 := diff(a, t)

(d-x(t))*(diff(x(t), t))/((d-x(t))^2+h^2)^(1/2)

a2 := diff(a1, t)

(d-x(t))^2*(diff(x(t), t))^2/((d-x(t))^2+h^2)^(3/2)-(diff(x(t), t))^2/((d-x(t))^2+h^2)^(1/2)+(d-x(t))*(diff(diff(x(t), t), t))/((d-x(t))^2+h^2)^(1/2)

collect(a2, diff, proc (u) options operator, arrow; simplify(u, size) end proc)

(d-x(t))*(diff(diff(x(t), t), t))/((d-x(t))^2+h^2)^(1/2)-(diff(x(t), t))^2*h^2/((d-x(t))^2+h^2)^(3/2)

``

Download collect_denominator_ac.mw

Perhaps your would like to use the plots:-logplot command, or the axis options of the plot command.

I prefer kernel builtins over custom-procs, where reasonable.

remove(`=`, EQI__4, 0=0);

And I dislike using has (or hastype) for a targeted job. By this I mean that the stated goal was to remove entries that are 0=0 and not more generally all instances that might occur in subexpressions (even though the supplied example had none such).

Conversion to a set will, in general, remove duplicates as well as possibly reorder the entries. If that's ok (ie. neither of those happens for the given example) then one short syntax is,

[op({EQI__4[]} minus {0=0})]

It is important to note that there will not be a set of steps which will get "whatever form you expect" for all examples.

restart;

 

S:=e->(ee->convert(expand(numer(ee)),sqrfree)
           /convert(expand(denom(ee)),sqrfree))(simplify(expand(rationalize(e)))):

 

expr := (L__b+lambda)^2*(I*sqrt(3)*lambda-2*L__b+lambda)^7
        *(I*sqrt(3)*lambda+2*L__b-lambda)^7
        /(16384*(L__b^2-lambda*L__b+lambda^2)^5*lambda^3);

(1/16384)*(L__b+lambda)^2*(I*3^(1/2)*lambda-2*L__b+lambda)^7*(I*3^(1/2)*lambda+2*L__b-lambda)^7/((L__b^2-L__b*lambda+lambda^2)^5*lambda^3)

 

S(expr);

-(L__b^3+lambda^3)^2/lambda^3

simplify(% - expr);

0

expr2 := -320*L__a/(3*(L__a-lambda)^3*(I*sqrt(3)*lambda+2*L__a+lambda)^3
                    *(I*sqrt(3)*lambda-2*L__a-lambda)^3);

-(320/3)*L__a/((L__a-lambda)^3*(I*3^(1/2)*lambda+2*L__a+lambda)^3*(I*3^(1/2)*lambda-2*L__a-lambda)^3)

S(expr2);

(5/3)*L__a/(L__a^3-lambda^3)^3

simplify(% - expr2);

0

 

Download simpl_example.mw

I could mention that the following produces the same results for these two examples. Of course, messing about with it affects what examples it handles.
R:=e->convert(expand(numer(e))/expand(denom(e)),sqrfree):
R(expr);
R(expr2);

You can use the plotsetup command to send the plotting results to a file.

You can generate the frames of each animation separately (if you aren't already). But rather than displaying them together, use plots:-display on them individually. Before each call to plots:-display, call plotsetup and make the filename (plotputput option) be a contenation of a base string and some counter (using the cat command). The counter could be your loop index, or the frame number.

If you uploaded a worksheet that demonstrated even one of your current animations then it would be possible to show you explicitly.

Your original eq contained t as the integration variable. Are any of the instances of t in your original eq procedure supposed to be the independent variable of the differential equation, or are they all just the integration variable? I am supposing the latter, in which case you might as easily have just used a parameter Z representing eq(z). (Fortunately evalf/int has a remember table.)

Your eq produces nonreal results. I don't know how you want to deal with that. I also don't understand your expected range for the independent variable of the differential equation, or what values of the parameter z you think are going to be useful.

I don't find your example, or your intention, clear.

NULL

restart

eq := proc (z) local t; if not z::numeric then return ('procname')(args) end if; evalf(Int(-(2*I)*exp((-1)*.5*I*tt)/(sqrt(tt^2+1)*exp(sqrt(tt^2+1))), tt = -500 .. z)) end proc:

eq(800);

-0.4537130000e-15-1.426170267*I

-0.1651706077e-3-1.426751148*I

-0.8514273052e-90-0.1226843217e-88*I

plot(([Re, Im])(eq(z)), z = -5 .. 5, adaptive = false, numpoints = 50, thickness = 3, size = [500, 200], gridlines = false);

a := 2*t^2+5*t:

s := t^2+t+1:

d := t^2+t-9:

sys := {diff(x(t), t) = Re(eq(z))*y(t)+a*x(t), diff(y(t), t) = s*x(t)+d*y(t)}

{diff(x(t), t) = Re(eq(z))*y(t)+(2*t^2+5*t)*x(t), diff(y(t), t) = (t^2+t+1)*x(t)+(t^2+t-9)*y(t)}

IC_1 := {x(-1) = 0, y(-1) = 1}

{x(-1) = 0, y(-1) = 1}

dsol3 := dsolve(`union`(sys, IC_1), numeric, parameters = [z], method = rkf45, range = -500 .. 500, output = procedurelist)

proc (x_rkf45) local _res, _dat, _vars, _solnproc, _xout, _ndsol, _pars, _n, _i; option `Copyright (c) 2000 by Waterloo Maple Inc. All rights reserved.`; if 1 < nargs then error "invalid input: too many arguments" end if; _EnvDSNumericSaveDigits := Digits; Digits := 15; if _EnvInFsolve = true then _xout := evalf[_EnvDSNumericSaveDigits](x_rkf45) else _xout := evalf(x_rkf45) end if; _dat := Array(1..4, {(1) = proc (_xin) local _xout, _dtbl, _dat, _vmap, _x0, _y0, _val, _dig, _n, _ne, _nd, _nv, _pars, _ini, _par, _i, _j, _k, _src; option `Copyright (c) 2002 by Waterloo Maple Inc. All rights reserved.`; table( [( "complex" ) = false ] ) _xout := _xin; _pars := [z = z]; _dtbl := array( 1 .. 4, [( 1 ) = (array( 1 .. 20, [( 1 ) = (datatype = float[8], order = C_order, storage = rectangular), ( 2 ) = (datatype = float[8], order = C_order, storage = rectangular), ( 3 ) = ([0, 0, 0, Array(1..0, 1..2, {}, datatype = float[8], order = C_order)]), ( 4 ) = (Array(1..53, {(1) = 2, (2) = 2, (3) = 0, (4) = 0, (5) = 1, (6) = 0, (7) = 0, (8) = 0, (9) = 0, (10) = 1, (11) = 0, (12) = 0, (13) = 0, (14) = 0, (15) = 0, (16) = 0, (17) = 0, (18) = 0, (19) = 30000, (20) = 0, (21) = 0, (22) = 1, (23) = 4, (24) = 0, (25) = 1, (26) = 15, (27) = 1, (28) = 0, (29) = 1, (30) = 3, (31) = 3, (32) = 0, (33) = 1, (34) = 0, (35) = 0, (36) = 0, (37) = 0, (38) = 0, (39) = 0, (40) = 0, (41) = 0, (42) = 0, (43) = 1, (44) = 0, (45) = 0, (46) = 0, (47) = 0, (48) = 0, (49) = 0, (50) = 50, (51) = 1, (52) = 0, (53) = 0}, datatype = integer[8])), ( 5 ) = (Array(1..28, {(1) = -1.0, (2) = 0.10e-5, (3) = .0, (4) = 0.500001e-14, (5) = -1.0, (6) = .0, (7) = .0, (8) = 0.10e-5, (9) = .0, (10) = .0, (11) = .0, (12) = .0, (13) = 1.0, (14) = .0, (15) = .49999999999999, (16) = .0, (17) = 1.0, (18) = 1.0, (19) = .0, (20) = .0, (21) = 1.0, (22) = 1.0, (23) = .0, (24) = .0, (25) = 0.10e-14, (26) = .0, (27) = .0, (28) = .0}, datatype = float[8], order = C_order)), ( 6 ) = (Array(1..3, {(1) = 0., (2) = 1., (3) = Float(undefined)})), ( 7 ) = ([Array(1..4, 1..7, {(1, 1) = .0, (1, 2) = .203125, (1, 3) = .3046875, (1, 4) = .75, (1, 5) = .8125, (1, 6) = .40625, (1, 7) = .8125, (2, 1) = 0.6378173828125e-1, (2, 2) = .0, (2, 3) = .279296875, (2, 4) = .27237892150878906, (2, 5) = -0.9686851501464844e-1, (2, 6) = 0.1956939697265625e-1, (2, 7) = .5381584167480469, (3, 1) = 0.31890869140625e-1, (3, 2) = .0, (3, 3) = -.34375, (3, 4) = -.335235595703125, (3, 5) = .2296142578125, (3, 6) = .41748046875, (3, 7) = 11.480712890625, (4, 1) = 0.9710520505905151e-1, (4, 2) = .0, (4, 3) = .40350341796875, (4, 4) = 0.20297467708587646e-1, (4, 5) = -0.6054282188415527e-2, (4, 6) = -0.4770040512084961e-1, (4, 7) = .77858567237854}, datatype = float[8], order = C_order), Array(1..6, 1..6, {(1, 1) = .0, (1, 2) = .0, (1, 3) = .0, (1, 4) = .0, (1, 5) = .0, (1, 6) = 1.0, (2, 1) = .25, (2, 2) = .0, (2, 3) = .0, (2, 4) = .0, (2, 5) = .0, (2, 6) = 1.0, (3, 1) = .1875, (3, 2) = .5625, (3, 3) = .0, (3, 4) = .0, (3, 5) = .0, (3, 6) = 2.0, (4, 1) = .23583984375, (4, 2) = -.87890625, (4, 3) = .890625, (4, 4) = .0, (4, 5) = .0, (4, 6) = .2681884765625, (5, 1) = .1272735595703125, (5, 2) = -.5009765625, (5, 3) = .44921875, (5, 4) = -0.128936767578125e-1, (5, 5) = .0, (5, 6) = 0.626220703125e-1, (6, 1) = -0.927734375e-1, (6, 2) = .626220703125, (6, 3) = -.4326171875, (6, 4) = .1418304443359375, (6, 5) = -0.861053466796875e-1, (6, 6) = .3131103515625}, datatype = float[8], order = C_order), Array(1..6, {(1) = .0, (2) = .386, (3) = .21, (4) = .63, (5) = 1.0, (6) = 1.0}, datatype = float[8], order = C_order), Array(1..6, {(1) = .25, (2) = -.1043, (3) = .1035, (4) = -0.362e-1, (5) = .0, (6) = .0}, datatype = float[8], order = C_order), Array(1..6, 1..5, {(1, 1) = .0, (1, 2) = .0, (1, 3) = .0, (1, 4) = .0, (1, 5) = .0, (2, 1) = 1.544, (2, 2) = .0, (2, 3) = .0, (2, 4) = .0, (2, 5) = .0, (3, 1) = .9466785280815533, (3, 2) = .25570116989825814, (3, 3) = .0, (3, 4) = .0, (3, 5) = .0, (4, 1) = 3.3148251870684886, (4, 2) = 2.896124015972123, (4, 3) = .9986419139977808, (4, 4) = .0, (4, 5) = .0, (5, 1) = 1.2212245092262748, (5, 2) = 6.019134481287752, (5, 3) = 12.537083329320874, (5, 4) = -.687886036105895, (5, 5) = .0, (6, 1) = 1.2212245092262748, (6, 2) = 6.019134481287752, (6, 3) = 12.537083329320874, (6, 4) = -.687886036105895, (6, 5) = 1.0}, datatype = float[8], order = C_order), Array(1..6, 1..5, {(1, 1) = .0, (1, 2) = .0, (1, 3) = .0, (1, 4) = .0, (1, 5) = .0, (2, 1) = -5.6688, (2, 2) = .0, (2, 3) = .0, (2, 4) = .0, (2, 5) = .0, (3, 1) = -2.4300933568337584, (3, 2) = -.20635991570891224, (3, 3) = .0, (3, 4) = .0, (3, 5) = .0, (4, 1) = -.10735290581452621, (4, 2) = -9.594562251021896, (4, 3) = -20.470286148096154, (4, 4) = .0, (4, 5) = .0, (5, 1) = 7.496443313968615, (5, 2) = -10.246804314641219, (5, 3) = -33.99990352819906, (5, 4) = 11.708908932061595, (5, 5) = .0, (6, 1) = 8.083246795922411, (6, 2) = -7.981132988062785, (6, 3) = -31.52159432874373, (6, 4) = 16.319305431231363, (6, 5) = -6.0588182388340535}, datatype = float[8], order = C_order), Array(1..3, 1..5, {(1, 1) = .0, (1, 2) = .0, (1, 3) = .0, (1, 4) = .0, (1, 5) = .0, (2, 1) = 10.126235083446911, (2, 2) = -7.487995877607633, (2, 3) = -34.800918615557414, (2, 4) = -7.9927717075687275, (2, 5) = 1.0251377232956207, (3, 1) = -.6762803392806898, (3, 2) = 6.087714651678606, (3, 3) = 16.43084320892463, (3, 4) = 24.767225114183653, (3, 5) = -6.5943891257167815}, datatype = float[8], order = C_order)]), ( 9 ) = ([Array(1..2, {(1) = .1, (2) = .1}, datatype = float[8], order = C_order), Array(1..2, {(1) = .0, (2) = .0}, datatype = float[8], order = C_order), Array(1..2, {(1) = .0, (2) = .0}, datatype = float[8], order = C_order), Array(1..2, {(1) = .0, (2) = .0}, datatype = float[8], order = C_order), Array(1..2, {(1) = .0, (2) = .0}, datatype = float[8], order = C_order), Array(1..2, 1..2, {(1, 1) = .0, (1, 2) = .0, (2, 1) = .0, (2, 2) = .0}, datatype = float[8], order = C_order), Array(1..2, 1..2, {(1, 1) = .0, (1, 2) = .0, (2, 1) = .0, (2, 2) = .0}, datatype = float[8], order = C_order), Array(1..2, 1..6, {(1, 1) = .0, (1, 2) = .0, (1, 3) = .0, (1, 4) = .0, (1, 5) = .0, (1, 6) = .0, (2, 1) = .0, (2, 2) = .0, (2, 3) = .0, (2, 4) = .0, (2, 5) = .0, (2, 6) = .0}, datatype = float[8], order = C_order), Array(1..2, {(1) = 0, (2) = 0}, datatype = integer[8]), Array(1..3, {(1) = .0, (2) = .0, (3) = .0}, datatype = float[8], order = C_order), Array(1..3, {(1) = .0, (2) = .0, (3) = .0}, datatype = float[8], order = C_order), Array(1..3, {(1) = .0, (2) = .0, (3) = .0}, datatype = float[8], order = C_order), Array(1..3, {(1) = .0, (2) = .0, (3) = .0}, datatype = float[8], order = C_order), Array(1..2, {(1) = .0, (2) = .0}, datatype = float[8], order = C_order)]), ( 8 ) = ([Array(1..3, {(1) = .0, (2) = .0, (3) = .0}, datatype = float[8], order = C_order), Array(1..3, {(1) = .0, (2) = .0, (3) = .0}, datatype = float[8], order = C_order), Array(1..2, {(1) = .0, (2) = .0}, datatype = float[8], order = C_order)]), ( 11 ) = (Array(1..6, 0..2, {(1, 1) = .0, (1, 2) = .0, (2, 0) = .0, (2, 1) = .0, (2, 2) = .0, (3, 0) = .0, (3, 1) = .0, (3, 2) = .0, (4, 0) = .0, (4, 1) = .0, (4, 2) = .0, (5, 0) = .0, (5, 1) = .0, (5, 2) = .0, (6, 0) = .0, (6, 1) = .0, (6, 2) = .0}, datatype = float[8], order = C_order)), ( 10 ) = ([proc (N, X, Y, YP) option `[Y[1] = x(t), Y[2] = y(t)]`; YP[1] := Re(eq(Y[3]))*Y[2]+(2*X^2+5*X)*Y[1]; YP[2] := (X^2+X+1)*Y[1]+(X^2+X-9)*Y[2]; 0 end proc, -1, 0, 0, 0, 0, 0, 0]), ( 13 ) = (), ( 12 ) = (), ( 15 ) = ("rkf45"), ( 14 ) = ([0, 0]), ( 18 ) = ([]), ( 19 ) = (0), ( 16 ) = ([0, 0, 0, []]), ( 17 ) = ([proc (N, X, Y, YP) option `[Y[1] = x(t), Y[2] = y(t)]`; YP[1] := Re(eq(Y[3]))*Y[2]+(2*X^2+5*X)*Y[1]; YP[2] := (X^2+X+1)*Y[1]+(X^2+X-9)*Y[2]; 0 end proc, -1, 0, 0, 0, 0, 0, 0]), ( 20 ) = ([])  ] ))  ] ); _y0 := Array(0..3, {(1) = -1., (2) = 0., (3) = 1.}); _vmap := array( 1 .. 2, [( 1 ) = (1), ( 2 ) = (2)  ] ); _x0 := _dtbl[1][5][5]; _n := _dtbl[1][4][1]; _ne := _dtbl[1][4][3]; _nd := _dtbl[1][4][4]; _nv := _dtbl[1][4][16]; if not type(_xout, 'numeric') then if member(_xout, ["start", "left", "right"]) then if _Env_smart_dsolve_numeric = true or _dtbl[1][4][10] = 1 then if _xout = "left" then if type(_dtbl[2], 'table') then return _dtbl[2][5][1] end if elif _xout = "right" then if type(_dtbl[3], 'table') then return _dtbl[3][5][1] end if end if end if; return _dtbl[1][5][5] elif _xout = "method" then return _dtbl[1][15] elif _xout = "storage" then return evalb(_dtbl[1][4][10] = 1) elif _xout = "leftdata" then if not type(_dtbl[2], 'array') then return NULL else return eval(_dtbl[2]) end if elif _xout = "rightdata" then if not type(_dtbl[3], 'array') then return NULL else return eval(_dtbl[3]) end if elif _xout = "enginedata" then return eval(_dtbl[1]) elif _xout = "enginereset" then _dtbl[2] := evaln(_dtbl[2]); _dtbl[3] := evaln(_dtbl[3]); return NULL elif _xout = "initial" then return procname(_y0[0]) elif _xout = "laxtol" then return _dtbl[`if`(member(_dtbl[4], {2, 3}), _dtbl[4], 1)][5][18] elif _xout = "numfun" then return `if`(member(_dtbl[4], {2, 3}), _dtbl[_dtbl[4]][4][18], 0) elif _xout = "parameters" then return [seq(_y0[_n+_i], _i = 1 .. nops(_pars))] elif _xout = "initial_and_parameters" then return procname(_y0[0]), [seq(_y0[_n+_i], _i = 1 .. nops(_pars))] elif _xout = "last" then if _dtbl[4] <> 2 and _dtbl[4] <> 3 or _x0-_dtbl[_dtbl[4]][5][1] = 0. then error "no information is available on last computed point" else _xout := _dtbl[_dtbl[4]][5][1] end if elif _xout = "function" then if _dtbl[1][4][33]-2. = 0 then return eval(_dtbl[1][10], 1) else return eval(_dtbl[1][10][1], 1) end if elif _xout = "map" then return copy(_vmap) elif type(_xin, `=`) and type(rhs(_xin), 'list') and member(lhs(_xin), {"initial", "parameters", "initial_and_parameters"}) then _ini, _par := [], []; if lhs(_xin) = "initial" then _ini := rhs(_xin) elif lhs(_xin) = "parameters" then _par := rhs(_xin) elif select(type, rhs(_xin), `=`) <> [] then _par, _ini := selectremove(type, rhs(_xin), `=`) elif nops(rhs(_xin)) < nops(_pars)+1 then error "insufficient data for specification of initial and parameters" else _par := rhs(_xin)[-nops(_pars) .. -1]; _ini := rhs(_xin)[1 .. -nops(_pars)-1] end if; _xout := lhs(_xout); if _par <> [] then `dsolve/numeric/process_parameters`(_n, _pars, _par, _y0) end if; if _ini <> [] then `dsolve/numeric/process_initial`(_n-_ne, _ini, _y0, _pars, _vmap) end if; `dsolve/numeric/SC/reinitialize`(_dtbl, _y0, _n, procname, _pars); if _Env_smart_dsolve_numeric = true and type(_y0[0], 'numeric') and _dtbl[1][4][10] <> 1 then procname("right") := _y0[0]; procname("left") := _y0[0] end if; if _xout = "initial" then return [_y0[0], seq(_y0[_vmap[_i]], _i = 1 .. _n-_ne)] elif _xout = "parameters" then return [seq(_y0[_n+_i], _i = 1 .. nops(_pars))] else return [_y0[0], seq(_y0[_vmap[_i]], _i = 1 .. _n-_ne)], [seq(_y0[_n+_i], _i = 1 .. nops(_pars))] end if elif _xin = "eventstop" then if _nv = 0 then error "this solution has no events" end if; _i := _dtbl[4]; if _i <> 2 and _i <> 3 then return 0 end if; if _dtbl[_i][4][10] = 1 and assigned(_dtbl[5-_i]) and _dtbl[_i][4][9] < 10 and 10 <= _dtbl[5-_i][4][9] then _i := 5-_i; _dtbl[4] := _i; _j := round(_dtbl[_i][4][17]); return round(_dtbl[_i][3][1][_j, 1]) elif 10 <= _dtbl[_i][4][9] then _j := round(_dtbl[_i][4][17]); return round(_dtbl[_i][3][1][_j, 1]) else return 0 end if elif _xin = "eventstatus" then if _nv = 0 then error "this solution has no events" end if; _i := [selectremove(proc (a) options operator, arrow; _dtbl[1][3][1][a, 7] = 1 end proc, {seq(_j, _j = 1 .. round(_dtbl[1][3][1][_nv+1, 1]))})]; return ':-enabled' = _i[1], ':-disabled' = _i[2] elif _xin = "eventclear" then if _nv = 0 then error "this solution has no events" end if; _i := _dtbl[4]; if _i <> 2 and _i <> 3 then error "no events to clear" end if; if _dtbl[_i][4][10] = 1 and assigned(_dtbl[5-_i]) and _dtbl[_i][4][9] < 10 and 10 < _dtbl[5-_i][4][9] then _dtbl[4] := 5-_i; _i := 5-_i end if; if _dtbl[_i][4][9] < 10 then error "no events to clear" elif _nv < _dtbl[_i][4][9]-10 then error "event error condition cannot be cleared" else _j := _dtbl[_i][4][9]-10; if irem(round(_dtbl[_i][3][1][_j, 4]), 2) = 1 then error "retriggerable events cannot be cleared" end if; _j := round(_dtbl[_i][3][1][_j, 1]); for _k to _nv do if _dtbl[_i][3][1][_k, 1] = _j then if _dtbl[_i][3][1][_k, 2] = 3 then error "range events cannot be cleared" end if; _dtbl[_i][3][1][_k, 8] := _dtbl[_i][3][1][_nv+1, 8] end if end do; _dtbl[_i][4][17] := 0; _dtbl[_i][4][9] := 0; if _dtbl[1][4][10] = 1 then if _i = 2 then try procname(procname("left")) catch:  end try else try procname(procname("right")) catch:  end try end if end if end if; return  elif type(_xin, `=`) and member(lhs(_xin), {"eventdisable", "eventenable"}) then if _nv = 0 then error "this solution has no events" end if; if type(rhs(_xin), {('list')('posint'), ('set')('posint')}) then _i := {op(rhs(_xin))} elif type(rhs(_xin), 'posint') then _i := {rhs(_xin)} else error "event identifiers must be integers in the range 1..%1", round(_dtbl[1][3][1][_nv+1, 1]) end if; if select(proc (a) options operator, arrow; _nv < a end proc, _i) <> {} then error "event identifiers must be integers in the range 1..%1", round(_dtbl[1][3][1][_nv+1, 1]) end if; _k := {}; for _j to _nv do if member(round(_dtbl[1][3][1][_j, 1]), _i) then _k := `union`(_k, {_j}) end if end do; _i := _k; if lhs(_xin) = "eventdisable" then _dtbl[4] := 0; _j := [evalb(assigned(_dtbl[2]) and member(_dtbl[2][4][17], _i)), evalb(assigned(_dtbl[3]) and member(_dtbl[3][4][17], _i))]; for _k in _i do _dtbl[1][3][1][_k, 7] := 0; if assigned(_dtbl[2]) then _dtbl[2][3][1][_k, 7] := 0 end if; if assigned(_dtbl[3]) then _dtbl[3][3][1][_k, 7] := 0 end if end do; if _j[1] then for _k to _nv+1 do if _k <= _nv and not type(_dtbl[2][3][4][_k, 1], 'undefined') then userinfo(3, {'events', 'eventreset'}, `reinit #2, event code `, _k, ` to defined init `, _dtbl[2][3][4][_k, 1]); _dtbl[2][3][1][_k, 8] := _dtbl[2][3][4][_k, 1] elif _dtbl[2][3][1][_k, 2] = 0 and irem(iquo(round(_dtbl[2][3][1][_k, 4]), 32), 2) = 1 then userinfo(3, {'events', 'eventreset'}, `reinit #2, event code `, _k, ` to rate hysteresis init `, _dtbl[2][5][24]); _dtbl[2][3][1][_k, 8] := _dtbl[2][5][24] elif _dtbl[2][3][1][_k, 2] = 0 and irem(iquo(round(_dtbl[2][3][1][_k, 4]), 2), 2) = 0 then userinfo(3, {'events', 'eventreset'}, `reinit #2, event code `, _k, ` to initial init `, _x0); _dtbl[2][3][1][_k, 8] := _x0 else userinfo(3, {'events', 'eventreset'}, `reinit #2, event code `, _k, ` to fireinitial init `, _x0-1); _dtbl[2][3][1][_k, 8] := _x0-1 end if end do; _dtbl[2][4][17] := 0; _dtbl[2][4][9] := 0; if _dtbl[1][4][10] = 1 then procname(procname("left")) end if end if; if _j[2] then for _k to _nv+1 do if _k <= _nv and not type(_dtbl[3][3][4][_k, 2], 'undefined') then userinfo(3, {'events', 'eventreset'}, `reinit #3, event code `, _k, ` to defined init `, _dtbl[3][3][4][_k, 2]); _dtbl[3][3][1][_k, 8] := _dtbl[3][3][4][_k, 2] elif _dtbl[3][3][1][_k, 2] = 0 and irem(iquo(round(_dtbl[3][3][1][_k, 4]), 32), 2) = 1 then userinfo(3, {'events', 'eventreset'}, `reinit #3, event code `, _k, ` to rate hysteresis init `, _dtbl[3][5][24]); _dtbl[3][3][1][_k, 8] := _dtbl[3][5][24] elif _dtbl[3][3][1][_k, 2] = 0 and irem(iquo(round(_dtbl[3][3][1][_k, 4]), 2), 2) = 0 then userinfo(3, {'events', 'eventreset'}, `reinit #3, event code `, _k, ` to initial init `, _x0); _dtbl[3][3][1][_k, 8] := _x0 else userinfo(3, {'events', 'eventreset'}, `reinit #3, event code `, _k, ` to fireinitial init `, _x0+1); _dtbl[3][3][1][_k, 8] := _x0+1 end if end do; _dtbl[3][4][17] := 0; _dtbl[3][4][9] := 0; if _dtbl[1][4][10] = 1 then procname(procname("right")) end if end if else for _k in _i do _dtbl[1][3][1][_k, 7] := 1 end do; _dtbl[2] := evaln(_dtbl[2]); _dtbl[3] := evaln(_dtbl[3]); _dtbl[4] := 0; if _dtbl[1][4][10] = 1 then if _x0 <= procname("right") then try procname(procname("right")) catch:  end try end if; if procname("left") <= _x0 then try procname(procname("left")) catch:  end try end if end if end if; return  elif type(_xin, `=`) and lhs(_xin) = "eventfired" then if not type(rhs(_xin), 'list') then error "'eventfired' must be specified as a list" end if; if _nv = 0 then error "this solution has no events" end if; if _dtbl[4] <> 2 and _dtbl[4] <> 3 then error "'direction' must be set prior to calling/setting 'eventfired'" end if; _i := _dtbl[4]; _val := NULL; if not assigned(_EnvEventRetriggerWarned) then _EnvEventRetriggerWarned := false end if; for _k in rhs(_xin) do if type(_k, 'integer') then _src := _k elif type(_k, 'integer' = 'anything') and type(evalf(rhs(_k)), 'numeric') then _k := lhs(_k) = evalf[max(Digits, 18)](rhs(_k)); _src := lhs(_k) else error "'eventfired' entry is not valid: %1", _k end if; if _src < 1 or round(_dtbl[1][3][1][_nv+1, 1]) < _src then error "event identifiers must be integers in the range 1..%1", round(_dtbl[1][3][1][_nv+1, 1]) end if; _src := {seq(`if`(_dtbl[1][3][1][_j, 1]-_src = 0., _j, NULL), _j = 1 .. _nv)}; if nops(_src) <> 1 then error "'eventfired' can only be set/queried for root-finding events and time/interval events" end if; _src := _src[1]; if _dtbl[1][3][1][_src, 2] <> 0. and _dtbl[1][3][1][_src, 2]-2. <> 0. then error "'eventfired' can only be set/queried for root-finding events and time/interval events" elif irem(round(_dtbl[1][3][1][_src, 4]), 2) = 1 then if _EnvEventRetriggerWarned = false then WARNING(`'eventfired' has no effect on events that retrigger`) end if; _EnvEventRetriggerWarned := true end if; if _dtbl[_i][3][1][_src, 2] = 0 and irem(iquo(round(_dtbl[_i][3][1][_src, 4]), 32), 2) = 1 then _val := _val, undefined elif type(_dtbl[_i][3][4][_src, _i-1], 'undefined') or _i = 2 and _dtbl[2][3][1][_src, 8] < _dtbl[2][3][4][_src, 1] or _i = 3 and _dtbl[3][3][4][_src, 2] < _dtbl[3][3][1][_src, 8] then _val := _val, _dtbl[_i][3][1][_src, 8] else _val := _val, _dtbl[_i][3][4][_src, _i-1] end if; if type(_k, `=`) then if _dtbl[_i][3][1][_src, 2] = 0 and irem(iquo(round(_dtbl[_i][3][1][_src, 4]), 32), 2) = 1 then error "cannot set event code for a rate hysteresis event" end if; userinfo(3, {'events', 'eventreset'}, `manual set event code `, _src, ` to value `, rhs(_k)); _dtbl[_i][3][1][_src, 8] := rhs(_k); _dtbl[_i][3][4][_src, _i-1] := rhs(_k) end if end do; return [_val] elif type(_xin, `=`) and lhs(_xin) = "direction" then if not member(rhs(_xin), {-1, 1, ':-left', ':-right'}) then error "'direction' must be specified as either '1' or 'right' (positive) or '-1' or 'left' (negative)" end if; _src := `if`(_dtbl[4] = 2, -1, `if`(_dtbl[4] = 3, 1, undefined)); _i := `if`(member(rhs(_xin), {1, ':-right'}), 3, 2); _dtbl[4] := _i; _dtbl[_i] := `dsolve/numeric/SC/IVPdcopy`(_dtbl[1], `if`(assigned(_dtbl[_i]), _dtbl[_i], NULL)); if 0 < _nv then for _j to _nv+1 do if _j <= _nv and not type(_dtbl[_i][3][4][_j, _i-1], 'undefined') then userinfo(3, {'events', 'eventreset'}, `reinit #4, event code `, _j, ` to defined init `, _dtbl[_i][3][4][_j, _i-1]); _dtbl[_i][3][1][_j, 8] := _dtbl[_i][3][4][_j, _i-1] elif _dtbl[_i][3][1][_j, 2] = 0 and irem(iquo(round(_dtbl[_i][3][1][_j, 4]), 32), 2) = 1 then userinfo(3, {'events', 'eventreset'}, `reinit #4, event code `, _j, ` to rate hysteresis init `, _dtbl[_i][5][24]); _dtbl[_i][3][1][_j, 8] := _dtbl[_i][5][24] elif _dtbl[_i][3][1][_j, 2] = 0 and irem(iquo(round(_dtbl[_i][3][1][_j, 4]), 2), 2) = 0 then userinfo(3, {'events', 'eventreset'}, `reinit #4, event code `, _j, ` to initial init `, _x0); _dtbl[_i][3][1][_j, 8] := _x0 else userinfo(3, {'events', 'eventreset'}, `reinit #4, event code `, _j, ` to fireinitial init `, _x0-2*_i+5.0); _dtbl[_i][3][1][_j, 8] := _x0-2*_i+5.0 end if end do end if; return _src elif _xin = "eventcount" then if _dtbl[1][3][1] = 0 or _dtbl[4] <> 2 and _dtbl[4] <> 3 then return 0 else return round(_dtbl[_dtbl[4]][3][1][_nv+1, 12]) end if else return "procname" end if end if; if _xout = _x0 then return [_x0, seq(evalf(_dtbl[1][6][_vmap[_i]]), _i = 1 .. _n-_ne)] end if; _i := `if`(_x0 <= _xout, 3, 2); if _xin = "last" and 0 < _dtbl[_i][4][9] and _dtbl[_i][4][9] < 10 then _dat := eval(_dtbl[_i], 2); _j := _dat[4][20]; return [_dat[11][_j, 0], seq(_dat[11][_j, _vmap[_i]], _i = 1 .. _n-_ne-_nd), seq(_dat[8][1][_vmap[_i]], _i = _n-_ne-_nd+1 .. _n-_ne)] end if; if not type(_dtbl[_i], 'array') then _dtbl[_i] := `dsolve/numeric/SC/IVPdcopy`(_dtbl[1], `if`(assigned(_dtbl[_i]), _dtbl[_i], NULL)); if 0 < _nv then for _j to _nv+1 do if _j <= _nv and not type(_dtbl[_i][3][4][_j, _i-1], 'undefined') then userinfo(3, {'events', 'eventreset'}, `reinit #5, event code `, _j, ` to defined init `, _dtbl[_i][3][4][_j, _i-1]); _dtbl[_i][3][1][_j, 8] := _dtbl[_i][3][4][_j, _i-1] elif _dtbl[_i][3][1][_j, 2] = 0 and irem(iquo(round(_dtbl[_i][3][1][_j, 4]), 32), 2) = 1 then userinfo(3, {'events', 'eventreset'}, `reinit #5, event code `, _j, ` to rate hysteresis init `, _dtbl[_i][5][24]); _dtbl[_i][3][1][_j, 8] := _dtbl[_i][5][24] elif _dtbl[_i][3][1][_j, 2] = 0 and irem(iquo(round(_dtbl[_i][3][1][_j, 4]), 2), 2) = 0 then userinfo(3, {'events', 'eventreset'}, `reinit #5, event code `, _j, ` to initial init `, _x0); _dtbl[_i][3][1][_j, 8] := _x0 else userinfo(3, {'events', 'eventreset'}, `reinit #5, event code `, _j, ` to fireinitial init `, _x0-2*_i+5.0); _dtbl[_i][3][1][_j, 8] := _x0-2*_i+5.0 end if end do end if end if; if _xin <> "last" then if 0 < 0 then if `dsolve/numeric/checkglobals`(op(_dtbl[1][14]), _pars, _n, _y0) then `dsolve/numeric/SC/reinitialize`(_dtbl, _y0, _n, procname, _pars, _i) end if end if; if _dtbl[1][4][7] = 0 then error "parameters must be initialized before solution can be computed" end if end if; _dat := eval(_dtbl[_i], 2); _dtbl[4] := _i; try _src := `dsolve/numeric/SC/IVPrun`(_dat, _xout) catch: userinfo(2, `dsolve/debug`, print(`Exception in solnproc:`, [lastexception][2 .. -1])); error  end try; if _src = 0 and 10 < _dat[4][9] then _val := _dat[3][1][_nv+1, 8] else _val := _dat[11][_dat[4][20], 0] end if; if _src <> 0 or _dat[4][9] <= 0 then _dtbl[1][5][1] := _xout else _dtbl[1][5][1] := _val end if; if _i = 3 and _val < _xout then Rounding := -infinity; if _dat[4][9] = 1 then error "cannot evaluate the solution further right of %1, probably a singularity", evalf[8](_val) elif _dat[4][9] = 2 then error "cannot evaluate the solution further right of %1, maxfun limit exceeded (see ?dsolve,maxfun for details)", evalf[8](_val) elif _dat[4][9] = 3 then if _dat[4][25] = 3 then error "cannot evaluate the solution past the initial point, problem may be initially singular or improperly set up" else error "cannot evaluate the solution past the initial point, problem may be complex, initially singular or improperly set up" end if elif _dat[4][9] = 4 then error "cannot evaluate the solution further right of %1, accuracy goal cannot be achieved with specified 'minstep'", evalf[8](_val) elif _dat[4][9] = 5 then error "cannot evaluate the solution further right of %1, too many step failures, tolerances may be too loose for problem", evalf[8](_val) elif _dat[4][9] = 6 then error "cannot evaluate the solution further right of %1, cannot downgrade delay storage for problems with delay derivative order > 1, try increasing delaypts", evalf[8](_val) elif 10 < _dat[4][9] then if _dat[4][9]-10 = _nv+1 then error "constraint projection failure on event at t=%1", evalf[8](_val) elif _dat[4][9]-10 = _nv+2 then error "index-1 and derivative evaluation failure on event at t=%1", evalf[8](_val) elif _dat[4][9]-10 = _nv+3 then error "maximum number of event iterations reached (%1) at t=%2", round(_dat[3][1][_nv+1, 3]), evalf[8](_val) else if _Env_dsolve_nowarnstop <> true then `dsolve/numeric/warning`(StringTools:-FormatMessage("cannot evaluate the solution further right of %1, event #%2 triggered a halt", evalf[8](_val), round(_dat[3][1][_dat[4][9]-10, 1]))) end if; Rounding := 'nearest'; _xout := _val end if else error "cannot evaluate the solution further right of %1", evalf[8](_val) end if elif _i = 2 and _xout < _val then Rounding := infinity; if _dat[4][9] = 1 then error "cannot evaluate the solution further left of %1, probably a singularity", evalf[8](_val) elif _dat[4][9] = 2 then error "cannot evaluate the solution further left of %1, maxfun limit exceeded (see ?dsolve,maxfun for details)", evalf[8](_val) elif _dat[4][9] = 3 then if _dat[4][25] = 3 then error "cannot evaluate the solution past the initial point, problem may be initially singular or improperly set up" else error "cannot evaluate the solution past the initial point, problem may be complex, initially singular or improperly set up" end if elif _dat[4][9] = 4 then error "cannot evaluate the solution further left of %1, accuracy goal cannot be achieved with specified 'minstep'", evalf[8](_val) elif _dat[4][9] = 5 then error "cannot evaluate the solution further left of %1, too many step failures, tolerances may be too loose for problem", evalf[8](_val) elif _dat[4][9] = 6 then error "cannot evaluate the solution further left of %1, cannot downgrade delay storage for problems with delay derivative order > 1, try increasing delaypts", evalf[8](_val) elif 10 < _dat[4][9] then if _dat[4][9]-10 = _nv+1 then error "constraint projection failure on event at t=%1", evalf[8](_val) elif _dat[4][9]-10 = _nv+2 then error "index-1 and derivative evaluation failure on event at t=%1", evalf[8](_val) elif _dat[4][9]-10 = _nv+3 then error "maximum number of event iterations reached (%1) at t=%2", round(_dat[3][1][_nv+1, 3]), evalf[8](_val) else if _Env_dsolve_nowarnstop <> true then `dsolve/numeric/warning`(StringTools:-FormatMessage("cannot evaluate the solution further left of %1, event #%2 triggered a halt", evalf[8](_val), round(_dat[3][1][_dat[4][9]-10, 1]))) end if; Rounding := 'nearest'; _xout := _val end if else error "cannot evaluate the solution further left of %1", evalf[8](_val) end if end if; if _EnvInFsolve = true then _dig := _dat[4][26]; _dat[4][26] := _EnvDSNumericSaveDigits; _Env_dsolve_SC_native := true; if _dat[4][25] = 1 then _i := 1; _dat[4][25] := 2 else _i := _dat[4][25] end if; _val := `dsolve/numeric/SC/IVPval`(_dat, _xout, _src); _dat[4][25] := _i; _dat[4][26] := _dig; [_xout, seq(_val[_vmap[_i]], _i = 1 .. _n-_ne)] else Digits := _dat[4][26]; _val := `dsolve/numeric/SC/IVPval`(eval(_dat, 2), _xout, _src); [_xout, seq(_val[_vmap[_i]], _i = 1 .. _n-_ne)] end if end proc, (2) = Array(0..0, {}), (3) = [t, x(t), y(t)], (4) = [z = z]}); _vars := _dat[3]; _pars := map(rhs, _dat[4]); _n := nops(_vars)-1; _solnproc := _dat[1]; if not type(_xout, 'numeric') then if member(x_rkf45, ["start", 'start', "method", 'method', "left", 'left', "right", 'right', "leftdata", "rightdata", "enginedata", "eventstop", 'eventstop', "eventclear", 'eventclear', "eventstatus", 'eventstatus', "eventcount", 'eventcount', "laxtol", 'laxtol', "numfun", 'numfun', NULL]) then _res := _solnproc(convert(x_rkf45, 'string')); if 1 < nops([_res]) then return _res elif type(_res, 'array') then return eval(_res, 1) elif _res <> "procname" then return _res end if elif member(x_rkf45, ["last", 'last', "initial", 'initial', "parameters", 'parameters', "initial_and_parameters", 'initial_and_parameters', NULL]) then _xout := convert(x_rkf45, 'string'); _res := _solnproc(_xout); if _xout = "parameters" then return [seq(_pars[_i] = _res[_i], _i = 1 .. nops(_pars))] elif _xout = "initial_and_parameters" then return [seq(_vars[_i+1] = [_res][1][_i+1], _i = 0 .. _n), seq(_pars[_i] = [_res][2][_i], _i = 1 .. nops(_pars))] else return [seq(_vars[_i+1] = _res[_i+1], _i = 0 .. _n)] end if elif type(_xout, `=`) and member(lhs(_xout), ["initial", 'initial', "parameters", 'parameters', "initial_and_parameters", 'initial_and_parameters', NULL]) then _xout := convert(lhs(x_rkf45), 'string') = rhs(x_rkf45); if type(rhs(_xout), 'list') then _res := _solnproc(_xout) else error "initial and/or parameter values must be specified in a list" end if; if lhs(_xout) = "initial" then return [seq(_vars[_i+1] = _res[_i+1], _i = 0 .. _n)] elif lhs(_xout) = "parameters" then return [seq(_pars[_i] = _res[_i], _i = 1 .. nops(_pars))] else return [seq(_vars[_i+1] = [_res][1][_i+1], _i = 0 .. _n), seq(_pars[_i] = [_res][2][_i], _i = 1 .. nops(_pars))] end if elif type(_xout, `=`) and member(lhs(_xout), ["eventdisable", 'eventdisable', "eventenable", 'eventenable', "eventfired", 'eventfired', "direction", 'direction', NULL]) then return _solnproc(convert(lhs(x_rkf45), 'string') = rhs(x_rkf45)) elif _xout = "solnprocedure" then return eval(_solnproc) elif _xout = "sysvars" then return _vars end if; if procname <> unknown then return ('procname')(x_rkf45) else _ndsol; _ndsol := pointto(_dat[2][0]); return ('_ndsol')(x_rkf45) end if end if; try _res := _solnproc(_xout); [seq(_vars[_i+1] = _res[_i+1], _i = 0 .. _n)] catch: error  end try end proc

dsol3(parameters)

[z = undefined]

``

dsol3(parameters = [2])

[z = 2.]

dsol3(0);

[t = 0., x(t) = HFloat(0.001745131016215891), y(t) = HFloat(2.891154777721139e-4)]

plots:-odeplot(dsol3, t = -1 .. 0, size = [500, 200], gridlines = false)

plots:-odeplot(dsol3, [x(t), y(t)], t = -1 .. 0, size = [500, 200], gridlines = false)

dsol3(parameters = [-1])

[z = -1.]

dsol3(0);

[t = 0., x(t) = HFloat(0.004939608415391789), y(t) = HFloat(6.264141438248237e-4)]

plots:-odeplot(dsol3, t = -1 .. 0, size = [500, 200], gridlines = false)

plots:-odeplot(dsol3, [x(t), y(t)], t = -1 .. 0, size = [500, 300], size = [500, 200], gridlines = false)

 

NULL

Download eslam_acc.mw

Some of the expressions in list S contain the name u[10]. That is, they are polynomials with u[10] appearing a name and not a function call.

But you previously made the assignment

u[10]:=unapply(1,x):

Thus the call to fsolve does not make sense.

Did you intend to unassign the name 'u[10]' right before calling fsolve (which could result in a solution where u[10] were not 1, eg. u[10] = -.5220762901)?

Or did you intend on substituting the value of 1 for u[10] in S, and passing fsolve one less expression (eg, by removing, say, one of those containing u[10])?

It's not really clear what your general term is, from your description.

I have guessed a general term, where the summation can be done to produce an explicit closed form (last example below). But even when the terms have to be added individually I don't see it as taking "a long time".

restart;

f := (r,t,n) -> add(BesselJ(0, t*r)*r^(2*(i-1)), i=1..n):

CodeTools:-Usage(
  evalf(Int(unapply(f(r,151.5793716314014,100),r), 0..1))
);

memory used=0.65MiB, alloc change=0 bytes, cpu time=43.00ms, real time=43.00ms, gc time=0ns

0.2274316632e-1

CodeTools:-Usage(
plot( t -> evalf(Int(unapply(f(r,t,100),r), 0..1)),
      100.00 .. 200 )
):

memory used=52.01MiB, alloc change=38.01MiB, cpu time=8.09s, real time=8.10s, gc time=18.81ms

restart;

f := (r,t,n) -> add(BesselJ(0, t*r)*r^(2*(i-1)), i=1..n):

CodeTools:-Usage(
  evalf(Int(f(r,151.5793716314014,100), r=0..1, method=_d01ajc))
);

memory used=0.79MiB, alloc change=0 bytes, cpu time=48.00ms, real time=48.00ms, gc time=0ns

0.2274316632e-1

CodeTools:-Usage(
plot( t -> evalf(Int(f(r,t,100), r=0..1, method=_d01ajc)),
      100.00 .. 200 )
):

memory used=105.31MiB, alloc change=36.00MiB, cpu time=8.38s, real time=8.38s, gc time=40.20ms

restart;

f := (r,t,n) -> Sum(BesselJ(0, t*r)*r^(2*(i-1)), i=1..n):

CodeTools:-Usage(
  evalf(Int(f(r,151.5793716314014,100), r=0..1, method=_d01ajc))
);

memory used=1.13MiB, alloc change=0 bytes, cpu time=27.00ms, real time=27.00ms, gc time=0ns

0.2274316632e-1

CodeTools:-Usage(
plot( t -> evalf(Int(f(r,t,100), r=0..1, method=_d01ajc)),
      100.00 .. 200 )
):

memory used=237.17MiB, alloc change=70.01MiB, cpu time=8.83s, real time=8.84s, gc time=84.62ms

 

If active sum can produce a closed form then it can be even faster.

 

restart;

f := unapply(sum(BesselJ(0, t*r)*r^(2*(i-1)), i=1..n), [r,t,n]);

proc (r, t, n) options operator, arrow; BesselJ(0, t*r)*(r^2)^(n+1)/(r^2*(r^2-1))-BesselJ(0, t*r)/(r^2-1) end proc

CodeTools:-Usage(
  evalf(Int(f(r,151.5793716314014,100), r=0..1, method=_d01ajc))
);

memory used=347.12KiB, alloc change=0 bytes, cpu time=8.00ms, real time=8.00ms, gc time=0ns

0.2274316632e-1

CodeTools:-Usage(
plot( 'evalf'(Int(f(r,t,100), r=0..1, method=_d01ajc)),
      t = 100.00 .. 200 )
);

memory used=21.45MiB, alloc change=2.00MiB, cpu time=440.00ms, real time=441.00ms, gc time=23.34ms

 

Download evalfInt_example.mw

It is pretty fast also with Digits=15 (and reduced accuracy requested for plotting, since you cannot see the difference).

Perhaps you could provide an actual worksheet that illustrates the slow behavior.

evalfInt_example_15.mw

You incorrectly have square brackets around the first argument passed to NonlinearFit, which is not valid syntax. I got rid of them in the procedure k__plot .

Also, I suspect that the very large coefficient in the exp terms is unnecessary and serves only to make it harder for an optimizer (because the corresponding factor k is then needlessly small, with loss of working precision).

restart 

with(Statistics) 

  X1 := Vector([0, 1, 2, 3, 4, 5, 6, 7, 8], datatype = float)

Y1 := Vector([0, -0.18e-1, -0.36e-1, -0.44e-1, -0.49e-1, -0.51e-1, -0.52e-1, -0.54e-1, -0.54e-1], datatype = float)

k__plot := proc (beta, k, t) options operator, arrow; .1544730161*beta*(Sum((-1)^n*exp(-Pi^2*(1+2*n)^2*k*t)*(-(1/2)/sqrt(Pi)+(1/2)*cos((1/2)*(1+2*n)*Pi)/sqrt(Pi)+(1/4)*sqrt(Pi)*(1+2*n)*sin((1/2)*(1+2*n)*Pi))/((2*Pi*n+Pi)*(1+2*n)^2), n = 0 .. infinity))+(-1)*0.1343994407e-1*beta+(-1)*0.6807477066e-1*beta*(9.869604401+8.*(Sum(-exp(-Pi^2*(1+2*n)^2*k*t)/(1+2*n)^2, n = 0 .. infinity))) end proc

plot0 := plot(k__plot(0.78e-1, 3*10^(-2), t), t = 0 .. 8); plots:-display(plot0, plot(`<|>`(X1, Y1), style = point, symbol = solidcircle, color = blue))

Digits := 24; ans := NonlinearFit('k__plot(beta, k, t)', X1, Y1, t, parameterranges = [beta = 0.8e-1 .. 0.89e-1, k = 0.3e-3 .. 0.369e-1], output = solutionmodule)

24

ans:-Results(parametervalues); ans:-Results(residualsumofsquares); new := ans:-Results(leastsquaresfunction)

0.623533880327568262975628e-4

plots:-display(plot(new, t = 0 .. 8), plot(k__plot(0.78e-1, 0.6e-1, t), t = 0 .. 8, style = point, symbol = diagonalcross, adaptive = false, numpoints = 20), plot(k__plot(0.78e-1, 0.3e-1, t), t = 0 .. 8, style = point, symbol = diagonalcross, color = green, adaptive = false, numpoints = 20), plot(`<|>`(X1, Y1), style = point, symbol = solidcircle, color = blue))

ans := NonlinearFit('k__plot(beta, k, t)', X1, Y1, t, parameterranges = [beta = 0.78e-1 .. 0.781e-1, k = 0.3e-1 .. 0.6e-1], output = solutionmodule); ans:-Results(parametervalues); ans:-Results(residualsumofsquares)

0.864031736453623208649908e-4

````

``

Download Nonlinear_Fit_Complex_Equation_acc.mw

restart;

f := (z, n) -> (1-z)^(n-1/2)/(z^(1/2)*Beta(0.5, 0.5+n)):

nJ := (p,c,hi) -> fsolve(n -> Int(unapply(f(z,n),z), 0..p) - c, 0..hi):

ans := nJ(10^(-5), 0.95, 10^6);

                                          5
                     ans := 1.920717307 10 

evalf(Int( unapply(f(z,ans),z), 0..10^(-5) ));

                          0.9499999999

Another way, using the symbolic integration result, and fsolve with a finite range as option.

restart;

f := (z, n) -> (1-z)^(n-1/2)/(z^(1/2)*Beta(1/2, 1/2+n)):

K := int(f(z,n), z=0..p) assuming n>1, p>0;

2*p^(1/2)*hypergeom([1/2, -n+1/2], [3/2], p)/Beta(1/2, 1/2+n)

alt := subs(_dummy=K, (p,c,rng) -> fsolve(_dummy-c, n=rng) ):

CodeTools:-Usage(  alt(10^(-5), 0.95, 0..10^6) );

memory used=12.43MiB, alloc change=4.00MiB, cpu time=93.00ms, real time=94.00ms, gc time=0ns

192071.7307

alt(10^(-2), 0.95, 0..10^3);
alt(10^(-2), 0.15, 0..10^3)

190.8605948

1.512092764

plots:-setoptions(numpoints=20):
plots:-display(
  plot(c->alt(10^(-5), c, 0..10^6), 0..1, adaptive=false)
  ,plot(c->alt(10^(-5), c, 0..10^5), 0..1, adaptive=false)
  ,plot(c->alt(10^(-5), c, 0..10^4), 0..0.3, adaptive=false)
  ,plot(c->alt(10^(-5), c, 0..10^3), 0..0.2, adaptive=false)
  ,plot(c->alt(10^(-5), c, 0..10^2), 0..0.03, adaptive=false)
  , gridlines=false
);

 

Download fsolve_example.mw

And, slightly simpler and more robust,

restart;

f := (z, n) -> (1-z)^(n-1/2)/(z^(1/2)*Beta(1/2, 1/2+n)):

K := int(f(z,n), z=0..p) assuming n>1, p>0;

2*p^(1/2)*hypergeom([1/2, -n+1/2], [3/2], p)/Beta(1/2, 1/2+n)

alt := subs(_dummy=K,
     proc(p,c,endpt::And(numeric,positive):=10^6)
       RootFinding:-NextZero(unapply(_dummy-c,n), 0, 'maxdistance'=endpt);
     end proc ):

CodeTools:-Usage(  alt(10^(-5), 0.95) );

memory used=24.82MiB, alloc change=4.00MiB, cpu time=233.00ms, real time=204.00ms, gc time=63.78ms

192071.7306

alt(10^(-5), 0.99999, 10^7);

975565.7618

alt(10^(-2), 0.95);
alt(10^(-2), 0.15)

190.8605948

1.512092763

plot(c->alt(10^(-5), c), 0..1, adaptive=false, gridlines=false);

 

Download RF_example.mw

Here are a few choices of format involving RealRange, if you don't just want to get the easy representation of {b<>2} by calling solve(det<>0) .

A := <1, 1, -2, -3|-1, -9, b, 11|-1, 3, 2, -1|b, -10, -4, 6>:

det := LinearAlgebra:-Determinant(A);

-8*b^2+32*b-32

b :: `union`( solve( Or(det>0, det<0), b ) );

b::(`union`(RealRange(-infinity, Open(2)), RealRange(Open(2), infinity)))

S := {solve( {Or(det>0, det<0)} )};

{{2 < b}, {b < 2}}

T := (Or@op)( map( And@op, S ) );

Or(And(2 < b), And(b < 2))

convert( T, RealRange);

Or(b::(RealRange(Open(2), infinity)), b::(RealRange(-infinity, Open(2))))

 

Download solve_example.mw

There is no such options as size for 3D plotting commands, and hence it is not accepted by the plots:-setoptions3d command.

However, the ROOT substructure which is used for 2D plots can in fact be inserted into a PLOT3D structure, and the GUI will repsect it.

Below is a command which will insert such a ROOT substructure into a PLOT3D structure, and resize it.

Since the Library commands don't expect to encounter such a substructure within a PLOT3D structure, you may need to ensure that this is the last operation done prior to displaying the plot. Eg, you may wish to apply it only after combining multiple plots using plots:-display, or applying plottools:-transform and friends to the original 3D plot.

You can always remove such a substructure with subsindets, since that substructure is a ROOT function call.

Note that the ROOT substructure modifies the plotting window's size, but does not rescale or zoom the plot. The routine I've provided allows width and height to be different, but in practice you'll find that only square dimensions (ie, m=n) produces something useful.

This functionality to specify the size of 3D plots has been on my wishlist for quite a while now. But I feel that a true solution would also consist of functionality to set the scaling factor (zoom) as well as custom aspect ratios for constrained 3D plots (which would need entirely new items allowed in the PLOT3D sustructure). For 2D plots all that is naturally obtained by just the dimensions, but for 3D plots all those features are related but distinct.

restart;

SetSize3D:=proc(P3D::specfunc(anything,{PLOT3D}),
                m::And(positive,numeric),
                n::And(positive,numeric))
  local R, P, P3Dnew;
  P := plot([[0,0]], ':-size'=[m,n]);
  R := indets(P, 'specfunc(anything,:-ROOT)')[1];
  P3Dnew := subsindets(P3D, 'specfunc(anything,:-ROOT)', ()->NULL);
  op(0,P3Dnew)(op(P3Dnew), R);
end proc:

Q := plot3d(sin(x)*y^2, x=-Pi .. Pi, y=-1 .. 1):
Q;

Qnew := SetSize3D(Q, 200,200);

SetSize3D(Qnew, 700, 700);

SetSize3D(Qnew, 300, 450);

SetSize3D(Qnew, 700, 300); # left-click on it to see that the box is wider

 

Download SetSize3D.mw

Sometimes it is convenient to pass multiple arguments via one or more Arrays (or Vectors), if you are going to be calling it several times, with manual typing.

This can make calling the procedure shorter to type, and less work if only a few entries get changed between calls. Eg,

Params[45] := newvalue:
Params[46] := anothervalue:
Func( Params );

Of course it's becomes necessary to document adequately the role of each Array entry. Stay organized, as that will pay off.

And you can use a few such Array parameters, separating them in various ways: by type (integers vs floats vs others), or by purpose. You can also have some additional parameters still be passed as scalar, or via positional or keyword options.

This approach can become awkward if you want to program a sequence of calls to the procedure, and one of the Array entries is varying.

You mentioned that your worksheet has 100 or more parameters. I would not be surprised if there would be benefits to doing the computations using several procedures, and those might not all require all the parameters to be passed. A reasonable amount of focus on an effective design of the computational flow usually pays off.

The background option for 2D plots was introduced in Maple 18.

So if really do have Maple 16 (and not Maple 2016, which later) then one way to get a curve plotted over an image involves first turning the image into a densityplot.

You didn't say whether you wanted to re-scale the sine curve, vertically, if the image was not in the same proportions as the x- and y-ranges. Or vice versa. So I chose the former. And it wasn't clear whether you wanted to display axes, whose tickmarks might match the sine values and x-y data.

restart:

kernelopts(version);

`Maple 16.01, X86 64 LINUX, May 6 2012, Build ID 744592`

(1)

fn:=cat(kernelopts(mapledir),"/data/tree.jpg"):

P:=ImageTools:-Read(fn):
P:=ImageTools:-Scale(P, 0.5):

m,n := ImageTools:-Width(P),ImageTools:-Height(P);

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

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

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

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

# Create a dummy density plot, whose data we'll replace with that from the image.

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

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

Pimage:=subsindets(Pimage,specfunc(anything,COLOR),z->COLOR(RGB,img)):

200, 133

(2)

a,b := 0, 2*Pi;
Psin := plot(sin(x), x=a..b):

0, 2*Pi

(3)

hi,lo := [max,min](op([1,1],Psin)[..,2])[]: # or just use -1 and 1

 

Newsin:=plottools:-transform((x,y)->[(x-a)*(m-1)/(b-a)+1,(y-lo)*(n-1)/(hi-lo)+1])(Psin):

plots:-display( Pimage, Newsin );

 

 

Download background_maple16.mw

Look inside the Startup Code Region of this first attachment.  From the main menubar choose items Edit -> Startup Code (Ctrl-Shift-E).

MaplePlayerSlideShowTest_ac.mw

Alternatively, you could make the calls to DocumentTools:-SetProperty be full and explicit, in the action code of the Buttons. And you could also form their action strings with Plot1 explicitly replacing id. In this next attachment there is no need for Startup Code.

MaplePlayerSlideShowTest_ac_2.mw

First 164 165 166 167 168 169 170 Last Page 166 of 336