| Appendix A Maple code for Examples 1-4 from "Extending Explicit and Linealry Implicit ODE Solvers for Index-1 DAEs", M. T. Lawder,  V. Ramadesigan, B. Suthar and V. R. Subramanian, Computers and Chemical Engineering, in press (2015). Use y1, y2, etc. for all differential variables and z1, z2, etc. for all algebraic variables    Example 1 Enter all ODEs in eqode 
| > | eqode:=[diff(y1(t),t)=-y1(t)^2+z1(t)]; |  
| ![eqode := [diff(y1(t), t) = -y1(t)^2+z1(t)]](/view.aspx?sf=201067_post/b03392e74cb021fbb97942b705516b42.gif)
 | (1) |  Enter all AEs in eqae 
| > | eqae:=[cos(y1(t))-z1(t)^0.5=0]; |  
| ![eqae := [cos(y1(t))-z1(t)^.5 = 0]](/view.aspx?sf=201067_post/29e0d5672dae5a1a804bc9397397652b.gif)
 | (2) |  Enter all initial conditions for differential variables in icodes 
| ![icodes := [y1(0) = .25]](/view.aspx?sf=201067_post/4bfe7baf4aa7f4f3726b7aac6089e879.gif)
 | (3) |  Enter all intial conditions for algebraic variables in icaes 
| ![icaes := [z1(0) = .8]](/view.aspx?sf=201067_post/0e17612dee195d9aa79a0ef9ccca2acb.gif)
 | (4) |  Enter parameters for perturbation value (mu), switch function (q and tint), and runtime (tf) 
| > | pars:=[mu=0.1,q=1000,tint=1,tf=5]; |  
| ![pars := [mu = .1, q = 1000, tint = 1, tf = 5]](/view.aspx?sf=201067_post/933c7ae096d6c3706d7def6959f16743.gif)
 | (5) |  Choose solving method (1 for explicit, 2 for implicit) 
| 
 | (6) |  Standard solver requires IC z(0)=0.938791 or else it will fail 
| > | solx:=dsolve({eqode[1],eqae[1],icodes[1],icaes[1]},numeric): |  
| Error, (in dsolve/numeric/DAE/checkconstraints) the initial conditions do not satisfy the algebraic constraintserror = .745e-1, tolerance = .559e-6, constraint = cos(y1(t))-z1(t)^.5000000000000000000000
 
 |  |  
| > | ff:=subs(pars,1/2+1/2*tanh(q*(t-tint))); |  
| 
 | (7) |  
| > | NODE:=nops(eqode);NAE:=nops(eqae); |  
| 
 
 | (8) |  
| > | for XX from 1 to NODE doEQODE||XX:=lhs(eqode[XX])=rhs(eqode[XX])*ff;
 end do;
 |  
| 
 | (9) |  
| > | for XX from 1 to NAE doEQAE||XX:=subs(pars,-mu*(diff(rhs(eqae[XX])-lhs(eqae[XX]),t))=rhs(eqae[XX])-lhs(eqae[XX]));
 end do;
 |  
| 
 | (10) |  
| > | Dvars1:={seq(diff(z||x(t),t)=D||x,x=1..NAE)}; |  
| 
 | (11) |  
| > | Dvars2:={seq(rhs(Dvars1[x])=lhs(Dvars1[x]),x=1..NAE)}; |  
| 
 | (12) |  
| > | icsn:=seq(subs(y||x(0)=y||x(t),icodes[x]),x=1..NODE),seq(subs(z||x(0)=z||x(t),icaes[x]),x=1..NAE); |  
| 
 | (13) |  
| > | EQAEX||j:=subs(Dvars1,eqode,icsn,Dvars2,lhs(EQAE||j))=rhs(EQAE||j); |  
| > | Sys:={seq(EQODE||x,x=1..NODE),seq(EQAEX||x,x=1..NAE),seq(icodes[x],x=1..NODE),seq(icaes[x],x=1..NAE)}; |  
| 
 | (14) |  
| > | sol:=dsolve(Sys,numeric): |  
| > | sol:=dsolve(Sys,numeric,stiff=true,implicit=true):end if:
 |  
| > | for XX from 1 to NODE doa||XX:=odeplot(sol,[t,y||XX(t)],0..subs(pars,tf),color=red);
 end do:
 |  
