-
Notifications
You must be signed in to change notification settings - Fork 0
/
gauss_seidel.m
96 lines (87 loc) · 3.09 KB
/
gauss_seidel.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
% Autor: Juan Carlos Estevez Vargas
% Canal de Youtube: Apuntes de un Ingeniero
% Actualizado: 11/junio/2022
% ------- DESCRIPCIÓN ----------------------------------------------------
% Resuelve sistemas de ecuaciones por el método de Gauss-Seidel.
% ------------------------------------------------------------------------
% ------- ESTA FUNCION PIDE LOS SIGUIENTES DATOS DE ENTRADA: -------------
% A = Matriz a operar; ejemplo [1 10 4 -2;8 0 -10 2;8 3 1 17;11 7 -3 2]
% b = Vector columna Solución; ejemplo [2 ;-7 ;8 ;12];
% tol = Tolerancia o error máximo permitido; ejemplo 0.001
% imax = Número máximo de iteraciones permitidas; ejemplo 300
% ------------------------------------------------------------------------
% ------- VARIABLES DE SALIDA: -------------------------------------------
% Tabla con las iteraciones realizadas y sus respectivos valores.
% -----------------------------------------------------------------------
function x=gauss_seidel(A,b,tol,imax)
n=max(size(A)); % Obtenemos de la matriz A
% el número de ecuaiones
% y por ende de incognitas.
c=diag(A); % Almacenamos en 'c' los elementos
% de la diagonal principal.
d=1;
i=1;
while (d~=0)&&(i<n) % revisamos si en la diagonal principal 'c'
d=c(i,1)*c(i+1,1); % existe algún elemento igual a 0.
i=i+1; % En caso de que lo haya
end % salir del bucle y d=0.
while d==0 % Si se ha detectado algún cero en la
B(1,:)=A(n,:); % diagonal principal se entra en este bucle
U(1,1)=b(n,1); % para así cambiar las filas. Se alternarán
for i=2:n % las filas hasta que todos los elementos
B(i,:)=A(i-1,:);% de la diagonal principal
U(i,1)=b(i-1,1);% sean distintos de cero.
end % Todo esto para evitar una división
A=B; % por cero. Aunque se recomienda
b=U; % siempre ordenar las ecuaciones apriori.
c=diag(A);
d=1;i=1;
while (d~=0)&&(i<n)
d=c(i,1)*c(i+1,1);
i=i+1;
end
end
% Se selecciona un vector X(n,1) sólo para evaluar
% el error en la primera iteración.
for i=1:n
X(i,1)=b(i,1)/A(i,i);
end
% se sespecifica el vector x(n,1) con valores iguales a cero
% para iniciar las iteraciones.
x=zeros(n,1);
err=tol+1;
iter=1;
% Se inician las iteraciones
while (tol<err)&&(iter<imax)
for i=1:n
if i==1
sum=0;
for j=i+1:n
sum=A(i,j)*x(j,1)+sum;
end
x(i,1)=(b(i,1)-sum)/A(i,i);
end
if i==n
sum=0;
for j=i-1:-1:1
sum=A(i,j)*x(j,1)+sum;
end
x(i,1)=(b(i,1)-sum)/A(i,i);
end
if 2<=i<=n-1
sum1=0;
for j=i+1:n
sum1=A(i,j)*x(j,1)+sum1;
end
sum2=0;
for j=i-1:-1:1
sum2=A(i,j)*x(j,1)+sum2;
end
x(i,1)=(b(i,1)-sum1-sum2)/A(i,i);
end
end
err=abs((x-X)./x);
err=max(err);
X=x;
iter=iter+1;
end