sand15

837 Reputation

13 Badges

10 years, 247 days

MaplePrimes Activity


These are answers submitted by sand15

f1 can be integrated formally, but it seems f2 cannot.
(the assumptions I use come from the kc and kh ranges you give for f1).

restart:

#
# for numerical integration, assume sigma=10, kc=1.6..3, kh=3..7, deltac=1-deltah  , deltah=0.65
#
f1:=deltac*(1-x/(kc-3/2))^(-kc+1/2)+deltah*(1-x/(sigma*(kh-3/2)))^(-kh+1/2);

deltac*(1-x/(kc-3/2))^(-kc+1/2)+deltah*(1-x/(sigma*(kh-3/2)))^(-kh+1/2)

(1)


There is no need to use a numerical integration for f1

# For some unknown reason
# int(f1, x=0..X) assuming kc > 1/2, kh > 1/2, X > 0;
# vives no answer with Maple 2015.2 after a reasonable amount of time.
#
# So this trick:

int(f1, x) assuming kc > 1/2, kh > 1/2;
If1 := unapply(eval(%, x=X)-eval(%, x=0), [X, sigma, kc, kh, deltac, deltah]):


plot3d(If1(0.15, 10, kc, kh, 1-0.65, 0.65), kc=1.6..3, kh=3..7, labels=["kc", "kh", "int"], style=surface)

-deltac*(1-x/(kc-3/2))^(-kc+3/2)*(kc-3/2)/(-kc+3/2)-deltah*(1-x/(sigma*(kh-3/2)))^(-kh+3/2)*sigma*(kh-3/2)/(-kh+3/2)

 

 


I guess numerical integration is needed for f2

f2 := (deltac*(1-x/(kc-3/2))^(-kc+1/2)+deltah*(1-x/(sigma*(kh-3/2)))^(-kh+1/2))
      *
      (deltac*(1-x/(kc-3/2))^(-kc+3/2)+deltah*sigma*(1-x/(sigma*(kh-3/2)))^(-kh+3/2))

(deltac*(1-x/(kc-3/2))^(-kc+1/2)+deltah*(1-x/(sigma*(kh-3/2)))^(-kh+1/2))*(deltac*(1-x/(kc-3/2))^(-kc+3/2)+deltah*sigma*(1-x/(sigma*(kh-3/2)))^(-kh+3/2))

(2)

with(IntegrationTools):

If2 := Expand(Int(f2, x)) assuming kc > 1/2, kh > 3/2:
if2 := value(If2);

(1/2)*deltac^2*(2*kc-3-2*x)/((2*kc-1)*(((2*kc-3-2*x)/(2*kc-3))^kc)^2)-(1/4)*deltac^2*(4*kc*x-2*kc-2*x+3)*(2*kc-3-2*x)/((kc-3/2)*(((2*kc-3-2*x)/(2*kc-3))^kc)^2*(2*kc^2-3*kc+1))+(1/8)*deltac^2*(8*kc^2*x^2-8*kc^2*x-12*kc*x^2+4*kc^2+16*kc*x+4*x^2-12*kc-6*x+9)*(2*kc-3-2*x)/((kc-3/2)^2*(((2*kc-3-2*x)/(2*kc-3))^kc)^2*(2*kc^2-3*kc+1)*(2*kc-3))+deltac*deltah*sigma*(int((1-x/(kc-3/2))^(1/2)*(1-x/(sigma*(kh-3/2)))^(3/2)/((1-x/(kc-3/2))^kc*(1-x/(sigma*(kh-3/2)))^kh), x))+deltah*deltac*(int((1-x/(sigma*(kh-3/2)))^(1/2)*(1-x/(kc-3/2))^(3/2)/((1-x/(sigma*(kh-3/2)))^kh*(1-x/(kc-3/2))^kc), x))+(1/2)*deltah^2*sigma*(2*kh*sigma-3*sigma-2*x)/((2*kh-1)*(((2*kh*sigma-3*sigma-2*x)/(sigma*(2*kh-3)))^kh)^2)+(1/4)*deltah^2*(2*kh*sigma-4*kh*x-3*sigma+2*x)*(2*kh*sigma-3*sigma-2*x)/((kh-3/2)*(((2*kh*sigma-3*sigma-2*x)/(sigma*(2*kh-3)))^kh)^2*(2*kh^2-3*kh+1))+(1/8)*deltah^2*(4*kh^2*sigma^2-8*kh^2*sigma*x+8*kh^2*x^2-12*kh*sigma^2+16*kh*sigma*x-12*kh*x^2+9*sigma^2-6*sigma*x+4*x^2)*(2*kh*sigma-3*sigma-2*x)/(sigma*(kh-3/2)^2*(((2*kh*sigma-3*sigma-2*x)/(sigma*(2*kh-3)))^kh)^2*(2*kh^2-3*kh+1)*(2*kh-3))

