Table Des Matières
Table Des Matières
1
M=sparse(i=Ig,j=Jg,x=Kg,dims=c(m,n))
‚ Scilab : format row-by-row( ?)
M=sparse([],[],[m,n])
M=sparse([Ig,Jg],Kg,[m,n])
Dans tous ces langages, de très nombreuses fonctions existent permettant d'utiliser les matrices creuses
comme des matrices classiques. Il est donc possible d'eectuer des opérations aussi élémentaires que des sommes,
produits de matrices et vecteurs mais aussi des opérations plus complexes comme des factorisations (LU, Cho-
lesky,QR, ...), résolution de systèmes linéaires (méthodes directes ou itératives), calcul de valeurs propres et
vecteurs propres, ...
Pour les langages de programmation usuels (Fortan, C, C++, ...) des libraires existent permettant de réaliser
ces mêmes opérations sur les matrices creuses :
‚ C/C++ avec les librairies SuiteSparse de T. Davis [?] ainsi que BLAS (Basic Linear Algebra Subroutines),
LAPACK (Linear Algebra PACKage) et leurs dérivées.
‚ CUDA avec la librairie cuSparse [?] de Nvidia.
Toutefois cette manière de construire une matrice creuse est très loin d'être la plus ecace.
Dans un premier temps, une rapide explication du pourquoi vous est proposée et ensuite nous verrons
comment améliorer celà en utilisant judicieusement la fonction sparse . Il est aussi possible d'utiliser conjoin-
tement les fonctions speye et spdiags pour créer la matrice K mais ces commandes ne seront plus utilisables
pour assembler les matrices provenant des méthodes d'éléments nis et volumes nis, c'est pourquoi nous nous
focaliserons sur la fonction sparse .
1.1 Stockage
Sous Matlab et Octave, une matrice creuse (ou sparse matrix ), A P MM,N pRq, est stockée sous le format
CSC (Compressed Sparse Column), utilisant trois tableaux :
2
où nnz est le nombre d'éléments non nuls de la matrice A. Ces tableaux (cachés mais contenus dans l'object
sparse Matlab/Octave) sont dénis par
‚ aa : contient l'ensemble des nnz éléments non nuls de A stockés par colonnes.
‚ ia : contient les numéros de ligne des éléments stockés dans le tableau aa.
‚ ja : permet de retrouver les éléments d'une colonne de A, sachant que le premier élément non nul de la
colonne k de A est en position japkq dans le tableau aa. On a jap1q “ 1 et japN ` 1q “ nnz ` 1.
Pour illustrer, voici un exemple simple avec la matrice
¨ ˛
1. 0. 0. 6.
A “ ˝0. 5. 0. 4.‚
0. 1. 2. 0.
on a M “ 3, N “ 4, nnz “ 6 et
aa 1. 5. 1. 2. 6. 4.
ia 1 2 3 3 1 2
ja 1 2 4 5 7
Le premier élément non nul de la colonne k “ 3 de A est 2, ce nombre est en position 4 dans aa, donc jap3q “ 4.
Or un double occupe 8 Octets (en anglais bytes ) et un int 4 Octets. La place mémoire occupée par la matrice
stockée sous forme sparse est alors de
Par contre, si la matrice était stockée classiquement (full), alors la place mémoire serait de
d2 Octets.
On rappelle que 1 Mo (Méga-octet) correspond à 106 Octets, 1 Go (Giga-octet) correspond à 109 Octets et 1 To
(Tera-octet) correspond à 1012 Octets. On donne maintenant la place mémoire occupée par la matrice suivant
sa dimension et son stockage (full ou sparse) :
d full matrix sparse matrix
103 1 Mo 40 Ko
104 100 Mo 400 Ko
105 10 Go 4 Mo
106 1000 Go 40 Mo
107 100 To 400 Mo
A (1,2)=8;
La matrice devient alors ¨
8.
˛
1. 0. 6.
A “ ˝0. 5. 0. 4.‚.
0. 1. 2. 0.
3
Dans cette opération un élément nul de A a été remplacé par une valeur non nulle 8 : il va donc falloir la stocker
dans les tableaux sachant qu'aucune place n'est prévue. On suppose que les tableaux sont susamment grands
(pas de souci mémoire), il faut alors décaler d'une case l'ensemble des valeurs des tableaux aa et ia à partir de
la 3ème position puis copier la valeur 8 en aap2q et le numéro de ligne 1 en iap2q :
aa 1. 8. 5. 1. 2. 6. 4.
ia 1 1 2 3 3 1 2
Pour le tableau ja, il faut à partir du numéro de colonne 2 plus un, incrémenter de `1 :
ja 1 2 5 6 8
La répétition de ces opérations peut devenir très coûteuse en temps CPU lors de l'assemblage de matrices
utilisant des méthodes similaires à celle utilisée en Listing 1 (et on ne parle pas ici des problèmes de réallocation
dynamique qui peuvent arriver !).
Q. 1 (Matlab) Ecrire la fonction spMatDiag permettant à partir d'un vecteur v P Rd de retourner la matrice
diagonale (creuse) D P Md pRq de diagonale v (i.e. Dpi, iq “ v piq, @i P v1, dw) en créant (sans boucle) les tableaux
I, J et K puis en générant la matrice D à l'aide de la commande D = sparse(I,J,K,d,d); ‚
Soit A P Md pRq la matrice tridiagonale dénit par
¨ ˛
v 1 w1 0 ¨¨¨ ¨¨¨ 0
. ..
w2 . . .
˚ ‹
˚u1 v2 ‹
..
˚ 0 ... .. .. ..
˚ ‹
. . . .
˚ ‹
(1.2)
‹
A“˚ ˚. . .. .. ..
‹
˚ .. .. . . .
‹
0 ‹
˚.
˚ ‹
˝ .. .. .. ‹
. . vd´1 wd´1 ‚
0 ¨¨¨ ¨¨¨ 0 ud´1 vd
avec u P Rd´1 , v P Rd et w P Rd´1 .
Q. 2 (Matlab) 1. Ecrire la fonction spMatTriDiagSca permettant à partir des vecteurs u , v et w de
retourner la matrice creuse A dénie en (1.2). Pour celà on va tout d'abord créer une matrice creuse de
Md pRq puis on va la remplir à l'aide d'une boucle for sur le principe du Listing 1.
2. Ecrire la fonction spMatTriDiagVec permettant à partir des vecteurs u , v et w de retourner la matrice
creuse A en créant (sans boucle) les tableaux I, J et K puis en générant la matrice A à l'aide de la
commande A = sparse(I,J,K,d,d);
3. Ecrire un programme permettant de mesurer (tic-toc) puis de représenter graphiquement les performances
de spMatTriDiagSca et spMatTriDiagVec en fonction de d.
(Attention à la capacité mémoire de la machine !) ‚
4
1.3 Produit de Kronecker de deux matrices
Pour générer ecacement et simplement les matrices creuses obtenus par des méthodes de diérences nies
nous utiliserons le produit de Kronecker de deux matrices.
Soient A P Mm,n pRq et B P Mp,q pRq. Le produit tensoriel de Kronecker de A par B, noté A b B, est la
matrice de Mmp,nq pRq dénie avec des blocs de dimension p ˆ q par
¨
A
1,1 B ¨¨¨ 1,n B
˛
A
A b B “ ˝ ... ..
.
.. ‹ (1.3)
˚
. ‚
Am,1 B ¨¨¨ Am,n B
Le produit de Kronecker est bilinéaire et associatif : Si les dimensions des matrices A, B et C sont compatibles
on a @λ P K
A b pB ` λ ¨ Cq “ pA b Bq ` λpA b Cq
pA ` λ ¨ Bq b C “ pA b Cq ` λpB b Cq
A b pB b Cq “ pA b Bq b C
Par contre, il n'est pas commutatif.
Nous allons écrire une fonction permettant d'eectuer ce produit. Mais auparavant, quelques petits rappels
(ou non) des possibilités oertes par le langage Matlab.
Il est facile sous Malab/Octave de modier une matrice (creuse ou non). Par exemple,
‚ A(I , J)=M
Les tableaux d'indices I et J sont de dimension respective n et m. La matrice M est de dimension
n-par-m. La matrice A est modiée de telle sorte que
‚ A(I , J)=A(I,J)+M
Même chose en sommant.
‚ A(i ,:) =a
Ici a est un scalaire. Tous les éléments de la ligne i de la matrice A valent a .
‚ A (:, j)=a
Ici a est un scalaire. Tous les éléments de la colonne j de la matrice A valent a .
‚ ...
Sous Matlab/Octave, il est possible de récupérer tous les éléments non nuls d'une matrice creuse A ainsi
que leurs indices de ligne et de colonne à l'aide de la commande
[ I , J , K]=nd(A);
Ici les trois tableaux I, J et K ont même longueur et on a A(I(k), J(k)) == K(k) pour tout k inférieur ou égal à
length(K).
Q. 3 (Matlab) Ecrire la fonction spMatKron permettant à partir deux matrices creuses carrées A P Mn pRq
et B P Mm pRq de retourner la matrice creuse C “ A b B. Pour celà, on initialisera la matrice retournée C à
l'aide de la commande C=sparse(n*m,n*m) puis on utilisera uniquement une boucle sur les éléments non-nuls
de la matrice A pour remplir la matrice C . ‚
Γ “ ΓN Y ΓS Y ΓO Y ΓE .
5
Q. 4 (sur feuille) Montrer que l'on a
B2 v vpx ` h, yq ´ 2vpx, yq ` vpx ´ h, yq
px, yq “ ` Oph2 q (2.1)
Bx2 h2
B2 v vpx, y ` hq ´ 2vpx, yq ` vpx, y ´ hq
px, yq “ ` Oph2 q. (2.2)
By 2 h2
‚
N
i“0 et pyj qj“0 les discrétisation régulières, respectivement, des intervalles ra, bs et rc, ds dénes par
On note pxi qN x y
nx “ Nx ` 1, ny “ Ny ` 1 et N “ nx ˆ ny (2.4)
Q. 6 (sur feuille) 1. Montrer que ce problème peut s'écrire après discrétisation sous la forme
Ui`1,j ´ 2Ui,j ` Ui´1,j Ui,j`1 ´ 2Ui,j ` Ui,j´1
´ 2
´ “ f pxi , yj q, @pi, jq Pw0, Nx vˆw0, Ny v, (3.3)
hx h2y
U0,j “ gpa, yj q, @j P v0, Ny w, (3.4)
UNx ,j “ gpb, yj q, @j P v0, Ny w, (3.5)
Ui,0 “ gpxi , cq, @i P v0, Nx w, (3.6)
Ui,Ny “ gpxi , dq, @i P v0, Nx w. (3.7)
βx pUi`1,j ` Ui´1,j q ` µUi,j ` βy pUi,j`1 ` Ui,j´1 q “ f pxi , yj q, @pi, jq Pw0, Nx vˆw0, Ny v (3.8)
UNx ,j
6
On note V P RN le vecteur bloc ¨ ˛
U:,0
˚
˚ U:,1 ‹
‹
V “˚ .. ‹
.
˚ ‹
˝ ‚
U:,Ny
Chacune des équations du problème discret (3.3)-(3.7) correspond à une discrétisation en un point pxi , yj q.
Nous choisissons d'écrire ces équations en utilisant la même numérotation que lors de la construction du vecteur
V : l'équation écrite au point pxi , yj q sera écrite en ligne k “ Fpi, jq du système.
Q. 9 (sur feuille) Etablir que le problème discret (3.3)-(3.7) peut s'écrire sous la forme du système linéaire
bloc ¨ ˛
E O ¨¨¨ ¨¨¨ ¨¨¨ O O
˚ M D M O ¨¨¨ O O ‹ ¨
B:,0
˛
.. .. . . .. .. ‹
˚ ‹
˚ B:,1 ‹
. . . . . ‹
˚ ‹
˚ O M
.
˚ ˚ ‹
.. .. .. .. .. ‹V “ ˚ .. ‹
˚ ‹
(3.9)
˚ ‹
. . . . O . ‹
˚ ˚
O ‹
.
˚
.. .. .. ‚
˚ ‹
.. .. ..
˚ ‹ ˚ ‹
. . . . . M O ‹
˚ ‹ ˝
˚
B:,Ny
˚ ‹
˝ O O ¨¨¨ O M D M ‚
O O ¨¨¨ ¨¨¨ ¨¨¨ O E
où chaque bloc de la matrice est une matrice pNx ` 1q par pN x ` 1q. La matrice O P MNx `1 pRq est la matrice
nulle. Les matrices creuses D, M et E ainsi que les vecteurs B:,j P RN x`1 , pour tout j P v0, Ny w, devront être
donnés explicitement. On notera B le vecteur second membre de RN et A P MN pRq la matrice du système. ‚
0 ... ... 0 0
Dans cette partie nous allons générer/assembler la matrice du système (3.9) sans tenir compte des
conditions aux limites (i.e. les lignes du système correspondant à des points du bord sont nulles ... pour
l'instant).
7
Dans ce cas, on note ´Axy la matrice ainsi obtenue. C'est une matrice bloc de MN pRq avec ny lignes bloc
composées de blocs carrés de dimension nx qui s'écrit sous la forme :
¨ ˛ ¨ ˛
O O ¨¨¨ ¨¨¨ ¨¨¨ O O O O ¨¨¨ ¨¨¨ ¨¨¨ O O
˚ O Tx O O ¨¨¨ O O ‹ ˚ S Ty Sy O ¨ ¨ ¨ O O ‹
‹ ˚ y
.. .. ‹ ˚ .. .. ‹
˚ ‹
˚ .. .. ‹ ˚ .. ..
˚ O O T
˚ x . . . . ‹ ˚ O Sy Ty . . . . ‹‹
˚ . . . .
Axy “ ˚ .. O . .. . .. . . . O .. ‹ ` ˚ .. . .. . .. . .. O .. ‹ (3.10)
‹ ˚ ‹
˚ ‹ ˚
O ‹
˚ .. .. . . .. ‹ ˚ .. .. . . ..
˚ ‹ ˚ ‹
˚ . . . . Tx O O ‹ ‹ ˚ . . . . Ty Sy O ‹
‹
˚
˚ ‹
˝ O O ¨¨¨ O O Tx O ‚ ˝ O O ¨ ¨ ¨ O Sy Ty Sy ‚
O O ¨¨¨ ¨¨¨ ¨¨¨ O O O O ¨¨¨ ¨¨¨ ¨¨¨ O O
où ¨ ˛
0 0 0 ¨¨¨ ¨¨¨ 0
.. .. ‹
. .‹
˚
˚1 ´2 1
.. .. .. .. .. ‹
˚ ‹
. . . . .‹
˚
1 2 1 ˚0
Sy “ 2 Jnx , Ty “ ´ 2 Jnx et Tx “ 2 ˚
˚ ... .. .. .. ..
‹
hy hy hx ˚ . . . .
‹
0‹
˚.
˚ ‹
˝ .. .. ‹
. 1 ´2 1‚
0 ... ... 0 0 0
On peut noter que les matrices Tx , Ty et Sy sont des matrices de Mnx pRq.
En notant Ax P Mnx pRq et Ay P Mny pRq les matrices dénies par
¨ ˛ ¨ ˛
0 0 0 ¨¨¨ ¨¨¨ 0 0 0 0 ¨¨¨ ¨¨¨ 0
.. .. ‹ .. .. ‹
. .‹ . .‹
˚ ˚
˚1 ´2 1 ˚1 ´2 1
.. .. .. .. .. .. .. .. .. .. ‹
˚ ‹ ˚ ‹
. . . . .‹ . . . . .‹
˚ ‹ ˚
1 ˚0 1 ˚0
‹ et Ay “ h2 ˚ .
‹
Ax “ 2 ˚
˚ ... .. .. .. .. .. .. .. ..
˚ ‹
hx ˚ . . . . ˚ .. . . . .
‹
0‹ ‹ y 0‹
˚. ˚.
˚ ˚ ‹
˝ .. .. ‹
˝ .. .. ‹
. 1 ´2 1 ‚ . 1 ´2 1‚
0 ... ... 0 0 0 0 ... ... 0 0 0
on déduit de (3.10)
Axy “ Iny b Ax ` Ay b Inx . (3.11)
Sur le même principe, il est possible de généraliser en dimension quelconque la construction de la matrice
du Laplacien obtenue par diérences nies sans prise en compte des conditions aux limites. Par exemple en
dimension 3, cette matrice s'écrit
` ˘
Axyz “ Jnz b Axy ` Az b pJny b Jnx q
“ Jnz b Jny b Ax ` Jnz b Ay b Jnx ` Az b Jny b Jnx
Γ “ ΓN Y ΓS Y ΓE Y ΓO .
Q. 11 (sur feuille) 1. Pour ΓS , donner le sous-ensemble DS d'indices pi, jq dans v0, Nx w ˆ v0, Ny w tel que
pxpiq, ypjqq P ΓS .
8
2. En déduire le sous-ensemble IS (ordonné suivant DS ) correspondant dans la numérotation globale.
3. Même chose pour ΓN , ΓE et ΓO . ‚
Q. 12 (matlab) Ecrire la fonction BordDomaine retournant la structure de données (help struct) contenant
les champs suivants :
‚ Sud ayant pour valeur IS ,
‚ Nord ayant pour valeur IN ,
‚ Est ayant pour valeur IE ,
‚ Ouest ayant pour valeur IO .
Chacun des tableaux Ix sera stocké sous forme ligne. ‚
Une fois cette fonction écrite, il est aisé en numérotation globale de récupérer l'ensemble idxBD des indices des
points du bords ainsi que l'ensemble idxBDc des indices des points strictement intérieurs (complémentaire du
précédant) :
En Algorithme 1, est présenté une version non vectorisée de la construction du vecteur F . Dans cet algorithme
l'ordre des boucles est primordial pour respecter le choix de la numérotation globale.
Pour le cas où la fonction f est vectorisée sous Matlab/Octave, il est alors possible de calculer le vecteur F
sans boucle. Pour celà, nous allons construire les deux vecteurs blocs X et Y de Rn dénit par
¨ ˛
X:,0 ¨ ˛
˚ X ‹ x0
:,1 ‹
. ‹
‹ avec X:,j “ ˚˝ .. ‚ P RN x`1 , @j P v0, Ny w
˚
X “˚ ..
.
˚ ‹
xNx
˝ ‚
X:,Ny
9
et ¨ ˛
Y:,0 ¨ ˛
˚ Y:,1 ‹ yj
.‹
˝ .. ‚ P RN x`1 , @j P v0, Ny w.
‹ avec Y:,j “ ˚
˚ ‹
Y “˚ ..
.
˚ ‹
yj
˝ ‚
Y:,Ny
Avec ces deux vecteurs, le calcul du vecteur F pourra être vectorisé (sous la condition que f le soit) :
F=f(X,Y);
Il nous faut donc écrire une version vectorisée du calcul des vecteurs X et Y .
for j Ð 1 to ny do 2: for j Ð 1 to ny do
for i Ð 1 to nx do 3: for i Ð 1 to nx do
X pkq Ð x piq 4: X pkq Ð x piq
Y pkq Ð y pjq 5: Y pkq Ð y pjq
X pkq, Y pkqqq
F pkq Ð f pX 6: k Ðk`1
k Ðk`1 7: end for
end for 8: end for
end for 9: X,Y q
F Ð f pX
On peut noter que l'ordre des boucles dans l'Algorithme 3 permet d'armer que la valeur de k en ligne 4 est
donnée par Fpi ´ 1, j ´ 1q.
Grâce à l'application réciproque F -1 il est alors possible de transformer la double boucle en j et i en une seule
boucle sur k : c'est l'objet de l'Algorithme 5. On en déduit alors l'Algorithme 6 totalement vectorisé.
Un programme Matlab/Octave complet basé sur ce dernier algorithme est proposé en Listing 3.
10
Listing 2 Calcul et représentation d'une fonction sur la grille 2D
clear a l l
close a l l
a=´pi ; b=pi ; c =0; d=pi ;
f=@ ( x , y ) 4 * cos ( x + y ) . * sin ( x ´ y) ;
Nx =133; Ny =222;
x=linspace ( a , b , Nx +1) ;
y=linspace ( c , d , Ny +1) ;
nx=Nx +1; ny=Ny +1; N=nx * ny ;
[ I , J ]= bijRecF ( 1 : N , nx ) ;
X=x ( I +1) ; Y=y ( J +1) ; % A t t e n t i o n X e t Y v e c t e u r s l i g n e
F=f ( X , Y ) ; % e t donc F a u s s i !
Il faut noter qu'il existe sous Matlab/Octave deux fonctions meshgrid et ndgrid qui peuvent être utilées
pour le calcul des vecteurs X et Y . Ces deux fonctions n'utilisent pas la fonction bijRecF .
Q. 14 (Matlab) Ecrire la fonction EvalFun2DVec permettant à partir d'une fonction f et des discrétisations
x et y de retourner le vecteur F associé sans utiliser de boucle for . ‚
Pour évaluer une fonction sur une autre partie de la grille, il sut de récupérer l'ensemble des indices dans la
numérotation globale des points de appartenant à cette partie et de remplacer [Link] par cet ensemble.
Nous allons générer/assembler le vecteur second membre du système (3.9) sans tenir compte des condi-
tions aux limites. Avec le choix de la numérotation globale, ce vecteur B de RN est déni par
f pxpiq, ypjqq si pxpiq, ypjqq R Γ et k “ Fpi, jq
"
@k P v1, N w, Bk “
0 sinon
En utilisant les codes donnés (et expliqués) en section 3.2, on a immédiatement un code vectorisé permettant
d'initialiser ce vecteur : il est donné en Listing 4.
11
Listing 4 Calcul du vecteur second membre sans conditions aux limites
BD=BordDomaine ( . . . ) ; % . . . ´> a remplacer
[ I , J ]= bijRecF ( 1 : N , nx ) ;
X=x ( I +1) ; Y=y ( J +1) ; % coordonnees des p o i n t s de l a g r i l l e
% en numerotation g l o b a l e
f=@ ( x , y ) sin ( x+y ) . * cos ( x´y ) ;
idxBD=unique ( [ BD . Sud , BD . Nord , BD . Est , BD . Ouest ] ) ;
idxBDc=setdiff ( 1 : N , idxBD ) ; % N=nx * ny
B=zeros ( N , 1 ) ;
B ( idxBDc )=f ( X ( idxBDc ) , Y ( idxBDc ) ) ;
Sans tenir compte des conditions aux limites, nous avons décrit le calcul de la matrice Axy P MN pRq
(section 3.1) et du vecteur B P RN (section 3.3).
En reprenant les résultats et notations de Q.9 (page 7), on en déduit que
A “ ´Axy ` AΓ et B “ B ` B Γ
où AΓ et B Γ sont les contributions des conditions aux limites, c'est à dire que le système
AΓU “ B Γ (3.12)
contient uniquement les équations (3.4) à (3.7). Pour k “ Fpi, jq P v1, N w, si pxpiq, ypjqq P Γ alors la ligne k du
système (3.12) correspond à
U pkq “ gpxpiq, ypjqq.
Toutes les autres lignes du système (3.12) sont nulles. On a donc pour tout k P v1, N w
" t
e k si pxpiq, ypjqq P Γ avec pi, jq “ F -1 pkq
AΓ pk, :q “
0 sinon
où e tk est le k ième vecteur de la base canonique de RN , et
gpxpiq, ypjqq si pxpiq, ypjqq P Γ avec pi, jq “ F -1 pkq
"
B Γ pkq “
0 sinon
En utilisant les codes donnés (et expliqués) en section 3.2, on calcule dans le Listing 5, le vecteur Bcl corres-
pondant à B Γ et la matrice Acl correspondant à AΓ .
Bcl=zeros ( N , 1 ) ;
Bcl ( idxBD )=g ( X ( idxBD ) , Y ( idxBD ) ) ;
Acl=sparse ( idxBD , idxBD , ones ( 1 , length ( idxBD ) ) , N , N ) ;
12
3.5 Résolution du système
On doit résoudre le système AU U “ B dénit en Q.9 (page 7). Or on a construit les matrices Axy , AΓ et les
vecteurs B , B Γ de telle sorte que
A “ ´Axy ` AΓ et B “ B ` B Γ
3.5.1 Méthode 1
Dans cette section nous allons directement résoudre le système AU
U “ B.
Q. 15 1. Ecrire le programme EDP2D01 permettant de résoudre numériquement l'EDP (3.1)-(3.2) à l'aide du
schéma discrétisé (3.3) à (3.7). On choisira judicieusement les données permettant sur une même gure
de représenter de la solution numérique et de la solution exacte, et sur une autre gure de représenter
l'erreur entre les deux solutions.
2. Ecrire le programme ordreEDP2D01 permettant de retouver numériquement l'ordre du schéma utilisé. ‚
3.5.2 Méthode 2
Dans cette section nous proposons une autre méthode permettant de résoudre le système AU
U “ B en
éléminant les équations portants sur les points Dirichlet.
Pour celà, on note
ID “ k P v1, N w; pxpiq, ypjqq P Γ avec pi, jq “ F -1 pkq
(
et son complémentaire
c
ID “ v1, N wzID .
Le système linéaire à résoudre AU
U “ B peut se décomposer de manière équivalente en
(3.13a)
"
U “ B pID q
ApID , :qU
U “B ô
AU c
ApID c
U “ B pID
, :qU q (3.13b)
Nous allons réécrire les deux systèmes (3.13a) et (3.13b).
‚ Pour (3.13a), nous avons par construction on a ApID , :q “ AΓ pID , :q et donc
U “ AΓ pID , :qU
ApID , :qU U
c c
“ AΓ pID , ID qU
U pID q ` AΓ pID , ID U pID
qU q
Comme AΓ pID , ID
c
q “ O et AΓ pID , ID q “ I on obtient
U “ U pID q.
ApID , :qU
Résoudre le système linéaire AU U “ B est alors équivalent à calculer U pID q par (3.14) et déterminer U pID
c
q
en résolvant le système linéaire (3.15).
Q. 16 1. Ecrire le programme EDP2D02 permettant de résoudre numériquement l'EDP (3.1)-(3.2) à l'aide
du schéma discrétisé (3.3) à (3.7) que l'on résoudra par (3.14) et (3.15). On choisira judicieusement les
données permettant sur une même gure de représenter de la solution numérique et de la solution exacte,
et sur une autre gure de représenter l'erreur entre les deux solutions.
2. Ecrire le programme ordreEDP2D02 permettant de retouver numériquement l'ordre du schéma utilisé. ‚
13