Bonjour,
J'essaye d'appliquer en Matlab un algorithme que j'ai vu pour résoudre les systèmes linéaires de façon linéaire, la méthode de surrelaxation successive. J'ai d'abord essayé de l'appliquer dans le cas $n = 2$ avec ce code Matlab:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function x = SOR(A,B) %Solving a linear system Ax = B A = [5, -1; 1, 2]; B = [5;12]; N = 10; w(1,0) = 0; for i=0:10 w(1,i+1) = w(1,i) + 0.2; %Relaxation parameter taking the values 0.2, 0.4,...,2. end i = 1; %let's suppose w = 0.2 for now x(0,1) = 0; y(0,1) = 0; %initial condition to start for k=1:10 x(k,1) = (1-w(1,i))*x(k-1,1)+(w/A(1,1))(B(1,1) - A(1,2)*y(k-1,1); %All the values of x are stored in a vector x. (After 1 iteration -> x(1,1) y(k,1) = (1-w(1,i))*y(k-1,1)+(w/A(2,2))(B(2,1) - A(2,1)*x(k,1); %Same for y, the second unknown. end end |
Est-ce propre et est-ce que ça vous semble correct ? Il fait la gueule au niveau de la ligne
1 | x(k,1) = (1-w(1,i))*x(k-1,1)+(w/A(1,1))(B(1,1) - A(1,2)*y(k-1,1); |
Et je vois pas pourquoi… ( le système tenté est
Maintenant, j'aimerais par la suite généraliser ce code à n équations de n inconnues. J'ai vu sur Wikipedia que $ A = L + U + D$ du coup je me disais qu'on aurait pu utiliser les fonctions diag et tril (triangulaire inférieure) D = diag(A); L = tril(A)- D; %Lower U = triu(A)- D; %Upper Mais après je vois pas spécialement comment continuer de façon simple et concise. La formule originale donne une somme de somme…
Merci d'avance !