(3)

select(has, {op(if2)}, int)

{deltah*deltac*(int((1-x/(sigma*(kh-3/2)))^(1/2)*(1-x/(kc-3/2))^(3/2)/((1-x/(sigma*(kh-3/2)))^kh*(1-x/(kc-3/2))^kc), x)), deltac*deltah*sigma*(int((1-x/(kc-3/2))^(1/2)*(1-x/(sigma*(kh-3/2)))^(3/2)/((1-x/(kc-3/2))^kc*(1-x/(sigma*(kh-3/2)))^kh), x))}

(4)

(1-x/b)^(1/2-kh);

# and

int(expr, x)

(1-x/a)^(-kc+1/2)*(1-x/b)^(-kh+1/2)

 

int((1-x/a)^(-kc+1/2)*(1-x/b)^(-kh+1/2), x)

(5)

 

Download f1_and_f2.mw

The simple command

res := eval(<vars>, fsolve(eval({e||(1..8)}, [y1[n]=iny1, y2[n]=iny2]), {vars})):

works perfectly well and your code produces something which seems correct.
Did you think that  tolerance is an option of eval? In this cas the answer is NO: eval has only 1 or 2 arguments (look to the corresponding help page)

Had it been the case, the lines

tolerance := 1e-6:
res := eval(<vars>, fsolve(eval({e||(1..8)}, [y1[n]=iny1, y2[n]=iny2]), {vars}), tolerance = tolerance):

would have produced an error; for instance:

restart
dsys := {diff(x(t),t)=y(t),diff(y(t),t)=-x(t),x(0)=1,y(0)=0}:
abserr := 1e-6;
                            0.000001
dsol := dsolve(dsys, numeric, abserr=abserr):
Error, (in dsolve/numeric/an_args/SC) keyword was '0.1e-5', optional keyword must be one of 'abserr', 
'delaymax', 'delaypts', 'differential', 'event_doublecross', 'event_initial', 'event_iterate', 
'event_maxiter', 'event_pre', 'event_project', 'event_relrange', 'event_stepreduction', 'events', 
'implicit', 'initstep', 'interpolate', 'interr', 'maxfun', 'maxstep', 'minstep', 'optimize', 
'output', 'projection', 'range', 'relerr', 'startinit', 'steppast'

To avaoid this error the correct syntax is (note the simple quotes arround the first occurence of abserr)

dsol := dsolve(dsys, numeric, 'abserr'=abserr):

 

Both the rhs have potentially 2 singularities: one at R=0, the other at R=1.
Computing limit(rhs(Sys[2]), R=1) returns alpha^2 and thus there is no problem at R=1 for the Phi-ode.

To resolve the 3 remaining singularities I propose to replace localy the rhs by its series expansion.
More precisely:

  • T-ode:
    • replace the rhs at R=0 by a series expansion T_SL in the interval [0, h],
    • note T_CS the rhs in the interval [h, 1-h],
    • replace the rhas at R=0 by a series expansion T_SR in the interval [1-h, L), where L is any number > 1,
      (possibly L = 1+h and a fourth range [1+h, L) could be included where T_CS2 is equal to the rhs)
    • dsolve exactly {diff(T(R), R) = T_LS, T(0)=0.5},
    • dsolve numerically {diff(T(R), R) = T_CS, T(h)=U} where U is the value of T at point R=h for the previous solution,
    • dsolve exactly {diff(T(R), R) = T_RS, T(1-h)=V} where U is the value of T at point R=h for the previous solution.
      (possibly dsolve numerically in the fourth range)
  • Phi-ode
    • replace the rhs at R=0 by a series expansion Phi_SL in the interval [0, h],
    • note T_CS the rhs in the interval [h, L), where L is any number > 1,
    • solve exactly {diff(T(R), R) = T_LS, T(0)=0.5},
    • solve numerically {diff(T(R), R) = T_CS, T(h)=U} where U is the value of T at point R=h for the previous solution.

