You are on page 1of 6

Methode d'euler

yn+1 = yn + h × f (yn , tn )

In [13]:

import numpy as np

import matplotlib.pylab as pl

def euler(f , y0 , a , b , n):

h = (b-a)/(n-1)

y = [y0]

t = np.linspace(a,b,n)

for i in range(1, n):

y.append(y[i-1] + h*f(y[i-1] , t[i-1]))

return y , t

''' test

y' = y

y(0) =1

'''

f = lambda y, t : y

n = 100

y , t = euler(f , 1 ,0,5,n)

err = np.linalg.norm(y - np.exp(t))

pl.plot(t , y , c='green' ,label='euler: '+str(err))

pl.plot(t , np.exp(t) , c='red' , label ='sol exacte')


pl.legend()

pl.xlim([0,1])

pl.ylim([1,2.8])

pl.show()

Methode d'euler modifié


h
k = yn + × f (yn , tn )
2
h
yn+1 = yn + h × f (k, tn + )
2
In [14]:

def euler_modif(f , y0 , a , b , n):

h = (b-a)/(n-1)

y = [y0]

t = np.linspace(a,b,n)

for i in range(1,n):

k = y[i-1] + h*0.5*f(y[i-1] , t[i-1])

y.append(y[i-1] + h*f(k , t[i-1] +h*0.5))

return y , t

f = lambda y, t : y

n = 100

y , t = euler_modif(f , 1 ,0,5,n)

err = np.linalg.norm(y - np.exp(t))

pl.plot(t , y , c='green' ,label='euler: '+str(err))

pl.plot(t , np.exp(t) , c='red' , label ='sol exacte')


pl.legend()

pl.show()

Methode de Heun

k 1 = f (yn , tn )

k 2 = f (yn + h × k 1 , tn + h)
h
yn+1 = yn + × (k 1 + k 2 )
2
In [15]:

def heun(F , y0 , a , b , n):

h = (b-a)/(n-1)

y = [y0]

t = np.linspace(a,b,n)

for i in range(1,n):

k1 = F(y[i-1] , t[i-1])

k2 = F( y[i-1] + h * k1 , t[i-1] + h)

y.append(y[i-1] + h*0.5*(k1 + k2))

return y , t

f = lambda y, t : y

n = 200

y , t = heun(f , 1 ,0,5,n)

err = np.linalg.norm(y - np.exp(t))

pl.plot(t , y , c='green' ,label='heun: '+str(err))

pl.plot(t , np.exp(t) , c='red' , label ='sol exacte')


pl.legend()

pl.show()

Methode de range Kutta

k 1 = f (yn , tn )
k1 h
k 2 = f (yn + , tn + )
2 2
k2 h
k 3 = f (yn + , tn + )
2 2

k 4 = f (yn + k 3 , tn )
h
yn+1 = yn + × (k 1 + 2(k 2 + k 3 ) + k 4 )
6
In [8]:

def rangeKutta(F , y0 , a , b , n):

h = (b-a)/(n-1)

y = [y0]

t = np.linspace(a,b,n)

for i in range(1,n):

k1 = h * F(y[i-1] , t[i-1])

k2 = h * F( y[i-1] + k1/2 ,t[i-1] + h/2)

k3 = h * F(y[i-1] + k2/2, t[i-1] + h/2 )

k4 = h * F( y[i-1] + k3 , t[i-1])

y.append(y[i-1] + (1/6) * (k1 + 2*(k2 + k3) + k4))

return y , t

f = lambda y, t : y

n = 200

y , t = rangeKutta(f , 1 ,0,5,n)

err = np.linalg.norm(y - np.exp(t))

pl.plot(t , y , c='green' ,label='kutta: '+str(err))

pl.plot(t , np.exp(t) , c='red' , label ='sol exacte')


pl.legend()

pl.show()

In [16]:

import scipy

import scipy.integrate

f = lambda y , t : np.sin(t*y)

n = 60

y , t =euler(f , 0.01 , 0 , 1,n)

y1 , t1 =euler_modif(f , 0.01 , 0 , 1,n)

y2 , t2 =heun(f , 0.01 , 0 , 1,n)

y3 , t3 =rangeKutta(f , 0.01 , 0 , 1,n)

y4 =scipy.integrate.odeint(f , 0.01 , t)

pl.plot( np.linspace(0,1,n), y4, label='euler')

pl.plot( t, y1 , label='euler_modif')

pl.plot( t, y2 , label='HEUN')

pl.plot( t, y3 , label='RANGE KUTTA')

pl.plot( t, y4 , label='ODEINT')

pl.legend()

pl.show()

Cas d'une equation d'ordre 2

Exemple : Equation d'une pendule : y" = sin(y)


In [25]:

import numpy as np

import scipy

from scipy.integrate import odeint

import matplotlib.pylab as pl

def euler_2D(f , y0 , yp0 , a , b , n=1000):

yy,t = euler(f,np.array([y0,yp0]),a,b,n )

return np.array([e[0] for e in yy]),t

f = lambda y , t : np.array([y[1] , -np.sin(y[0])])

y1 , t = euler_2D(f , 0.01 , 0 , 0 , 40)

y2 = scipy.integrate.odeint(f , [0.01,0], t)

pl.plot(t , y1, label='Euler 2D')

pl.plot(t , y2[:,0] , label='odeint')

pl.title("Pendule : y\" = -sin(y)")

pl.legend()

pl.show()

You might also like