| > | for XX from NODE+1 to NODE+NAE doa||XX:=odeplot(sol,[t,z||(XX-NODE)(t)],0..subs(pars,tf),color=blue);
 end do:
 |  
| > | display(seq(a||x,x=1..NODE+NAE),axes=boxed); |  End Example 1 Example 2 
| > | eq1:=diff(y1(t),t)=j1*W/F/rho/V; |  
| 
 | (15) |  
| 
 | (16) |  
| > | j1:=io1*(2*(1-y1(t))*exp((0.5*F/R/T)*(z1(t)-phi1))-2*y1(t)*exp((-0.5*F/R/T)*(z1(t)-phi1))); |  
| 
 | (17) |  
| > | j2:=io2*(exp((F/R/T)*(z1(t)-phi2))-exp((-F/R/T)*(z1(t)-phi2))); |  
| 
 | (18) |  
| > | params:={F=96487,R=8.314,T=298.15,phi1=0.420,phi2=0.303,W=92.7,V=1e-5,io1=1e-4,io2=1e-10,iapp=1e-5,rho=3.4}; |  
| 
 | (19) |  
| > | eqode:=[subs(params,eq1)]; |  
| ![eqode := [diff(y1(t), t) = 0.5651477584e-2*(1-y1(t))*exp(19.46229155*z1(t)-8.174162450)-0.5651477584e-2*y1(t)*exp(-19.46229155*z1(t)+8.174162450)]](/view.aspx?sf=201067_post/3c29472a4e5cf1a31dd5e1a4e05955ec.gif)
 | (20) |  
| > | eqae:=[subs(params,eq2)]; |  
| ![eqae := [0.2e-3*(1-y1(t))*exp(19.46229155*z1(t)-8.174162450)-0.2e-3*y1(t)*exp(-19.46229155*z1(t)+8.174162450)+0.1e-9*exp(38.92458310*z1(t)-11.79414868)-0.1e-9*exp(-38.92458310*z1(t)+11.79414868) = 0.1e-4]](/view.aspx?sf=201067_post/a1c8e45e84726f0a98eff39ad3eea7ac.gif)
 | (21) |  
| ![icodes := [y1(0) = 0.5e-1]](/view.aspx?sf=201067_post/54fa84f300d4551d55e70a5d34887ae2.gif)
 | (22) |  
| ![icaes := [z1(0) = .7]](/view.aspx?sf=201067_post/5a262cca607db4e59758f06163e3525c.gif)
 | (23) |  
| > | solx:=dsolve({eqode[1],eqae[1],icodes[1],icaes[1]},type=numeric): |  
| Error, (in dsolve/numeric/DAE/checkconstraints) the initial conditions do not satisfy the algebraic constraintserror = .447e9, tolerance = .880e4, constraint = -2000000*(-1+y1(t))*exp(19.46229155000000000000*z1(t)-8.174162450000000000000)-2000000*y1(t)*exp(-19.46229155000000000000*z1(t)+8.174162450000000000000)+exp(38.92458310000000000000*z1(t)-11.79414868000000000000)-exp(-38.92458310000000000000*z1(t)+11.79414868000000000000)-100000
 
 |  |  
| > | pars:=[mu=0.00001,q=1000,tint=1,tf=5001]; |  
| ![pars := [mu = 0.1e-4, q = 1000, tint = 1, tf = 5001]](/view.aspx?sf=201067_post/fabfa3e920f66dd1a14a7625655abf14.gif)
 | (24) |  
| 
 | (25) |  
| > | ff:=subs(pars,1/2+1/2*tanh(q*(t-tint))); |  
| 
 | (26) |  
| > | NODE:=nops(eqode):NAE:=nops(eqae); |  
| 
 | (27) |  
| > | for XX from 1 to NODE doEQODE||XX:=lhs(eqode[XX])=rhs(eqode[XX])*ff:
 end do;
 |  
| 
 | (28) |  
| > | for XX from 1 to NAE doEQAE||XX:=subs(pars,-mu*(diff(rhs(eqae[XX])-lhs(eqae[XX]),t))=rhs(eqae[XX])-lhs(eqae[XX]));
 end do;
 |  
| 
 | (29) |  
| > | Dvars1:={seq(diff(z||x(t),t)=D||x,x=1..NAE)}; |  
| 
 | (30) |  
| > | Dvars2:={seq(rhs(Dvars1[x])=lhs(Dvars1[x]),x=1..NAE)}; |  
| 
 | (31) |  