Merge the pieces of solution.
I took arbitrary h=0.25, but this value can be adjusted; a comparison with @Preben Alsholm's solution is also presented
Finally, I've chosen alpha=1, T(0)=1/2 and Phi(0)=0.
 

restart

with(plots):

Sys := diff(T(R),R)=((1-1/R)*(sqrt(1-(alpha/R)^2*(1-1/R))))^(-1),diff(Phi(R),R)=(alpha/R)^2*(sqrt(1-(alpha/R)^2*(1-1/R)))^(-1);

diff(T(R), R) = 1/((1-1/R)*(1-alpha^2*(1-1/R)/R^2)^(1/2)), diff(Phi(R), R) = alpha^2/(R^2*(1-alpha^2*(1-1/R)/R^2)^(1/2))

(1)

T_LS := eval(convert(series(rhs(Sys[1]), R=0, 6), polynom), alpha=1) assuming R > 0;
T_RS := eval(convert(series(rhs(Sys[1]), R=1, 6), polynom), alpha=1);

h := 0.25:
T_CS := eval(rhs(Sys[1]), alpha=1);

-R^(5/2)-(3/2)*R^(7/2)-(15/8)*R^(9/2)-(27/16)*R^(11/2)

 

1/(R-1)+17/8-(5/8)*R-(1/16)*(R-1)^2+(179/128)*(R-1)^3

 

1/((1-1/R)*(1-(1-1/R)/R^2)^(1/2))

(2)

T_Lsol  := Re( dsolve({diff(T(R),R)=T_LS, T(0)=1/2}, T(R)) ):
T_C1sol := dsolve({diff(T(R),R)=T_CS, T(h)=eval(rhs(T_Lsol), R=h)}, numeric):

T_Rsol  := Re( dsolve({diff(T(R),R)=T_RS, T(1-h)=eval(T(R), T_C1sol(1-h))}, T(R)) ):
T_C2sol := dsolve({diff(T(R),R)=T_CS, T(1+h)=eval(rhs(T_Rsol), R=1+h)}, numeric):

T_plot := display(
  plot(rhs(T_Lsol), R=0...h, color=red, legend=T),
  odeplot(T_C1sol, [R, T(R)], R=h..1-h, color=red),
  plot(Re(rhs(T_Rsol)), R=1-h..1+h, color=red),
  odeplot(T_C2sol, [R, T(R)], R=1+h..2, color=red)
):

Phi_LS := eval(convert(series(rhs(Sys[2]), R=0, 6), polynom), alpha=1) assuming R > 0;
Phi_RS := eval(rhs(Sys[2]), alpha=1);

1/R^(1/2)+(1/2)*R^(1/2)+(3/8)*R^(3/2)-(3/16)*R^(5/2)-(61/128)*R^(7/2)

 

1/(R^2*(1-(1-1/R)/R^2)^(1/2))

(3)

Phi_Lsol := dsolve({diff(Phi(R),R)=Phi_LS, Phi(0)=0}, Phi(R));
Phi_Rsol := dsolve({diff(Phi(R),R)=Phi_RS, Phi(h)=eval(rhs(Phi_Lsol), R=h)}, numeric):

Phi_plot := display(
  plot(rhs(Phi_Lsol), R=0...h, color=blue, legend=Phi),
  odeplot(Phi_Rsol, [R, Phi(R)], R=h..2, color=blue)
):

Phi(R) = -(1/20160)*R^(1/2)*(2135*R^4+1080*R^3-3024*R^2-6720*R-40320)

(4)

display(T_plot, Phi_plot)

 

