Méthode de surrelaxation successive / Matlab / Analyse numérique

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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

$$\left\{ \begin{array}{l} {x_1} - 5{x_2} = - 4\\ 7{x_1} - {x_2} = 12 \end{array} \right.$$
où je peux appliquer cette méthode (Conditions Gauss-Seidel) ).

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 !

+0 -0

Je n'ai jamais fait de surrelaxation successive, il me semble ne jamais l'avoir vu non plus, mais tout de même quelques petites questions :

  • déjà c'est qui ton N et pourquoi tu ne l'utilises jamais ?
  • pourquoi séparer ton résultat en 2 avec x et y plutôt que d'avoir un vecteur avec 2 composantes ?
  • pourquoi tu gardes les valeurs de x et y pour toutes les itérations ?

Sinon il me semble que tu ne peux pas faire w/A(1,1) et que tu dois faire quelque chose comme w(:,:)/A(1,1) bétise

Édité par backmachine

+1 -0
Auteur du sujet

Bonjour,

J'ai dis une bétise… Voici une version update, pourriez-vous me dire ce qui est OK / pas OK ? Ca ne fonctionne toujours pas mais je pense être proche…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
function [X] = SOR(A,B,w, x0, It)  %Solving a linear system Ax = B 

%A = input ( ' Enter matrix A :   \n')
[l , c ] = size (A);
%while (l ~= c) % check for matrix A (it should be a square matrix)
 %   disp('Matrix A should be a square matrix otherwise SOR method cannont be applied!')
%end
x=x0;
for k = 1:It %numberIt = number of iterations
 for i = 1:l
  s = 0;
    for j = 1:c
        if i ~= j
        s = s + A(i,j)*x(i);
        end
    end
    x(i) = (1-w)*x(i)+ w/A(i,i)*(B(i) - s);
  end
end
X = x;
end
+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte