load("Eulix.mac")$
load("rkf45.mac")$

/* This is a 1-d example
   For small (positive) alpha, the solution is very sensitive to errors
   in the initial value or discetization errors.
   It has a peek at t=0 : (1/alpha)^2 and it is stiff near t = 0 (lambda=-2*t/alpha^2)
   y'(t)= -2*t*y(t)^2      y(-1)= 1/(1+alpha)   e.g. alpha= 0.1
*/

debugmode:true$
solution(t,t0,y0):= block([C:1/y0-t0*t0],1/(t^2+C));
alpha:0.1$
timer(rkf45,Eulix)$
print("rkf45 errors:")$
RR:rkf45(-2*t*y^2,y,1/(1+alpha),[t,-1,1])$
for i:1 thru length(RR) do block([ty:RR[i],t,y],
  t:first(ty),y:second(ty),
  printf(true,"at t= ~7,4f  err= ~10,3e~%",t,(y-solution(t,-1,1/(1+alpha))))
);

print("Eulix errors:")$
ER: Eulix(-2*t*y^2,y,[1/(1+alpha)],[t,-1,1],logging=true)$
for i:1 thru length(ER) do block([ty:ER[i],t,y],
  t:first(ty),y:second(ty),
  printf(true,"at t= ~7,4f  err= ~10,3e~%",t,(y-solution(t,-1,1/(1+alpha))))
);
timer_info();  /* rkf45: 0.041 sec   Eulix: 0.898 sec */