NumSol := dsolve(eval({Sys}, alpha=1) union {T(1e-10)=1/2, Phi(1e-10)=0}, numeric, events=[[R=1-1e-10, halt]])

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 := []; _dtbl := array( 1 .. 4, [( 1 ) = (array( 1 .. 24, [( 1 ) = (datatype = float[8], order = C_order, storage = rectangular), ( 2 ) = (datatype = float[8], order = C_order, storage = rectangular), ( 3 ) = ([Array(1..2, 1..21, {(1, 1) = 1.0, (1, 2) = 2.0, (1, 3) = 1.0, (1, 4) = .0, (1, 5) = .9999999999, (1, 6) = .0, (1, 7) = 1.0, (1, 8) = undefined, (1, 9) = undefined, (1, 10) = 1.0, (1, 11) = undefined, (1, 12) = undefined, (1, 13) = undefined, (1, 14) = undefined, (1, 15) = undefined, (1, 16) = undefined, (1, 17) = undefined, (1, 18) = undefined, (1, 19) = undefined, (1, 20) = undefined, (1, 21) = undefined, (2, 1) = 1.0, (2, 2) = .0, (2, 3) = 100.0, (2, 4) = .0, (2, 5) = .0, (2, 6) = .0, (2, 7) = .0, (2, 8) = undefined, (2, 9) = undefined, (2, 10) = 0.10e-6, (2, 11) = undefined, (2, 12) = .0, (2, 13) = undefined, (2, 14) = .0, (2, 15) = .0, (2, 16) = undefined, (2, 17) = undefined, (2, 18) = undefined, (2, 19) = undefined, (2, 20) = undefined, (2, 21) = undefined}, datatype = float[8], order = C_order), proc (R, Y, Ypre, n, EA) EA[1, 8+2*n] := 1; 0 end proc, proc (e, R, Y, Ypre) return 0 end proc, Array(1..1, 1..2, {(1, 1) = undefined, (1, 2) = undefined}, datatype = float[8], order = C_order)]), ( 4 ) = (Array(1..54, {(1) = 2, (2) = 2, (3) = 0, (4) = 0, (5) = 0, (6) = 0, (7) = 1, (8) = 0, (9) = 0, (10) = 0, (11) = 0, (12) = 0, (13) = 0, (14) = 0, (15) = 0, (16) = 1, (17) = 0, (18) = 1, (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, (54) = 0}, datatype = integer[8])), ( 5 ) = (Array(1..28, {(1) = 0.10e-9, (2) = 0.10e-5, (3) = .0, (4) = 0.500001e-14, (5) = 0.10e-9, (6) = 0.5047658755589162e-7, (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..2, {(1) = .0, (2) = .5}, datatype = float[8], order = C_order)), ( 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..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) = .0, (2) = .0}, datatype = float[8], order = C_order)]), ( 8 ) = ([Array(1..2, {(1) = .0, (2) = .5}, datatype = float[8], order = C_order), Array(1..2, {(1) = .0, (2) = .0}, datatype = float[8], order = C_order), Array(1..2, {(1) = 100000.000005, (2) = -0.100000000015e-24}, datatype = float[8], order = C_order), 0, 0]), ( 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] = Phi(R), Y[2] = T(R)]`; if -(1-1/X)/X^2 < -1 then YP[1] := undefined; return 0 end if; YP[1] := evalf(1/(1-(1-1/X)/X^2)^(1/2))/X^2; YP[2] := evalf(1/(1-(1-1/X)/X^2)^(1/2))/(1-1/X); 0 end proc, -1, 0, 0, proc (R, Y, Ypre, n, EA) EA[1, 8+2*n] := 1; 0 end proc, proc (e, R, Y, Ypre) return 0 end proc, 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] = Phi(R), Y[2] = T(R)]`; if -(1-1/X)/X^2 < -1 then YP[1] := undefined; return 0 end if; YP[1] := evalf(1/(1-(1-1/X)/X^2)^(1/2))/X^2; YP[2] := evalf(1/(1-(1-1/X)/X^2)^(1/2))/(1-1/X); 0 end proc, -1, 0, 0, proc (R, Y, Ypre, n, EA) EA[1, 8+2*n] := 1; 0 end proc, proc (e, R, Y, Ypre) return 0 end proc, 0, 0]), ( 22 ) = (0), ( 23 ) = (0), ( 20 ) = ([]), ( 21 ) = (0), ( 24 ) = (0)  ] ))  ] ); _y0 := Array(0..2, {(1) = 0.1e-9, (2) = 0.}); _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] < 100 and 100 <= _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 100 <= _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] < 100 and 100 < _dtbl[5-_i][4][9] then _dtbl[4] := 5-_i; _i := 5-_i end if; if _dtbl[_i][4][9] < 100 then error "no events to clear" elif _nv < _dtbl[_i][4][9]-100 then error "event error condition cannot be cleared" else _j := _dtbl[_i][4][9]-100; 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] < 100 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 100 < _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 _dat[4][9] = 10 then error "cannot evaluate the solution further right of %1, interrupt requested", evalf[8](_val) elif 100 < _dat[4][9] then if _dat[4][9]-100 = _nv+1 then error "constraint projection failure on event at t=%1", evalf[8](_val) elif _dat[4][9]-100 = _nv+2 then error "index-1 and derivative evaluation failure on event at t=%1", evalf[8](_val) elif _dat[4][9]-100 = _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]-100, 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 _dat[4][9] = 10 then error "cannot evaluate the solution further right of %1, interrupt requested", evalf[8](_val) elif 100 < _dat[4][9] then if _dat[4][9]-100 = _nv+1 then error "constraint projection failure on event at t=%1", evalf[8](_val) elif _dat[4][9]-100 = _nv+2 then error "index-1 and derivative evaluation failure on event at t=%1", evalf[8](_val) elif _dat[4][9]-100 = _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]-100, 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) = [R, Phi(R), T(R)], (4) = []}); _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

