Euler:= proc(f, ic:list, x1, h)
            local xn, yn, ii;
            xn:= op(1, ic):
            yn:= op(2, ic): 
            for ii from 1 to round((x1-xn)/h) do 
               yn:= evalf(yn + h * f(xn,yn));
               xn:= xn + h      
               od:           
            yn;
            end;

ImpEuler:= proc(f, ic: list, x1, h)
            local xn, yn, m, ii;
            xn:= op(1, ic):
            yn:= op(2, ic): 
            for ii from 1 to round((x1-xn)/h) do 
               m:= f(xn, yn);
               xn:= xn + h;
               yn:= evalf(yn + h/2 * (m + f(xn,yn+h*m)));
               od:           
            yn;
            end;

RungeKutta:= proc(f, ic: list, x1, h)
            local xn, yn, m1, m2, m3, m4, ii;
            xn:= op(1, ic):
            yn:= op(2, ic): 
            for ii from 1 to round((x1-xn)/h) do 
               m1:= evalf(f(xn, yn));
               m2:= evalf(f(xn + h/2, yn + h/2*m1));
               m3:= evalf(f(xn + h/2, yn + h/2*m2));
               xn:= xn + h;
               m4:= evalf(f(xn, yn + h*m3));
               yn:= evalf(yn + h/6 * (m1 + 2*(m2+m3) + m4));
               od:           
            yn;
            end;
