• Aucun résultat trouvé

M62_CM4 : schémas"classiques" à un pas

N/A
N/A
Protected

Academic year: 2021

Partager "M62_CM4 : schémas"classiques" à un pas"

Copied!
10
0
0

Texte intégral

(1)

In [1]:

M62_CM4 : schémas

"classiques" à un pas

Considérons le problème de Cauchy

trouver une fonction définie sur un intervalle telle que

avec une valeur donnée et supposons que l'on ait montré l'existence et l'unicité d'une solution pour .

Pour soit avec une suite de

nœuds de induisant une discrétisation de en sous- intervalles chacun de longueur (appelé le pas de discrétisation).

Pour chaque nœud , on cherche la valeur inconnue qui approche la

valeur exacte .

L'ensemble de valeurs

représente les points de la discrétisation.

L'ensemble de valeurs représente la

solution exacte.

L'ensemble de valeurs représente la

solution numérique. Cette solution approchée sera obtenue en construisant une suite récurrente.

Les schémas qu'on va construire permettent de calculer (explicitement ou implicitement) à partir de et il est donc possible de calculer successivement , ,..., en partant de par une formule de récurrence de la forme

y: I ⊂ ℝ → ℝ I = [ , T] t

0

{ y

(t) = φ(t, y(t)), y( ) = , t

0

y

0

∀t ∈ I = [ , T], t

0

y

0

y t ∈ I

h > 0 t

n

≡ + nh t

0

n = 0, 1, 2, … , N

h

+ 1

N

h

I I N

h

= [ ; ]

I

n

t

n

t

n+1

h > 0

t

n

u

n

≡ y( ) y

n

t

n

+ 1

N

h

{ , = + h, … , t

0

t

1

t

0

t

Nh

= T}

+ 1

N

h

{ , , … , y

0

y

1

y

Nh

} + 1

N

h

{ = , , … , u

0

y

0

u

1

u

Nh

}

u

n+1

u

n

, u

n−1

, . . . , u

n−k

u

1

u

2

u

0

{ u

0

= , y

0

= Φ( , , , … , ),

u u u u u ∀n ∈ ℕ.

Out[1]:

from IPython.core.display import HTML css_file = './custom.css'

HTML(open(css_file, "r").read())

(2)

Méthodes explicites et méthodes implicites

Une méthode est dite explicite si la valeur peut être calculée directement à l'aide des valeurs précédentes , (ou d'une partie d'entre elles).

Une méthode est dite implicite si n'est défini que par une relation implicite faisant intervenir la fonction .

Méthodes à un pas et méthodes multi-pas

Une méthode numérique pour l'approximation du problème de Cauchy est dite à un pas si pour tout , ne dépend que de et

éventuellement de lui-même.

Autrement, on dit que le schéma est une méthode multi-pas (ou à pas multiples).

u

n+1

u

k

k ≤ n u

n+1

φ

n ∈ ℕ u

n+1

u

n

Table of Contents

 1 Construction de schémas à un pas 1.1 Schéma d'Euler explicite 1.2 Schéma d'Euler implicite 1.3 Schéma d'Euler modifié

1.4 Schéma du trapèze ou de Crank-Nicolson 1.5 Schéma de Heun

1.6 Schéma de Simpson implicite 1.7 Schéma de Simpson explicite

1.8 Schéma de Simpson explicite-variante 1.9 Remarques

Si nous intégrons l'EDO entre et nous obtenons

On peut construire différentes schémas selon la formule d'approximation utilisée pour approcher le membre de droite. Cette solution approchée sera obtenue en construisant une suite récurrente comme suit:

1  Construction de schémas à un pas

(t) = φ(t, y(t))

y

t

n

t

n+1

− = φ(t, y(t))dt.

y

n+1

y

n

tn+1

tn

 

= , u

0

y

0

= + un polynôme d'interpolation de φ(t, u)dt.

u

n+1

u

n

tn+1

tn

Si on remplace une fonction par une constante égale à la valeur de en la borne gauche de l'intervalle (polynôme qui interpole en le point

et donc de degré ), on a

1.1  Schéma d'Euler explicite

f f

[a; b] f

(a, f (a)) 0

(3)

Cette formule est dite formule de quadrature du rectangle à gauche.

En utilisant cette formule pour approcher la fonction on a

et on obtient le schéma d'Euler progressif

Il s'agit d'un schéma à 1 pas explicite car il permet d'expliciter en fonction de .

f ̃  (x) f (x)dx

b a

= f (a)

≈ ∫ (x)dx = (b − a)f (a).

b a

f ̃ 

t ↦ φ(t, y(t)) φ(t, y(t))dt ≈ hφ( , y( ))

tn+1

tn

t

n

t

n

{ u

0

= y( ) = , t

0

y

0

= + hφ( , )

u

n+1

u

n

t

n

u

n

n = 0, 1, 2, … N

h

− 1 u

n+1

u

n

In [2]:

Si on remplace une fonction par une constante égale à la valeur de en la borne droite de l'intervalle (polynôme qui interpole en le point

et donc de degré ), on a

Cette formule est dite formule de quadrature du rectangle à droite.

En utilisant cette formule pour approcher la fonction on a

et on obtient le schéma d'Euler rétrograde

Il s'agit d'un schéma à 1 pas implicite car il ne permet pas d'expliciter directement en fonction de lorsque la fonction n'est pas triviale.

Pour calculer il faudra utiliser un schéma pour le calcul du zéro d'une fonction quelconque.

1.2  Schéma d'Euler implicite

f f

[a; b] f

(b, f (b)) 0

(x) f ̃  f (x)dx

b a

= f (a)

≈ ∫ (x)dx = (b − a)f (b).

b a

f ̃ 

t ↦ φ(t, y(t)) φ(t, y(t))dt ≈ hφ( , y( ))

tn+1

tn

t

n+1

t

n+1

{ u

0

= y( ) = , t

0

y

0

= + hφ( , )

u

n+1

u

n

t

n+1

u

n+1

n = 0, 1, 2, … N

h

− 1

u

n+1

u

n

φ

u

n+1

def euler_progressif(phi,tt):

h=tt[1]-tt[0]

uu = [y0]

for i in range(len(tt)-1):

uu.append(uu[i]+h*phi(tt[i],uu[i])) return uu

(4)

In [3]:

Si on remplace une fonction par une constante égale à la valeur de au milieu de l'intervalle (polynôme qui interpole en le point

et donc de degré ), on a

Cette formule est dite formule de quadrature du rectangle ou du point milieu.

En utilisant cette formule pour approcher la fonction on a

et on obtient

où est une approximation de . Nous pouvons utiliser une prédiction d'Euler progressive sur un demi-pas pour approcher le

dans le terme par

. Nous avons construit ainsi un nouveau schéma appelé schéma d'Euler modifié qui s'écrit

Il s'agit d'un schéma à 1 pas explicite car il permet d'expliciter en fonction de .

1.3  Schéma d'Euler modifié

f f

[a; b] f

(

a+b2

, f (

a+b

))

2

0

(x) f ̃  f (x)dx

b a

= f (

a+b2

)

≈ ∫ (x)dx = (b − a)f ( ) .

b

a

f ̃ 

a+b2

t ↦ φ(t, y(t)) φ(t, y(t))dt ≈ hφ ( + , y ( + ))

tn+1

tn

t

n

h

2 t

n

h 2

{

= y( ) = , u

0

t

0

y

0

= + hφ ( + , )

u

n+1

u

n

t

n h

2

u

n+1/2

n = 0, 1, 2, … N

h

− 1

u

n+1/2

y( + h/2) t

n

u

n+1/2

φ( + h/2, t

n

u

n+1/2

)

= + (h/2)φ( , ) ũ 

n+1/2

u

n

t

n

u

n

 

= y( ) = , u

0

t

0

y

0

= + (h/2)φ( , ), ũ 

n+1/2

u

n

t

n

u

n

= + hφ ( + , )

u

n+1

u

n

t

n h

2

ũ 

n+1/2

n = 0, 1, 2, … N

h

− 1 u

n+1

u

n

File "<ipython-input-3-23235508af11>", line 1 def euler_regressif(phi,tt)

^ SyntaxError: invalid syntax def euler_regressif(phi,tt) h = tt[1]-tt[0]:

uu = [y0]

for i in range(len(tt)-1):

uu.append( fsolve(lambda x: -x+uu[i]+h*phi(tt[i+1],x), return uu

(5)

In [4]:

Si on remplace une fonction par le segment qui relie à (polynôme qui interpole en les points et et donc de degré ), on a

Cette formule est dite formule de quadrature du trapèze.

En utilisant cette formule pour approcher la fonction on a

et on obtient le schéma du trapèze ou de Crank-Nicolson

Il s'agit à nouveau d'un schéma à 1 pas implicite car il ne permet pas d'expliciter directement en fonction de lorsque la fonction n'est pas triviale. En fait, ce schéma fait la moyenne des schémas d'Euler progressif et rétrograde.

1.4  Schéma du trapèze ou de Crank-Nicolson

f (a, f (a)) (b, f (b)) f (a, f (a)) (b, f (b))

1

(x) f ̃  f (x)dx

b a

=

f(b)−f(a)b−a

(x − a) + f (a)

≈ ∫ (x)dx = (f (a) + f (b)) .

b

a

f ̃  b − a 2

t ↦ φ(t, y(t)) φ(t, y(t))dt ≈ (φ( , y( )) + φ( , y( )))

tn+1

tn

h

2 t

n

t

n

t

n+1

t

n+1

{ u

0

= y( ) = , t

0

y

0

= + φ( , ) + φ( , )

u

n+1

u

n h

2

t

n

u

n h

2

t

n+1

u

n+1

n = 0, 1, 2, … N

h

− 1

u

n+1

u

n

φ

In [5]:

Pour éviter le calcul implicite de dans le schéma du trapèze, nous pouvons utiliser une prédiction d'Euler progressive et remplacer le

dans le terme par . Nous avons

construit ainsi un nouveau schéma appelé schéma de Heun. Plus précisément, la méthode de Heun s'écrit

1.5  Schéma de Heun

u

n+1

u

n+1

φ( t

n+1

, u

n+1

) ũ 

n+1

= u

n

+ hφ( , ) t

n

u

n def euler_modifie(phi,tt):

h=tt[1]-tt[0]

uu = [y0]

for i in range(len(tt)-1):

uu.append( uu[i]+h*phi(tt[i]+h/2.,uu[i]+0.5*h*phi(tt[i]

return uu

def CN(phi,tt):

h=tt[1]-tt[0]

uu = [y0]

for i in range(len(tt)-1):

uu.append( fsolve(lambda x: -x+uu[i]+0.5*h*( phi(tt[i]

return uu

(6)

Il s'agit à nouveau d'un schéma à 1 pas explicite.

 

= y( ) = , u

0

t

0

y

0

= + hφ( , ), ũ 

n+1

u

n

t

n

u

n

= + φ( , ) + φ( , )

u

n+1

u

n h

2

t

n

u

n h

2

t

n+1

ũ 

n+1

n = 0, 1, 2, … N

h

− 1

In [6]:

Si on remplace une fonction par la parabole segment qui passe par , et (polynôme qui interpole en les

points , et et donc de degré ), on a

Cette formule est dite formule de Simpson.

En utilisant cette formule pour approcher la fonction on a

et on obtient

où est une approximation de . Nous pouvons utiliser une prédiction d'Euler progressive sur un demi-pas pour approcher le

dans le terme par

. Nous avons construit ainsi un nouveau schéma qu'on appellera schéma de Simpson implicite qui s'écrit

Il s'agit d'un schéma à 1 pas implicite car il ne permet pas d'expliciter en fonction de .

1.6  Schéma de Simpson implicite

(a, f (a)) (b, f (b)) (

a+b2

, f ( f

a+b2

)) f (a, f (a)) (b, f (b)) (

a+b2

, f (

a+b

))

2

2

(x) f ̃ 

f (x)dx

b a

= f (a) (x − b) (x −

a+b2

) + f ( ) (a − b) (a −

a+b2

)

a+b2

(x − a)(x − b) (

a+b2

− a) (

a+b2

− b

≈ ∫ (x)dx = (f (a) + 4f ( ) + f (b)) .

b

a

f ̃  h

6

a+b2

t ↦ φ(t, y(t))

φ(t, y(t))dt ≈ (φ( , y( )) + 4φ ( + , y ( + )) + φ

tn+1

tn

h

6 t

n

t

n

t

n

h

2 t

n

h 2

{

= y( ) = , u

0

t

0

y

0

= + (φ( , ) + 4φ ( + , ) + φ( , )) u

n+1

u

n h

6

t

n

u

n

t

n h

2

u

n+1/2

t

n+1

u

n+1

u

n+1/2

y( + h/2) t

n

u

n+1/2

φ( + h/2, t

n

u

n+1/2

)

= + (h/2)φ( , ) ũ 

n+1/2

u

n

t

n

u

n

 

= y( ) = , u

0

t

0

y

0

= + (h/2)φ( , ), ũ 

n+1/2

u

n

t

n

u

n

= + (φ( , ) + 4φ ( + , ) + φ( , )) u

n+1

u

n h

6

t

n

u

n

t

n h

2

ũ 

n+1/2

t

n+1

u

n+1

n u

n+1

u

n def heun(phi,tt):

h=tt[1]-tt[0]

uu = [y0]

for i in range(len(tt)-1):

k1 = phi( tt[i], uu[i] )

k2 = phi( tt[i+1], uu[i] + k1 ) uu.append( uu[i] + 0.5*h*(k1+k2) ) return uu

(7)

Pour éviter le calcul implicite de dans le schéma de Simpson implicite, nous pouvons utiliser une prédiction d'Euler progressive et remplacer le dans le terme par

. Nous avons construit ainsi un nouveau schéma qu'on appellera schéma de Simpson explicite et qui s'écrit

Il s'agit à nouveau d'un schéma à 1 pas explicite.

Notons qu'on aurait pu remplacer le dans le terme par une approximation utilisant comme par exemple une prédiction d'Euler progressive à partir de , ce qui donne

:

1.7  Schéma de Simpson explicite u

n+1

u

n+1

φ( t

n+1

, u

n+1

)

= + hφ( , )

n+1

u

n

t

n

u

n

 

 

= y( ) = , u

0

t

0

y

0

= + φ( , ), ũ 

n+1/2

u

n h

2

t

n

u

n

= + hφ( , ),

n+1

u

n

t

n

u

n

= + (φ( , ) + 4φ ( + , ) + φ( , )) u

n+1

u

n h

6

t

n

u

n

t

n h

2

ũ 

n+1/2

t

n+1

n+1

n 1.8  Schéma de Simpson explicite-variante

u

n+1

φ( t

n+1

, u

n+1

) ũ 

n+1/2

+ h/2 t

n

= + φ( + h/2, )

û 

n+1

ũ 

n+1/2 h

2

t

n

ũ 

n+1/2

 

 

= y( ) = , u

0

t

0

y

0

= + φ( , ), ũ 

n+1/2

u

n h

2

t

n

u

n

= + φ( + h/2, ),

û 

n+1

ũ 

n+1/2 h

2

t

n

ũ 

n+1/2

= + (φ( , ) + 4φ ( + , ) + φ( , )) u

n+1

u

n h

6

t

n

u

n

t

n h

2

ũ 

n+1/2

t

n+1

û 

n+1

n

La méthode d'Euler explicite construit la suite

par conséquent pour tout . La méthode d'Euler explicite approche la solution constante pour tout .

La méthode d'Euler implicite construit la suite

par conséquent mais dépend de la méthode de résolution de l'équation implicite . Bien sur est une solution mais

est aussi solution. Si le schéma choisit , alors pour tout .

Notons que le problème de Cauchy avec une CI admet une et une seule solution, la fonction . Dans ce cas, les deux schémas approchent forcement la même solution.

{ u

0

= y

0

= 0,

= + hφ( , ) = + h ,

u

n+1

u

n

t

n

u

n

u

n

u

1/2n

n = 0, 1, 2, … N

h

− 1

= 0

u

n

n

y(t) = t ∈ ℝ

+

{ u

0

= y

0

= 0,

= + hφ( , ) = + h ,

u

n+1

u

n

t

n+1

u

n+1

u

n

u

1/2n+1

n = 0, 1, 2, … N

h

− 1

= 0

u

0

u

1

x = 0 + h x⎯⎯x = 0

x = h

2

u

1

= h

2

u

n

> 0

n ∈ ℕ

y(0) = y

0

> 0

y(t) = (t − 2

14

√ ) y ⎯ ⎯ ⎯⎯

0 2

(8)

1. À première vue, il semble que le schéma d'Euler progressif et le schéma de Heun soient préférable au schéma d'Euler rétrograde et de Crank-Nicolson puisque ces derniers ne sont pas explicites.

Cependant, on verra que les méthodes d'Euler implicite et de Crank- Nicolson sont inconditionnellement A-stables. C'est aussi le cas de nombreuses autres méthodes implicites. Cette propriété rend les méthodes implicites attractives, bien qu'elles soient plus coûteuses que les méthodes explicites.

2. Pour la mise en application d'un schéma il faut aussi prendre en compte l'influence des erreurs d'arrondi. En effet, afin de minimiser l'erreur globale théorique, on pourrait être tenté d'appliquer une méthode avec un pas très petit, par exemple de l'ordre de , mais ce faisant, outre que le temps de calcul deviendrait irréaliste, très rapidement les erreurs d'arrondi feraient diverger la solution approchée. En pratique il faut prendre assez petit pour que la méthode converge assez rapidement, mais pas trop petit non plus pour que les erreurs d'arrondi ne donnent pas lieu à des résultats incohérent et pour que les calculs puissent être effectués en un temps raisonnable.

3. Pour vérifier nos calculs d'interpolation puis intégration, nous pouvons utiliser le package de calcul formel SymPy :

1.9  Remarques

10

−16

h

(9)

In [7]:

EE:

EI:

Point Milieu :

CN:

n

np1

npm

import sympy as symb symb.init_printing()

symb.var('phi_np1,phi_n,phi_npm,') symb.var('h,t,t_n')

t_np1=t_n+h t_npm=t_n+h/2

p=symb.interpolate([(t_n,phi_n)], t)

EE=(symb.integrate(p,(t,t_n,t_np1)).simplify()) print("EE:")

display(EE) print("\n")

p=symb.interpolate([(t_np1,phi_np1)], t)

EI=(symb.integrate(p,(t,t_n,t_np1)).simplify()) print("EI:")

display(EI) print("\n")

p=symb.interpolate([(t_npm,phi_npm)], t)

PM=(symb.integrate(p,(t,t_n,t_np1)).simplify()) print("Point Milieu :")

display(PM) print("\n")

p=symb.interpolate([(t_np1,phi_np1),(t_n,phi_n)], t) CN=(symb.integrate(p,(t,t_n,t_np1)).simplify()) print("CN:")

display(CN) print("\n")

p=symb.interpolate([(t_np1,phi_np1),(t_npm,phi_npm),(t_n,phi_n SI=(symb.integrate(p,(t,t_n,t_np1)).simplify())

print("Simpson:") display(SI)

print("\n")

(10)

In [ ]:

Simpson:

( + ) h

2 ϕn ϕnp1

( + + 4 ) h

6 ϕn ϕnp1 ϕnpm

Références

Documents relatifs

En 2013-2014, le Projet pour l’Acquisition de Compétences par les élèves en Mathématiques (Pacem) a réuni 12 circonscriptions à dominante rurale de l’académie,

Pour que l’état soit véridique la scène en question doit être effective, c’est-à-dire qu’elle doit se dérouler dans la réalité, mais la réalité dont il est question

Tracer l'évolution de f k ex au cours du temps, en partant de conditions initiales variées (données aléatoire, Dirac, fonction indicatrice, etc.)3. Même question pour la méthode

Il ne s’agit pas, dans ce mouvement, de se situer en jouant d’oppositions dichotomiques propres aux articulations explicites du champ politique (droite/gauche,

Nous allons chercher, dans les pages qui suivent, à développer l’idée d’une pensée dont le support est un collectif, mais une telle entreprise impose au préalable de décanter

(4) In the following lines we introduce a semi-implicit scheme on staggered grids for the model (1) and study its stability in the sense of numerical control of the total energy

Pourtant, comme nous avons essayé de le montrer en suivant le parcours de Keynes, de la critique de la théorie quantitative, dans le cadre de la théorie monétaire des

Cette méthode converge vers la solution d’une méthode éléments finis classique avec un coût de maillage nul et un temps de formation des matrices élémentaires modérés.