(5)

NumSol_plot := odeplot(
                 NumSol
                 , [[R, T(R)], [R, Phi(R)]]
                 , R=1e-10..1-1e-10
                 , color=[red, blue]
                 , style=[point, point]
                 , symbol=[circle, circle]
                 , legend=[T, Phi]
               ):

display(T_plot, Phi_plot, NumSol_plot, view=[default, -10..3])

 

 


dsolve_series_1.mw

Assuming both alpha and k are strictly positive:

Jn := (alpha, k) -> k*Int((BesselK(0, k*Zeta)/Zeta^3)*Zeta*BesselK(1, alpha*Zeta), Zeta = 1 .. infinity):
r  := rand(0. .. 10):
ak := r(), r();
evalf(Jn(ak))
                    9.631107879, 5.713953505
                                      -8
                        1.463786783 10  

Multiply this value by 4*h1*lambda to get the final result

You can define cot(x) as 1/tan(x) or cot(x) as tan(Pi/2-x) and even cot(x) as -tan(x+Pi/2) (and while not say that cot(x) = cos(x)/sin(x) ?).
In your case (where does the value 90 come from?) you can obtain evry different simplifications: they all depend on the rules you apply and the order you apply them.

Result y is, IMO, even simpler and easier to read than MMA's result. It uses the subjective simplification tan = 1/cot.

Result z is closer to MMA's but replaces Pi/2 by Phi in order to avoid earlier (and autimatic) simplifications. It uses the subjective simplification cot = 1/tan (which is just one of the many definitions of cot).

The last result starts from z and uses nother subjective simplification cot(Pi/2+alpha/2)=-cot(Pi/2-alpha/2).

restart:
x := -sin(alpha)*(L + (e + r)/tan(-Pi/2 + alpha/2))/2 + sin(alpha)*L:
eval(%, cot=(u -> 1/tan(u))):
y := collect(%, sin);
           /1     1            /1      \\           
           |- L + - (e + r) tan|- alpha|| sin(alpha)
           \2     2            \2      //           

x := -sin(alpha)*(L + (e + r)/tan(Phi + alpha/2))/2 + sin(alpha)*L:

eval(%, tan=(u -> 1/cot(u))):
z := collect(%, sin);
        /1     1            /      1      \\           
        |- L - - (e + r) cot|Phi + - alpha|| sin(alpha)
        \2     2            \      2      //           
eval(z, cot(Phi+alpha/2)=-cot(Phi-alpha/2));
        /1     1            /      1      \\           
        |- L + - (e + r) cot|Phi - - alpha|| sin(alpha)
        \2     2            \      2      //           