| > | icsn:=seq(subs(y||x(0)=y||x(t),icodes[x]),x=1..NODE),seq(subs(z||x(0)=z||x(t),icaes[x]),x=1..NAE); |  
| 
 | (32) |  
| > | EQAEX||j:=subs(Dvars1,eqode,icsn,Dvars2,lhs(EQAE||j))=rhs(EQAE||j); |  
| 
 | (33) |  
| > | Sys:={seq(EQODE||x,x=1..NODE),seq(EQAEX||x,x=1..NAE),seq(icodes[x],x=1..NODE),seq(icaes[x],x=1..NAE)}; |  
| 
 | (34) |  
| > | sol:=dsolve(Sys,numeric,maxfun=0): |  
| > | sol:=dsolve(Sys,numeric,stiff=true,implicit=true,maxfun=0): |  
| > | for XX from 1 to NODE doa||XX:=odeplot(sol,[t,y||XX(t)],0..subs(pars,tf),color=red);
 end do:
 |  
| > | for XX from NODE+1 to NODE+NAE doa||XX:=odeplot(sol,[t,z||(XX-NODE)(t)],0..subs(pars,tf),color=blue);
 end do:
 |  
| > | b1:=odeplot(sol,[t,y1(t)],0..1,color=red):b2:=odeplot(sol,[t,z1(t)],0..1,color=blue):
 |  
| > | display(b1,b2,axes=boxed); |  
| > | display(seq(a||x,x=1..NODE+NAE),axes=boxed); |  End Example 2 Example 3 
| > | eq1:=diff(y1(t),t)^2+diff(y1(t),t)*(y1(t)+1)+y1(t)=cos(diff(y1(t),t)); |  
| 
 | (35) |  
| > | solx:=dsolve({eq1,y1(0)=0},numeric): |  
| Error, (in dsolve/numeric/make_proc) Could not convert to an explicit first order system due to 'RootOf'
 |  |  
| > | eqode:=[diff(y1(t),t)=z1(t)]; |  
| ![eqode := [diff(y1(t), t) = z1(t)]](/view.aspx?sf=201067_post/8211d7e3f8b53ab8884d6754c5b03c1f.gif)
 | (36) |  
| > | eqae:=[subs(eqode,eq1)]; |  
| ![eqae := [z1(t)^2+z1(t)*(y1(t)+1)+y1(t) = cos(z1(t))]](/view.aspx?sf=201067_post/74133da194002b845776ba995fd08a82.gif)
 | (37) |  
| ![icodes := [y1(0) = 0.]](/view.aspx?sf=201067_post/6fc3aa0c4da71e09227fac36d4a39c28.gif)
 | (38) |  
| ![icaes := [z1(0) = 0.]](/view.aspx?sf=201067_post/ac040d5e0d3b636dc4e1588f458fbf8e.gif)
 | (39) |  
| > | pars:=[mu=0.1,q=1000,tint=1,tf=4]; |  
| ![pars := [mu = .1, q = 1000, tint = 1, tf = 4]](/view.aspx?sf=201067_post/e4b53b048692a519a60e2199bb7e6ec7.gif)
 | (40) |  
| 
 | (41) |  
| > | ff:=subs(pars,1/2+1/2*tanh(q*(t-tint))); |  
| 
 | (42) |  
| > | NODE:=nops(eqode);NAE:=nops(eqae); |  
| 
 
 | (43) |  
| > | for XX from 1 to NODE doEQODE||XX:=lhs(eqode[XX])=rhs(eqode[XX])*ff:
 end do;
 |  
| 
 | (44) |  
| > | for XX from 1 to NAE doEQAE||XX:=subs(pars,-mu*(diff(rhs(eqae[XX])-lhs(eqae[XX]),t))=rhs(eqae[XX])-lhs(eqae[XX]));
 end do;
 |  
| 
 | (45) |  
| > | Dvars1:={seq(diff(z||x(t),t)=D||x,x=1..NAE)}; |  
| 
 | (46) |  
| > | Dvars2:={seq(rhs(Dvars1[x])=lhs(Dvars1[x]),x=1..NAE)}; |  
| 
 | (47) |  
| > | icsn:=seq(subs(y||x(0)=y||x(t),icodes[x]),x=1..NODE),seq(subs(z||x(0)=z||x(t),icaes[x]),x=1..NAE); |  
| 
 | (48) |  
