# -*- coding: utf-8 -*-
"""
Created on Wed Mar 18 15:32:35 2015

@author: Roupoil
"""

def decoupage(t0,tf,n):
    h=(tf-t0)/float(n)
    return [t0+i*h for i in range(n+1)]

import matplotlib.pyplot as plt

t1=decoupage(0,2,10)
y1=[exp(i*i) for i in t1]
t2=decoupage(0,2,100)
y2=[exp(i*i) for i in t2]
t3=decoupage(0,2,1000)
y3=[exp(i*i) for i in t3]
plt.plot(t1,y1)
plt.plot(t2,y2)
plt.plot(t3,y3)

def F(t,y):
    return 2*t*y

def Euler(F,y0,t0,tf,n):
    y,t=y0,t0
    temps,ordonnee=[t0],[y0]
    h=(tf-t0)/float(n)
    for i in range(n):
        y=y+h*F(t,y)
        t=t+h
        temps.append(t)
        ordonnee.append(y)
    return ordonnee
   
euler1=Euler(F,1,0,2,10)
plt.plot(t1,euler1)
euler2=Euler(F,1,0,2,100)
plt.plot(t2,euler2)
euler3=Euler(F,1,0,2,1000)
plt.plot(t3,euler3)

def Heun(F,y0,t0,tf,n):
    y,t=y0,t0
    temps,ordonnee=[t0],[y0]
    h=(tf-t0)/float(n)
    for i in range(n):
        y=y+h/2*(F(t,y)+F(t+h,y+h*F(t,y)))
        t=t+h
        temps.append(t)
        ordonnee.append(y)
    return ordonnee
    
def RK4(F,y0,t0,tf,n):
    y,t=y0,t0
    temps,ordonnee=[t0],[y0]
    h=(tf-t0)/float(n)
    for i in range(n):
        a=y+h/2*F(t,y)
        b=y+h/2*F(t+h/2,a)
        c=y+h*F(t+h/2,b)
        y=y+h/6*(F(t,y)+2*F(t+h/2,a)+2*F(t+h/2,b)+F(t+h,c))
        t=t+h
        temps.append(t)
        ordonnee.append(y)
    return ordonnee

heun=Heun(F,1,0,2,100)
plt.plot(t2,heun)

rk=RK4(F,1,0,2,100)
plt.plot(t2,rk)