simplify.mw

s := singular(1/sin(x), x):
var := (indets(%) minus {x})[]:
eval(s, var = `#mo("&#x2124;")`);

As @tomleslie said, one BC is missing.

An example with a periodic BC for D[1](u) ( = diff(u(x, t), x) )

restart:
PDE  := diff(u(x, t), t) = -u(x, t)*diff(u(x, t), x) + 0.1 * diff(u(x, t), x$2):
IC   := u(x, 0) = sin(x):
BC   := u(0, t)=u(2*Pi, t), D[1](u)(0, t)=D[1](u)(2*Pi, t):
IBC  := {IC, BC}:

pds := pdsolve(PDE, IBC, numeric, time=t, range=0..2*Pi):  # just do as explained in the help page
plots:-display(
  seq(
    pds:-plot(
      t=tau
      , numpoints=50
      , color=ColorTools:-Color([rand()/10^12, rand()/10^12, rand()/10^12])
      , legend=('t'=nprintf("%1.2e", tau))
    )
    , tau in [seq](0..2, 0.25)
  )
)

Explanation

P := plot3d( [ b, ( b^2 ) / 4, -b / 2 ], b = -4 .. 4, c = -4 .. 4, thickness = 5, color = red  ); 

P is made of two elements

op(P) = MESH(...., COLOR(....)), THICKNESS(...)

When a MESH structure is plotted the "construction lines" of the mesh are too (default choice).
To avoid plotting them (see PLOT3D help page) you have to use the option STYLE(HIDDEN).

Then (no need to the THICKNESS option)

PLOT3D( MESH( op(op(P)), STYLE(HIDDEN) ) )

does the job.

Not that simple but this explains why the curve you got is black: the black boundaries of each element of the MESH "overwrite" the red on their interiors.


First thing to do is to load (ExcelTools:-Import ; look the corresponding help page) your data 

Data := ExcelTools:-Import(....):

Determine the number of lines:

N := numelems(M[.., 1])

To split Data into a train base and a test base :

  • define the fraction tau of data in the 
  • set NT := round(tau*N)  (or floor or ceil instead)
  • realise a random splitting:
    combinat:-randperm([$1..N]):
    TrainSet := %[1..NT]:
    TestSet  := %%[NT+1..N]
  • then:
    TrainData := Data[TrainSet];
    TestData  := Data[TestSet];

Apply Statistics with the fit method (linear or nonlinear) to TrainData..
Evaluate the quality of the fit on TestData.

Provide an Excel data file if you want more details.


The reason why you get a wong picture for your second test case is detailed in the mw file I'm nor able to load right now (it will be the case in a few hours).


Concerning this second test case (Maple 2020)

restart:
with(plots):
with(ComputationalGeometry):

# Feasibility domain

Q := inequal(
       Or(u^2+4*v^2 <= 4, And(u^2+v^2 < 4, (u+2)^2+2*(v-1)^2 <= 2))
       , u=-2..2, v=-2..2
       , nolines
     ):

# Extract the polygons that <inequal> has built

POL := select(has, [op(Q)], POLYGONS):
numelems(POL): 
                         2

# Mapping & plotting

F := plottools:-transform((u, v)  -> [u^3-v^2, u^2-v^3]):
display(F(Q)):

# Searching noon at 2pm
# The analysis of the poorness of the above plot shows it comes from the closure of the drawing
# of some of the elemmentary polygons POL contains (this will be clear in the mw file).
# All these concerned polygons having more than 3 sides, the basic idea is to triangulate 
# the feasibility domain using DalaunayTriangulation.

# first component of POL

pol  := op(1..-4, op(1, POL)):
pts  :=  `<,>`(pol)
tris := DelaunayTriangulation(pts):
display(map(x -> plottools:-polygon(pts[x], style='polygon'), tris), axes=none):
d1 := display(F(%)):

# second component of POL

pol  := op(1..-4, op(2, POL)):
pts  :=  `<,>`(pol)
tris := DelaunayTriangulation(pts):
display(map(x -> plottools:-polygon(pts[x], style='polygon'), tris), axes=none):
d2 := display(F(%)):

# drawings

display(`<,>`(d1, d2, display(d1, d2))):