| > | EQAEX||j:=subs(Dvars1,eqode,icsn,Dvars2,lhs(EQAE||j))=rhs(EQAE||j); |  
| 
 | (49) |  
| > | Sys:={seq(EQODE||x,x=1..NODE),seq(EQAEX||x,x=1..NAE),seq(icodes[x],x=1..NODE),seq(icaes[x],x=1..NAE)}; |  
| 
 | (50) |  
| > | sol:=dsolve(Sys,numeric): |  
| > | sol:=dsolve(Sys,numeric,stiff=true,implicit=true): |  
| > | for XX from 1 to NODE doa||XX:=odeplot(sol,[t,y||XX(t)],0..subs(pars,tf),color=red);
 end do:
 |  
| > | for XX from NODE+1 to NODE+NAE doa||XX:=odeplot(sol,[t,z||(XX-NODE)(t)],0..subs(pars,tf),color=blue);
 end do:
 |  
| > | display(seq(a||x,x=1..NODE+NAE),axes=boxed); |  End Example 3 Example 4 
| > | for i from 2 to N+1 do eq1[i]:=diff(y||i(t),t)=(y||(i+1)(t)-2*y||i(t)+y||(i-1)(t))/h^2-y||i(t)*(1+z||i(t));od: |  
| > | for i from 2 to N+1 do eq2[i]:=0=(z||(i+1)(t)-2*z||i(t)+z||(i-1)(t))/h^2-(1-y||i(t)^2)*(exp(-z||i(t)));od: |  
| > | eq1[1]:=(3*y1(t)-4*y2(t)+y3(t))/(2*h)=0: eq1[N+2]:=y||(N+2)(t)-1=0: |  
| > | eq2[1]:=(3*z1(t)-4*z2(t)+1*z3(t))/(2*h)=0: eq2[N+2]:=z||(N+2)(t)=0: |  
| > | eq1[1]:=subs(y1(t)=z||(N+3)(t),eq1[1]): |  
| > | eq1[N+2]:=subs(y||(N+2)(t)=z||(N+4)(t),eq1[N+2]): |  
| > | eqode:=[seq(subs(y1(t)=z||(N+3)(t),y||(N+2)(t)=z||(N+4)(t),eq1[i]),i=2..N+1)]: |  
| > | eqae:=[eq1[1],eq1[N+2],seq(eq2[i],i=1..N+2)]: |  
| > | icodes:=[seq(y||j(0)=1,j=2..N+1)]: |  
| > | icaes:=[seq(z||j(0)=0,j=1..N+2),z||(N+3)(0)=1,z||(N+4)(0)=1]: |  
| > | pars:=[mu=0.00001,q=1000,tint=1,tf=2]: |  
| > | ff:=subs(pars,1/2+1/2*tanh(q*(t-tint))): |  
| > | NODE:=nops(eqode):NAE:=nops(eqae): |  
| > | for XX from 1 to NODE do |  
| > | EQODE||XX:=lhs(eqode[XX])=rhs(eqode[XX])*ff: end do: |  
| > | for XX from 1 to NAE do |  
| > | EQAE||XX:=subs(pars,-mu*(diff(rhs(eqae[XX])-lhs(eqae[XX]),t))=rhs(eqae[XX])-lhs(eqae[XX])); end do: |  
| > | Dvars1:={seq(diff(z||x(t),t)=D||x,x=1..NAE)}: |  
| > | Dvars2:={seq(rhs(Dvars1[x])=lhs(Dvars1[x]),x=1..NAE)}: |  
| > | icsn:=seq(subs(y||x(0)=y||x(t),icodes[x]),x=1..NODE),seq(subs(z||x(0)=z||x(t),icaes[x]),x=1..NAE): |  
| > | EQAEX||j:=subs(Dvars1,eqode,icsn,Dvars2,lhs(EQAE||j))=rhs(EQAE||j): |  
| > | Sys:={seq(EQODE||x,x=1..NODE),seq(EQAEX||x,x=1..NAE),seq(icodes[x],x=1..NODE),seq(icaes[x],x=1..NAE)}: |  
| > | sol:=dsolve(Sys,numeric,maxfun=0): |  
| > | sol:=dsolve(Sys,numeric,stiff=true,implicit=true,maxfun=0): |  
| > | for XX from 1 to NODE do |  
| > | a||XX:=odeplot(sol,[t,y||(XX+1)(t)],1..subs(pars,tf),color=red): end do: |  
| > | for XX from NODE+1 to NODE+NAE do |  
| > | a||XX:=odeplot(sol,[t,z||(XX-NODE)(t)],1..subs(pars,tf),color=blue): end do: |  
| > | display(seq(a||x,x=1..NODE),a||(NODE+NAE-1),a||(NODE+NAE),axes=boxed); |  End of Example 4 Sometimes the parameters of the switch function and perturbation need to be tuned to obtain propoer convergence. Below is Example 1 shown for several cases using the 'parameters' option in Maple's dsolve to compare how tuning parameters affects the solution 
| > | eqode:=[diff(y1(t),t)=-y1(t)^2+z1(t)]: eqae:=[cos(y1(t))-z1(t)^0.5=0]: |  
| > | icodes:=[y1(0)=0.25]: icaes:=[z1(0)=0.8]: |  
| 
 | (51) |  
