Un projet en C++ - LUTH - Observatoire de Paris
Un projet en C++ - LUTH - Observatoire de Paris
Un projet en C++ - LUTH - Observatoire de Paris
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
<strong>Un</strong> <strong>projet</strong> <strong>en</strong> <strong>C++</strong>:<br />
résolution d’équations<br />
différ<strong>en</strong>tielles linéaires.<br />
Jérôme Novak<br />
Jerome.Novak@obspm.fr<br />
http://luth.obspm.fr/minisite.php?nom=Novak<br />
Laboratoire <strong>Un</strong>ivers et Théories (<strong>LUTH</strong>)<br />
CNRS / <strong>Observatoire</strong> <strong>de</strong> <strong>Paris</strong> / <strong>Un</strong>iversité <strong>Paris</strong> Di<strong>de</strong>rot<br />
Master 2 e année recherche, Septembre 2011
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Outline<br />
1 Introduction : représ<strong>en</strong>tation <strong>de</strong>s fonctions<br />
2 Transformée <strong>de</strong> Tchebychev, dérivée<br />
3 Résolution d’équations différ<strong>en</strong>tielles
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Outline<br />
1 Introduction : représ<strong>en</strong>tation <strong>de</strong>s fonctions<br />
2 Transformée <strong>de</strong> Tchebychev, dérivée<br />
3 Résolution d’équations différ<strong>en</strong>tielles
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Outline<br />
1 Introduction : représ<strong>en</strong>tation <strong>de</strong>s fonctions<br />
2 Transformée <strong>de</strong> Tchebychev, dérivée<br />
3 Résolution d’équations différ<strong>en</strong>tielles
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Introduction :<br />
Représ<strong>en</strong>tation <strong>de</strong>s fonctions
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Fonctions sur un ordinateur<br />
Approche simplifiée<br />
Comm<strong>en</strong>t représ<strong>en</strong>ter une fonction sur un ordinateur ?<br />
⇒un ordinateur ne sait gérer que <strong>de</strong>s <strong>en</strong>tiers<br />
Afin <strong>de</strong> représ<strong>en</strong>ter une fonctions φ(x) (par ex. interpoler), on<br />
peut utiliser :<br />
un <strong>en</strong>semble fini <strong>de</strong> ses valeurs {φi} i=0...N sur une grille<br />
{xi} i=0...N ,<br />
un <strong>en</strong>semble fini <strong>de</strong> ses coeffici<strong>en</strong>ts sur une base <strong>de</strong><br />
fonctions φ(x) N<br />
i=0 ciΨi(x).<br />
Afin <strong>de</strong> manipuler une fonction (par ex. dériver), chaque<br />
métho<strong>de</strong> s’appar<strong>en</strong>te :<br />
aux différ<strong>en</strong>ces finies<br />
φ ′ (xi) φ(xi+1) − φ(xi)<br />
xi+1 − xi<br />
aux métho<strong>de</strong>s spectrales<br />
φ ′ (x) <br />
N<br />
ciΨ ′ i(x)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Fonctions sur un ordinateur<br />
Approche simplifiée<br />
Comm<strong>en</strong>t représ<strong>en</strong>ter une fonction sur un ordinateur ?<br />
⇒un ordinateur ne sait gérer que <strong>de</strong>s <strong>en</strong>tiers<br />
Afin <strong>de</strong> représ<strong>en</strong>ter une fonctions φ(x) (par ex. interpoler), on<br />
peut utiliser :<br />
un <strong>en</strong>semble fini <strong>de</strong> ses valeurs {φi} i=0...N sur une grille<br />
{xi} i=0...N ,<br />
un <strong>en</strong>semble fini <strong>de</strong> ses coeffici<strong>en</strong>ts sur une base <strong>de</strong><br />
fonctions φ(x) N<br />
i=0 ciΨi(x).<br />
Afin <strong>de</strong> manipuler une fonction (par ex. dériver), chaque<br />
métho<strong>de</strong> s’appar<strong>en</strong>te :<br />
aux différ<strong>en</strong>ces finies<br />
φ ′ (xi) φ(xi+1) − φ(xi)<br />
xi+1 − xi<br />
aux métho<strong>de</strong>s spectrales<br />
φ ′ (x) <br />
N<br />
ciΨ ′ i(x)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Fonctions sur un ordinateur<br />
Approche simplifiée<br />
Comm<strong>en</strong>t représ<strong>en</strong>ter une fonction sur un ordinateur ?<br />
⇒un ordinateur ne sait gérer que <strong>de</strong>s <strong>en</strong>tiers<br />
Afin <strong>de</strong> représ<strong>en</strong>ter une fonctions φ(x) (par ex. interpoler), on<br />
peut utiliser :<br />
un <strong>en</strong>semble fini <strong>de</strong> ses valeurs {φi} i=0...N sur une grille<br />
{xi} i=0...N ,<br />
un <strong>en</strong>semble fini <strong>de</strong> ses coeffici<strong>en</strong>ts sur une base <strong>de</strong><br />
fonctions φ(x) N<br />
i=0 ciΨi(x).<br />
Afin <strong>de</strong> manipuler une fonction (par ex. dériver), chaque<br />
métho<strong>de</strong> s’appar<strong>en</strong>te :<br />
aux différ<strong>en</strong>ces finies<br />
φ ′ (xi) φ(xi+1) − φ(xi)<br />
xi+1 − xi<br />
aux métho<strong>de</strong>s spectrales<br />
φ ′ (x) <br />
N<br />
ciΨ ′ i(x)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Fonctions sur un ordinateur<br />
Approche simplifiée<br />
Comm<strong>en</strong>t représ<strong>en</strong>ter une fonction sur un ordinateur ?<br />
⇒un ordinateur ne sait gérer que <strong>de</strong>s <strong>en</strong>tiers<br />
Afin <strong>de</strong> représ<strong>en</strong>ter une fonctions φ(x) (par ex. interpoler), on<br />
peut utiliser :<br />
un <strong>en</strong>semble fini <strong>de</strong> ses valeurs {φi} i=0...N sur une grille<br />
{xi} i=0...N ,<br />
un <strong>en</strong>semble fini <strong>de</strong> ses coeffici<strong>en</strong>ts sur une base <strong>de</strong><br />
fonctions φ(x) N<br />
i=0 ciΨi(x).<br />
Afin <strong>de</strong> manipuler une fonction (par ex. dériver), chaque<br />
métho<strong>de</strong> s’appar<strong>en</strong>te :<br />
aux différ<strong>en</strong>ces finies<br />
φ ′ (xi) φ(xi+1) − φ(xi)<br />
xi+1 − xi<br />
aux métho<strong>de</strong>s spectrales<br />
φ ′ (x) <br />
N<br />
ciΨ ′ i(x)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Fonctions sur un ordinateur<br />
Approche simplifiée<br />
Comm<strong>en</strong>t représ<strong>en</strong>ter une fonction sur un ordinateur ?<br />
⇒un ordinateur ne sait gérer que <strong>de</strong>s <strong>en</strong>tiers<br />
Afin <strong>de</strong> représ<strong>en</strong>ter une fonctions φ(x) (par ex. interpoler), on<br />
peut utiliser :<br />
un <strong>en</strong>semble fini <strong>de</strong> ses valeurs {φi} i=0...N sur une grille<br />
{xi} i=0...N ,<br />
un <strong>en</strong>semble fini <strong>de</strong> ses coeffici<strong>en</strong>ts sur une base <strong>de</strong><br />
fonctions φ(x) N<br />
i=0 ciΨi(x).<br />
Afin <strong>de</strong> manipuler une fonction (par ex. dériver), chaque<br />
métho<strong>de</strong> s’appar<strong>en</strong>te :<br />
aux différ<strong>en</strong>ces finies<br />
φ ′ (xi) φ(xi+1) − φ(xi)<br />
xi+1 − xi<br />
aux métho<strong>de</strong>s spectrales<br />
φ ′ (x) <br />
N<br />
ciΨ ′ i(x)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong>s séries <strong>de</strong> Fourier<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψ2k = cos(kx), Ψ2k+1 = sin(kx)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong>s séries <strong>de</strong> Fourier<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψ2k = cos(kx), Ψ2k+1 = sin(kx)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong>s séries <strong>de</strong> Fourier<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψ2k = cos(kx), Ψ2k+1 = sin(kx)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong>s séries <strong>de</strong> Fourier<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψ2k = cos(kx), Ψ2k+1 = sin(kx)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong>s séries <strong>de</strong> Fourier<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψ2k = cos(kx), Ψ2k+1 = sin(kx)<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong>s séries <strong>de</strong> Fourier<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
Relative accuracy (max-norm)<br />
1<br />
0,01<br />
0,0001<br />
1e-06<br />
1e-08<br />
1e-10<br />
1e-12<br />
1e-14<br />
1e-16<br />
0 10 20 30 40 50 60 70<br />
Number of coeffici<strong>en</strong>ts N
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong> la dérivée<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ ′ (x) <br />
N<br />
i=0<br />
aiΨ ′ i(x) avec Ψ ′ 2k = −k sin(kx), Ψ′ 2k+1<br />
= k cos(kx)
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong> la dérivée<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ ′ (x) <br />
N<br />
i=0<br />
aiΨ ′ i(x) avec Ψ ′ 2k = −k sin(kx), Ψ′ 2k+1<br />
= k cos(kx)
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong> la dérivée<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ ′ (x) <br />
N<br />
i=0<br />
aiΨ ′ i(x) avec Ψ ′ 2k = −k sin(kx), Ψ′ 2k+1<br />
= k cos(kx)
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong> la dérivée<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ ′ (x) <br />
N<br />
i=0<br />
aiΨ ′ i(x) avec Ψ ′ 2k = −k sin(kx), Ψ′ 2k+1<br />
= k cos(kx)
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong> la dérivée<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
φ ′ (x) <br />
N<br />
i=0<br />
aiΨ ′ i(x) avec Ψ ′ 2k = −k sin(kx), Ψ′ 2k+1<br />
= k cos(kx)
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Converg<strong>en</strong>ce <strong>de</strong> la dérivée<br />
φ(x) = 1.5 + cos(x) + sin 7 x<br />
Relative accuracy (max-norm)<br />
1<br />
0,01<br />
0,0001<br />
1e-06<br />
1e-08<br />
1e-10<br />
1e-12<br />
1e-14<br />
1e-16<br />
0 10 20 30 40 50 60 70<br />
Number of coeffici<strong>en</strong>ts N
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Phénomène <strong>de</strong> Gibbs<br />
pas <strong>de</strong> converg<strong>en</strong>ce pour <strong>de</strong>s fonctions discontinues (ou<br />
non-périodiques) !<br />
φ(x) =<br />
x pour x ∈ [0, π]<br />
x − 2π pour x ∈]π, 2π[
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Interpolation polynomiale<br />
y<br />
D’après le théorème <strong>de</strong> Weierstrass, toute fonction continue<br />
peut être approximée comme limite d’une suite <strong>de</strong> fonctions<br />
polynomiales.<br />
En pratique, si l’on connaît les valeurs <strong>de</strong> la fonctions sur <strong>de</strong>s<br />
points <strong>de</strong> grille {xi} i=0...N , on peut interpoler par <strong>de</strong>s<br />
polynômes <strong>de</strong> Lagrange :<br />
1<br />
0.5<br />
0<br />
-0.5<br />
N=4<br />
f = 1/(1+16x 2 )<br />
<strong>Un</strong>iform interpolant<br />
-1 -0.5 0 0.5 1<br />
x<br />
li(x) =<br />
N<br />
x − xj<br />
xi − xj<br />
j=0,j=i<br />
mais une grille uniforme<br />
n’est pas un bon choix<br />
⇒phénomène <strong>de</strong> Runge
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Interpolation polynomiale<br />
y<br />
D’après le théorème <strong>de</strong> Weierstrass, toute fonction continue<br />
peut être approximée comme limite d’une suite <strong>de</strong> fonctions<br />
polynomiales.<br />
En pratique, si l’on connaît les valeurs <strong>de</strong> la fonctions sur <strong>de</strong>s<br />
points <strong>de</strong> grille {xi} i=0...N , on peut interpoler par <strong>de</strong>s<br />
polynômes <strong>de</strong> Lagrange :<br />
1<br />
0.5<br />
0<br />
-0.5<br />
N=4<br />
f = 1/(1+16x 2 )<br />
<strong>Un</strong>iform interpolant<br />
-1 -0.5 0 0.5 1<br />
x<br />
li(x) =<br />
N<br />
x − xj<br />
xi − xj<br />
j=0,j=i<br />
mais une grille uniforme<br />
n’est pas un bon choix<br />
⇒phénomène <strong>de</strong> Runge
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Interpolation polynomiale<br />
y<br />
D’après le théorème <strong>de</strong> Weierstrass, toute fonction continue<br />
peut être approximée comme limite d’une suite <strong>de</strong> fonctions<br />
polynomiales.<br />
En pratique, si l’on connaît les valeurs <strong>de</strong> la fonctions sur <strong>de</strong>s<br />
points <strong>de</strong> grille {xi} i=0...N , on peut interpoler par <strong>de</strong>s<br />
polynômes <strong>de</strong> Lagrange :<br />
1<br />
0.5<br />
0<br />
-0.5<br />
N=13<br />
f=1/(1+16x 2 )<br />
<strong>Un</strong>iform interpolant<br />
-1 -0.5 0 0.5 1<br />
x<br />
li(x) =<br />
N<br />
x − xj<br />
xi − xj<br />
j=0,j=i<br />
mais une grille uniforme<br />
n’est pas un bon choix<br />
⇒phénomène <strong>de</strong> Runge
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Polynômes orthogonaux<br />
Les solutions (λi, ui)i∈N d’un problème <strong>de</strong> Sturm-Liouville<br />
singulier sur l’intervalle x ∈ [−1, 1] :<br />
avec p > 0, C 1 , p(±1) = 0<br />
− pu ′ ′ + qu = λwu,<br />
form<strong>en</strong>t une famille orthogonale par rapport au poids w :<br />
(ui, uj) =<br />
1<br />
−1<br />
ui(x)uj(x)w(x)dx = 0 pour m = n,<br />
form<strong>en</strong>t une base spectrale telle que, pour f(x) régulière<br />
(C∞ )<br />
N<br />
f(x) ciui(x)<br />
i=0<br />
converge plus vite que toute puissance <strong>de</strong> 1/N.<br />
Les polynômes <strong>de</strong> Tchebychev, Leg<strong>en</strong>dre et, plus généralem<strong>en</strong>t<br />
<strong>de</strong> Jacobi font partie <strong>de</strong> cette catégorie.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Polynômes orthogonaux<br />
Les solutions (λi, ui)i∈N d’un problème <strong>de</strong> Sturm-Liouville<br />
singulier sur l’intervalle x ∈ [−1, 1] :<br />
avec p > 0, C 1 , p(±1) = 0<br />
− pu ′ ′ + qu = λwu,<br />
form<strong>en</strong>t une famille orthogonale par rapport au poids w :<br />
(ui, uj) =<br />
1<br />
−1<br />
ui(x)uj(x)w(x)dx = 0 pour m = n,<br />
form<strong>en</strong>t une base spectrale telle que, pour f(x) régulière<br />
(C∞ )<br />
N<br />
f(x) ciui(x)<br />
i=0<br />
converge plus vite que toute puissance <strong>de</strong> 1/N.<br />
Les polynômes <strong>de</strong> Tchebychev, Leg<strong>en</strong>dre et, plus généralem<strong>en</strong>t<br />
<strong>de</strong> Jacobi font partie <strong>de</strong> cette catégorie.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Polynômes orthogonaux<br />
Les solutions (λi, ui)i∈N d’un problème <strong>de</strong> Sturm-Liouville<br />
singulier sur l’intervalle x ∈ [−1, 1] :<br />
avec p > 0, C 1 , p(±1) = 0<br />
− pu ′ ′ + qu = λwu,<br />
form<strong>en</strong>t une famille orthogonale par rapport au poids w :<br />
(ui, uj) =<br />
1<br />
−1<br />
ui(x)uj(x)w(x)dx = 0 pour m = n,<br />
form<strong>en</strong>t une base spectrale telle que, pour f(x) régulière<br />
(C∞ )<br />
N<br />
f(x) ciui(x)<br />
i=0<br />
converge plus vite que toute puissance <strong>de</strong> 1/N.<br />
Les polynômes <strong>de</strong> Tchebychev, Leg<strong>en</strong>dre et, plus généralem<strong>en</strong>t<br />
<strong>de</strong> Jacobi font partie <strong>de</strong> cette catégorie.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Polynômes orthogonaux<br />
Les solutions (λi, ui)i∈N d’un problème <strong>de</strong> Sturm-Liouville<br />
singulier sur l’intervalle x ∈ [−1, 1] :<br />
avec p > 0, C 1 , p(±1) = 0<br />
− pu ′ ′ + qu = λwu,<br />
form<strong>en</strong>t une famille orthogonale par rapport au poids w :<br />
(ui, uj) =<br />
1<br />
−1<br />
ui(x)uj(x)w(x)dx = 0 pour m = n,<br />
form<strong>en</strong>t une base spectrale telle que, pour f(x) régulière<br />
(C∞ )<br />
N<br />
f(x) ciui(x)<br />
i=0<br />
converge plus vite que toute puissance <strong>de</strong> 1/N.<br />
Les polynômes <strong>de</strong> Tchebychev, Leg<strong>en</strong>dre et, plus généralem<strong>en</strong>t<br />
<strong>de</strong> Jacobi font partie <strong>de</strong> cette catégorie.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Quadrature <strong>de</strong> Gauss<br />
Afin <strong>de</strong> représ<strong>en</strong>ter une fonction f(x) à l’ai<strong>de</strong> <strong>de</strong> ses<br />
coeffici<strong>en</strong>ts {ci} i=0...N , il suffit d’être capable <strong>de</strong> calculer<br />
∀i, ci =<br />
1<br />
−1 f(x)ui(x)w(x)dx<br />
1<br />
−1 (ui(x)) 2 w(x)dx .<br />
En pratique, il est avantageux d’utiliser la quadrature <strong>de</strong> Gauss<br />
(ici : Gauss-Lobatto) : étant donnés w(x) et N, on peut trouver<br />
<strong>de</strong>ux familles {wi} k=0...N et {xi} k=0...N ∈ [−1, 1] telles que<br />
∀g ∈ P2N−1,<br />
1<br />
−1<br />
g(x)w(x)dx =<br />
N<br />
g(xk)wk.<br />
k=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Quadrature <strong>de</strong> Gauss<br />
Afin <strong>de</strong> représ<strong>en</strong>ter une fonction f(x) à l’ai<strong>de</strong> <strong>de</strong> ses<br />
coeffici<strong>en</strong>ts {ci} i=0...N , il suffit d’être capable <strong>de</strong> calculer<br />
∀i, ci =<br />
1<br />
−1 f(x)ui(x)w(x)dx<br />
1<br />
−1 (ui(x)) 2 w(x)dx .<br />
En pratique, il est avantageux d’utiliser la quadrature <strong>de</strong> Gauss<br />
(ici : Gauss-Lobatto) : étant donnés w(x) et N, on peut trouver<br />
<strong>de</strong>ux familles {wi} k=0...N et {xi} k=0...N ∈ [−1, 1] telles que<br />
∀g ∈ P2N−1,<br />
1<br />
−1<br />
g(x)w(x)dx =<br />
N<br />
g(xk)wk.<br />
k=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Exemple avec les polynômes <strong>de</strong><br />
Tchebychev<br />
φ(x) = (1 + 2 sin(5x)) /(1 + x 2 )<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψk = Tk(x) = cos(k arccos(x))<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Exemple avec les polynômes <strong>de</strong><br />
Tchebychev<br />
φ(x) = (1 + 2 sin(5x)) /(1 + x 2 )<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψk = Tk(x) = cos(k arccos(x))<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Exemple avec les polynômes <strong>de</strong><br />
Tchebychev<br />
φ(x) = (1 + 2 sin(5x)) /(1 + x 2 )<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψk = Tk(x) = cos(k arccos(x))<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Exemple avec les polynômes <strong>de</strong><br />
Tchebychev<br />
φ(x) = (1 + 2 sin(5x)) /(1 + x 2 )<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψk = Tk(x) = cos(k arccos(x))<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Exemple avec les polynômes <strong>de</strong><br />
Tchebychev<br />
φ(x) = (1 + 2 sin(5x)) /(1 + x 2 )<br />
φ(x) <br />
N<br />
aiΨi(x) avec Ψk = Tk(x) = cos(k arccos(x))<br />
i=0
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Exemple avec les polynômes <strong>de</strong><br />
Tchebychev<br />
φ(x) = (1 + 2 sin(5x)) /(1 + x 2 )<br />
Relative accuracy (max - norm)<br />
1<br />
0,01<br />
0,0001<br />
1e-06<br />
1e-08<br />
1e-10<br />
1e-12<br />
1e-14<br />
1e-16<br />
10 20 30 40 50 60<br />
Number of coeffici<strong>en</strong>ts N
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff. Étape<br />
n o 1 :<br />
Transformée <strong>de</strong> Tchebychev,<br />
interpolation et dérivée
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Polynômes <strong>de</strong> Tchebychev<br />
Définition<br />
Les fonctions associées aux polynômes <strong>de</strong> Tchebychev<br />
{Tn(x)} n∈N sont définies par :<br />
∀x ∈ [−1, 1], Tn(x) = cos (n arccos x) .<br />
〈Tn, Tp〉 =<br />
1<br />
−1<br />
Tn(x)Tp(x)<br />
√ 1 − x 2<br />
Ils sont orthogonaux par<br />
rapport au poids<br />
w(x) =<br />
1<br />
√ 1 − x 2<br />
π<br />
dx = (1 + δ0n)δnp.<br />
2
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Polynômes <strong>de</strong> Tchebychev<br />
Calcul <strong>de</strong>s coeffici<strong>en</strong>ts<br />
Les coeffici<strong>en</strong>ts peuv<strong>en</strong>t se calculer par quadrature <strong>de</strong> Gauss<br />
-Lobatto. Les poids wi et les points <strong>de</strong> grille sont connus<br />
analytiquem<strong>en</strong>t. Si<br />
N<br />
∀x ∈ [−1, 1], f(x) ciTi(x),<br />
i=0<br />
alors on a, avec une très bonne approximation :<br />
ci 1<br />
N<br />
f(xk)Ti(xk)wk,<br />
où<br />
xk = − cos<br />
γi<br />
k=0<br />
<br />
kπ<br />
, w0 = wN =<br />
N<br />
π<br />
2N , wk = π<br />
(k = 1 . . . N−1);<br />
N<br />
et γi =<br />
N<br />
k=0<br />
T 2<br />
i (xk)wk.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Polynômes <strong>de</strong> Tchebychev<br />
Interpolation<br />
Pour calculer la valeur <strong>de</strong> Tn <strong>en</strong> un point x, on utilise la<br />
récurr<strong>en</strong>ce :<br />
T0(x) = 1, T1(x) = x;<br />
∀x ∈ [−1, 1], ∀n ≥ 2, Tn(x) = 2xTn−1(x) − Tn−2(x).<br />
Cela permet <strong>de</strong> calculer les 6 premiers polynômes <strong>de</strong><br />
Tchebychev...<br />
T0(x) = 1,<br />
T1(x) = x,<br />
T2(x) = 2x 2 − 1,<br />
T3(x) = 4x 3 − 3x,<br />
T4(x) = 8x 4 − 8x 2 + 1,<br />
T5(x) = 16x 5 − 20x 3 + 5x,<br />
T6(x) = 32x 6 − 48x 4 + 18x 2 − 1.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Polynômes <strong>de</strong> Tchebychev<br />
Dérivation<br />
Si on approxime<br />
f(x) <br />
N<br />
i=0<br />
ci Ti(x),<br />
alors la dérivée peut être approximée <strong>de</strong> la même manière :<br />
avec<br />
di =<br />
f ′ (x) <br />
2<br />
1 + δ0i<br />
N<br />
i=0<br />
di Ti(x),<br />
N<br />
k=i+1, (k+i) impair<br />
k ck.<br />
Cette formule vi<strong>en</strong>t <strong>de</strong> la dérivation <strong>de</strong> la relation <strong>de</strong> récurr<strong>en</strong>ce.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
TPn o 6<br />
une classe <strong>de</strong> fonctions<br />
En partant <strong>de</strong>s classes Tab et Matrice, implém<strong>en</strong>ter une classe<br />
Fonction représ<strong>en</strong>tant <strong>de</strong>s fonctions définies sur [−1, 1] :<br />
chaque instance <strong>de</strong> la classe conti<strong>en</strong>dra la grille <strong>de</strong> points<br />
<strong>de</strong> Gauss-Lobatto et les valeurs <strong>de</strong> la fonctions <strong>en</strong> ces<br />
points ;<br />
les coeffici<strong>en</strong>ts seront calculés par quadrature <strong>de</strong><br />
Gauss-Lobatto et stockés comme membres ;<br />
la classe possé<strong>de</strong>ra une métho<strong>de</strong> <strong>de</strong> calcul <strong>de</strong> la valeur <strong>en</strong><br />
un point quelconque <strong>de</strong> [−1, 1] et <strong>de</strong> transformation<br />
inverse (coeffici<strong>en</strong>ts → valeurs aux points <strong>de</strong> grille) ;<br />
elle aura aussi une métho<strong>de</strong> r<strong>en</strong>voyant la Fonction<br />
dérivée.<br />
Pour un ≪ cahier <strong>de</strong>s charges ≫, voir le fichier<br />
Donnees cheb/ppl.cpp.
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Étape n o 2 :<br />
Résolution d’équations<br />
différ<strong>en</strong>tielles linéaires à coeffici<strong>en</strong>ts<br />
constants
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Opérateurs différ<strong>en</strong>tiels linéaires<br />
⎛<br />
⎜<br />
⎝<br />
f ↦→ f ′<br />
⎞ ⎛<br />
c0<br />
.<br />
cN<br />
⎟<br />
⎠<br />
⎜<br />
⎝<br />
d0<br />
.<br />
dN<br />
⎞<br />
⎟<br />
⎠ =<br />
⎡<br />
⎣ D<br />
Tout opérateur différ<strong>en</strong>tiel linéaire :<br />
⎤<br />
⎛<br />
c0<br />
⎦ ⎜<br />
× ⎝ .<br />
f ↦→ af ′′ + bf ′ + c (a, b, c) ∈ R 3 ,<br />
peut être vu comme une matrice.<br />
cN<br />
⎞<br />
⎟<br />
⎠<br />
L’inversion <strong>de</strong> cet opérateur ⇐⇒ inversion d’un système<br />
linéaire<br />
La matrice générale est-elle inversible ?
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Opérateurs différ<strong>en</strong>tiels linéaires<br />
⎛<br />
⎜<br />
⎝<br />
f ↦→ f ′<br />
⎞ ⎛<br />
c0<br />
.<br />
cN<br />
⎟<br />
⎠<br />
⎜<br />
⎝<br />
d0<br />
.<br />
dN<br />
⎞<br />
⎟<br />
⎠ =<br />
⎡<br />
⎣ D<br />
Tout opérateur différ<strong>en</strong>tiel linéaire :<br />
⎤<br />
⎛<br />
c0<br />
⎦ ⎜<br />
× ⎝ .<br />
f ↦→ af ′′ + bf ′ + c (a, b, c) ∈ R 3 ,<br />
peut être vu comme une matrice.<br />
cN<br />
⎞<br />
⎟<br />
⎠<br />
L’inversion <strong>de</strong> cet opérateur ⇐⇒ inversion d’un système<br />
linéaire<br />
La matrice générale est-elle inversible ?
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
Conditions initiales<br />
La matrice ≪ brute ≫ n’est pas inversible, il n’y a pas unicité <strong>de</strong><br />
la solution tant que les conditions initiales n’ont pas été<br />
spécifiées.<br />
Métho<strong>de</strong> τ<br />
Pour chaque condition, une ligne du système différ<strong>en</strong>tiel est<br />
remplacée par la condition, exprimée <strong>en</strong> termes <strong>de</strong>s coeffici<strong>en</strong>ts<br />
inconnus.<br />
On choisit évi<strong>de</strong>mm<strong>en</strong>t la ligne concernant le plus haut <strong>de</strong>gré<br />
du système différ<strong>en</strong>tiel.<br />
En pratique :<br />
pour une condition du type f(x0) = y0, on remplace les<br />
aNi <strong>de</strong> l’opérateur par Ti(x0) et le N e coeffici<strong>en</strong>t du<br />
membre <strong>de</strong> droite par y0 ;<br />
pour f ′ (x0) = y0, on fait la même chose, mais avec<br />
T ′ (x0).
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
TPn o 7<br />
les classes d’équations différ<strong>en</strong>tielles<br />
Concevoir une classe abstraite Equa diff cont<strong>en</strong>ant :<br />
n, le <strong>de</strong>gré <strong>de</strong> représ<strong>en</strong>tation spectrale <strong>de</strong>s fonctions et une<br />
Matrice cont<strong>en</strong>ant l’opérateur ;<br />
le vecteur (Tab) membre <strong>de</strong> droite <strong>de</strong> l’équation et le<br />
nombre <strong>de</strong> conditions au bord à imposer ;<br />
<strong>de</strong>s fonctions impose conditions bord(), resout() ;<br />
une fonction calcule operateur homog<strong>en</strong>e() virtuelle<br />
pure.<br />
À partir <strong>de</strong> cette classe <strong>de</strong> base, faire <strong>de</strong>ux classes dérivées :<br />
Equa un représ<strong>en</strong>tant les équations différ<strong>en</strong>tielles du<br />
premier ordre ay ′ + by = f, où (a, b) ∈ R 2 et la fonction f<br />
sont donnés. (a, b) seront les nouvelles données et la<br />
fonctions virtuelle pure définie.<br />
Equa <strong>de</strong>ux représ<strong>en</strong>tant les équations différ<strong>en</strong>tielles du<br />
second ordre ay ′′ + by ′ + cy = f, où (a, b, c) ∈ R 3 et la<br />
fonction f sont donnés. . .
Projet <strong>de</strong><br />
<strong>C++</strong><br />
Jérôme Novak<br />
Introduction<br />
Tchebychev<br />
Equa. diff.<br />
TPn o 7<br />
les classes d’équations différ<strong>en</strong>tielles<br />
Concevoir une classe abstraite Equa diff cont<strong>en</strong>ant :<br />
n, le <strong>de</strong>gré <strong>de</strong> représ<strong>en</strong>tation spectrale <strong>de</strong>s fonctions et une<br />
Matrice cont<strong>en</strong>ant l’opérateur ;<br />
le vecteur (Tab) membre <strong>de</strong> droite <strong>de</strong> l’équation et le<br />
nombre <strong>de</strong> conditions au bord à imposer ;<br />
<strong>de</strong>s fonctions impose conditions bord(), resout() ;<br />
une fonction calcule operateur homog<strong>en</strong>e() virtuelle<br />
pure.<br />
À partir <strong>de</strong> cette classe <strong>de</strong> base, faire <strong>de</strong>ux classes dérivées :<br />
Equa un représ<strong>en</strong>tant les équations différ<strong>en</strong>tielles du<br />
premier ordre ay ′ + by = f, où (a, b) ∈ R 2 et la fonction f<br />
sont donnés. (a, b) seront les nouvelles données et la<br />
fonctions virtuelle pure définie.<br />
Equa <strong>de</strong>ux représ<strong>en</strong>tant les équations différ<strong>en</strong>tielles du<br />
second ordre ay ′′ + by ′ + cy = f, où (a, b, c) ∈ R 3 et la<br />
fonction f sont donnés. . .