The result is already very good but could probably be improved if the construction of Q was refined.
Use optionsimplicit=[grid=[50, 50]] in inequal(...) ... but beware of the computation time for finer grids !!!


File to come (either from this logname or from my non professional logname "mmcdara")
Here it is


DrawingIssue.mw
Maple

Mathematica


Unless I'm mistaken (it's early in the morning and I haven't get my coffee) the answer is 260

Reasoning.

  1. Choose a color for the right triangle : 5 choices.
  2. Choose a color for top and bottom triangles : 4 choices for each.
  3. For the left triangle :
    1. if colors of top and bottom triangles are the same, 4 choices are left.
    2. If they are not the same 3 choices are left.

The probability that the top and bottom triangles share the same color is 1/4.
Thus 
N = 5 * 4 * 4 * (1/4 * 4 + 3/4 * 3) = 5 * 4 * (4 + 9) = 20 * 13 = 260

Given the 2 elementary events R = "a Red ball is drawn" and W = "a White ball is drawn", this will give you all the compound events of an experiment in which 3 balls are drawn from the box.

restart:
alias(C=combinat):
Box := [R$3, W$3]:
(op @ C:-permute)~(C:-choose(Box, 3));


BTW, you code can be simply written this way

combinat:-powerset({$1..3})

 

As isolve seems (IMO) more powerful and versatile than msolve I have build a simple procedure _msolve  which uses syntax of msolve and the power of the isolve .
 

restart:
_msolve := proc(eqs, m)
  local v := convert(indets(eqs, name), list);
  local e := lhs~(eqs) =~ rhs~(eqs) +~ m *~ parse~(cat~(_K, [$1..numelems(v)]));
  local s := isolve(convert(e, set));
  map(u -> v =~ eval(v, u), [s]);
end proc:

_msolve(x^2=-1, 5);  # "your" problem
  [ [ x = 3 - 5 _Z1 ], [ x = 2 - 5 _Z1 ] ]

_msolve(2^i=3, 19);  # from msolve help page
  [ [ i = 13 - 18 _Z1 ] ]

_msolve({3*x-4*y=1, 7*x+y=2}, 19); # from msolve help page
  [ [ x = 15 + 57 _Z1 + 76 _Z2,  y = 11 + 38 _Z1 + 57 _Z2 ] ]

# A generalization of the previous system where 2 modulii are used:
  eqs := {3*x-4*y=1, 7*x+y=2}:
  m   := [7, 19]
_msolve(eqs, m);
  [ [ x = 15 + 37 _Z1 + 76 _Z2, y = 11 + 26 _Z1 + 57 _Z2 ] ]

# a specific instance
eval(%[], [_Z1=1, _Z2=2]);
   [ x = 204, y = 151 ]

# check
eval(irem~(lhs~(eqs), m), %);
   [ 1, 2 ]

 


Let P the list of (2D) points:

ch  := simplex:-convexhull(P, output=true):
pch := plottools:-getdata(ch)[1][1];    
n:=2:
while pch[n, 1] > pch[n_1, 1] do
  n := n+1:
end do:
NewtonPolygon := pch[1..n-1]


Explanation
pch contains the set of points (a matrix) ordered with respect to an increasing curvilinear abscissa, starting from the leftmost point and in counter clockwise sense.
The Newton polygon is the submatrix of pch wich contains all the points with increasing "x" (1st column of pch).
The loop is aimed to determine the nth point whose abscissa "x" is lower than the previous one

A minimalist answer you can decorate as you want.
I hope there is no typos for I do not have Maple right now.

(If you have any problems I will reply you when I'm home [login = mmcdara])

 

restart:
with(plots):
with(Maplets[Elements]):

f := proc(p1, p2)
local maplet:
maplet := Maplet(
  [
    [
      Plotter['PL1'](p1),
      Plotter['PL2'](p2)
    ]
  ]
):

Maplets[Display](maplet):
end proc:

A := dualaxisplot(sin(x), cos(x), x=0..2*Pi):
B := dualaxisplot(sin(x), cos(x), x=0..2*Pi, color=[green, blue]):

f(A, B);

 

1 2 3 4 5 6 Page 4 of 6