| > | ff:=subs(pars,1/2+1/2*tanh(q*(t-tint))): |  
| > | NODE:=nops(eqode):NAE:=nops(eqae): |  
| > | for XX from 1 to NODE doEQODE||XX:=lhs(eqode[XX])=rhs(eqode[XX])*ff:
 end do:
 |  
| > | for XX from 1 to NAE doEQAE||XX:=subs(pars,-mu*(diff(rhs(eqae[XX])-lhs(eqae[XX]),t))=rhs(eqae[XX])-lhs(eqae[XX]));
 end do:
 |  
| > | Dvars1:={seq(diff(z||x(t),t)=D||x,x=1..NAE)}: |  
| > | Dvars2:={seq(rhs(Dvars1[x])=lhs(Dvars1[x]),x=1..NAE)}: |  
| > | icsn:=seq(subs(y||x(0)=y||x(t),icodes[x]),x=1..NODE),seq(subs(z||x(0)=z||x(t),icaes[x]),x=1..NAE): |  
| > | EQAEX||j:=subs(Dvars1,eqode,icsn,Dvars2,lhs(EQAE||j))=rhs(EQAE||j): |  
| > | Sys:={seq(EQODE||x,x=1..NODE),seq(EQAEX||x,x=1..NAE),seq(icodes[x],x=1..NODE),seq(icaes[x],x=1..NAE)}: |  
| > | sol:=dsolve(Sys,numeric,'parameters'=[mu,q,tint],maxfun=0): |  
| > | sol:=dsolve(Sys,numeric,'parameters'=[mu,q,tint],stiff=true,implicit=true): |  
| > | sol('parameters'=[0.1,1000,1]): |  
| > | plot1:=odeplot(sol,[t-1,y1(t)],0..4,color=red):plot2:=odeplot(sol,[t-1,z1(t)],0..4,color=blue):
 |  
| > | sol('parameters'=[0.001,10,1]): |  
| > | plot3:=odeplot(sol,[t-1,y1(t)],0..4,color=red,linestyle=dot):plot4:=odeplot(sol,[t-1,z1(t)],0..4,color=blue,linestyle=dot):
 |  
| > | display(plot1,plot2,plot3,plot4,axes=boxed); |  In general, one has to decrease mu, and increase q and tint until convergence (example at t=3) 
| > | sol('parameters'=[0.001,10,1]):sol(3+1); |  
| ![[t = 4., y1(t) = .738587929442734, z1(t) = .546472878850096]](/view.aspx?sf=201067_post/683713388b6b8ad2b0e84df492a29b2b.gif)
 | (52) |  
| > | sol('parameters'=[0.0001,100,10]):sol(3+10); |  
| ![[t = 13., y1(t) = .738684397167344, z1(t) = .546618936273638]](/view.aspx?sf=201067_post/cf7f64a1498a36dedbe55e9f28b44dbf.gif)
 | (53) |  
| > | sol('parameters'=[0.00001,1000,20]):sol(3+20); |  
| ![[t = 23., y1(t) = .738694113087217, z1(t) = .546633473784526]](/view.aspx?sf=201067_post/bf2b0fcacddac4f64dab572707e10595.gif)
 | (54) |  The results have converged to 4 digits after the decimal. Of course, absolute and relative tolerances of the solvers can be modified if needed |