Dados los sistemas de ecuaciones lineales:
A =
\[\begin{bmatrix} 7x_1 & + & x_2 & - & x_3 & + & 2x_4 & = & 3 \\ x_1 & + & 8x_2 & & & - & 2x_4 & = & -5 \\ -x_1 & & & + & 4x_3 & - & x_4 & = & 4 \\ 2x_1 & - & 2x_2 & - & x_3 & + & 6x_4 & = & -3 \end{bmatrix}\]B =
\[\begin{bmatrix} 7x_1 & + & 3x_2 & - & x_3 & + & 2x_4 & = & -1 \\ 3x_1 & + & 8x_2 & + & x_3 & - & x_4 & = & 0 \\ -x_1 & + & x_2 & + & 4x_3 & - & x_4 & = & -3 \\ 2x_1 & - & 4x_2 & - & x_3 & + & 6x_4 & = & 1 \end{bmatrix}\]Obtener las soluciones analíticas de los sistemas.
A = [7 1 -1 2;
1 8 0 -2;
-1 0 4 -1
2 -2 -1 6;];
ba = [3;-5;4;-3];
xA = A\ba
B = [7 3 -1 2;
3 8 1 -4;
-1 1 4 -1
2 -4 -1 6;];
bb = [-1;0;-3;1];
xB = B\bb## xA =
##
## 1.0000
## -1.0000
## 1.0000
## -1.0000
##
## xB =
##
## -1.0000
## 1.0000
## -1.0000
## 1.0000
Usando los métodos de Jacobi y Gauss-Seidel resolver los sistemas dados con cuatro decimales de exactitud usando programas para estos fines.
Solución mediante el método de Jacobi
A = [7 1 -1 2;
1 8 0 -2;
-1 0 4 -1
2 -2 -1 6;];
b = [3;-5;4;-3];
% Factorizamos la matriz de coeficientes
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
% Creamos un vector x para nuestra primera aproximación
x = zeros(size(b));
% Valores para la tolerancia y máximo de iteraciones
tol = sqrt(eps);
k_max = 300;
% Método de Jacobi
for k = 1:k_max,
x(:, k+1) = D\(L+U)*x(:,k) + D\b;
if norm(x(:, k+1) - x(:,k)) < tol, break;
endif
er = norm(x(:, k+1) - x(:,k));
endfor
% Solución iterativa
fprintf('Solucion iterativa: ')
disp(transpose(x(:,k)))
% Número de iteraciones
fprintf('Numero de iteraciones: ')
disp(k)
% Error de aproximación
fprintf('Error de aproximacion: ')
disp(er)## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 27
## Error de aproximacion: 2.2294e-08
A = [7 3 -1 2;
3 8 1 -4;
-1 1 4 -1
2 -4 -1 6;];
b = [-1;0;-3;1];
% Factorizamos la matriz de coeficientes
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
% Creamos un vector x para nuestra primera aproximación
x = zeros(size(b));
% Valores para la tolerancia y máximo de iteraciones
tol = sqrt(eps);
k_max = 300;
% Método de Jacobi
for k = 1:k_max,
x(:, k+1) = D\(L+U)*x(:,k) + D\b;
if norm(x(:, k+1) - x(:,k)) < tol, break;
endif
er = norm(x(:, k+1) - x(:,k));
endfor
% Solución iterativa
fprintf('Solucion iterativa: ')
disp(transpose(x(:,k)))
% Número de iteraciones
fprintf('Numero de iteraciones: ')
disp(k)
% Error de aproximación
fprintf('Error de aproximacion: ')
disp(er)## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 127
## Error de aproximacion: 1.6881e-08
Solución mediante el método de Gauss-Seidel
A = [7 1 -1 2;
1 8 0 -2;
-1 0 4 -1
2 -2 -1 6;];
b = [3;-5;4;-3];
% Factorizamos la matriz de coeficientes
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
% Creamos un vector x para nuestra primera aproximación
x = zeros(size(b));
% Valores para la tolerancia y máximo de iteraciones
tol = sqrt(eps);
k_max = 300;
% Gauss-Seidel Method
for k = 1:k_max,
x(:, k+1) = (D+L)\U*x(:,k) + (D+L)\b;
if norm(x(:, k+1) - x(:,k)) < tol, break;
endif
er = norm(x(:, k+1) - x(:,k));
endfor
% Solución iterativa
fprintf('Solucion iterativa: ')
disp(transpose(x(:,k)))
% Número de iteraciones
fprintf('Numero de iteraciones: ')
disp(k)
% Error de aproximación
fprintf('Error de aproximacion: ')
disp(er)## Solucion iterativa: 0.6827 -0.5909 0.7780 -0.2051
## Numero de iteraciones: 15
## Error de aproximacion: 1.7918e-08
A = [7 3 -1 2;
3 8 1 -4;
-1 1 4 -1
2 -4 -1 6;];
b = [-1;0;-3;1];
% Factorizamos la matriz de coeficientes
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
% Creamos un vector x para nuestra primera aproximación
x = zeros(size(b));
% Valores para la tolerancia y máximo de iteraciones
tol = sqrt(eps);
k_max = 300;
% Gauss-Seidel Method
for k = 1:k_max,
x(:, k+1) = (D+L)\U*x(:,k) + (D+L)\b;
if norm(x(:, k+1) - x(:,k)) < tol, break;
endif
er = norm(x(:, k+1) - x(:,k));
endfor
% Solución iterativa
fprintf('Solucion iterativa: ')
disp(transpose(x(:,k)))
% Número de iteraciones
fprintf('Numero de iteraciones: ')
disp(k)
% Error de aproximación
fprintf('Error de aproximacion: ')
disp(er)## Solucion iterativa: -0.292588 0.042046 -0.629822 0.146077
## Numero de iteraciones: 23
## Error de aproximacion: 2.9262e-08
Escriba un código para el método iterativo SOR.
Solución utilizando algoritmo SOR
A = [7 1 -1 2;
1 8 0 -2;
-1 0 4 -1
2 -2 -1 6;];
b = [3;-5;4;-3];
% Factorizamos la matriz de coeficientes
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
% Creamos un vector x para nuestra primera aproximación
x = zeros(size(b));
% Valores para la tolerancia y máximo de iteraciones
tol = sqrt(eps);
k_max = 500;
% SOR method
K=[];
for w = 1:0.1:2,
for k = 1:k_max,
T = inv(D-w*L)*(w*U+(1-w)*D);
c = w*inv(D-w*L)*b;
x(:, k+1) = T*x(:,k) + c;
if norm(x(:, k+1) - x(:,k)) < tol, break;
endif
er = norm(x(:, k+1) - x(:,k));
endfor
% Factor de relajación
fprintf('Factor de relajacion: ')
disp(w)
% Solución iterativa
fprintf('Solucion iterativa: ')
disp(transpose(x(:,k)))
% Número de iteraciones
fprintf('Numero de iteraciones: ')
disp(k)
% Error de aproximación
fprintf('Error de aproximacion: ')
disp(er)
fprintf('\n')
K(end+1)=k;
endfor## Factor de relajacion: 1
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 15
## Error de aproximacion: 2.7794e-08
##
## Factor de relajacion: 1.1000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 10
## Error de aproximacion: 5.6819e-08
##
## Factor de relajacion: 1.2000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 14
## Error de aproximacion: 1.6329e-08
##
## Factor de relajacion: 1.3000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 17
## Error de aproximacion: 3.3459e-08
##
## Factor de relajacion: 1.4000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 22
## Error de aproximacion: 2.9455e-08
##
## Factor de relajacion: 1.5000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 29
## Error de aproximacion: 2.3657e-08
##
## Factor de relajacion: 1.6000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 39
## Error de aproximacion: 2.0421e-08
##
## Factor de relajacion: 1.7000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 55
## Error de aproximacion: 2.0059e-08
##
## Factor de relajacion: 1.8000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 86
## Error de aproximacion: 2.2426e-08
##
## Factor de relajacion: 1.9000
## Solucion iterativa: 1.0000 -1.0000 1.0000 -1.0000
## Numero de iteraciones: 183
## Error de aproximacion: 1.6358e-08
##
## Factor de relajacion: 2
## Solucion iterativa: -0.078768 -0.871861 0.337966 0.386312
## Numero de iteraciones: 500
## Error de aproximacion: 3.0998
A = [7 3 -1 2;
3 8 1 -4;
-1 1 4 -1
2 -4 -1 6;];
b = [-1;0;-3;1];
% Factorizamos la matriz de coeficientes
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
% Creamos un vector x para nuestra primera aproximación
x = zeros(size(b));
% Valores para la tolerancia y máximo de iteraciones
tol = sqrt(eps);
k_max = 500;
% SOR method
K=[];
for w = 1:0.1:2,
for k = 1:k_max,
T = inv(D-w*L)*(w*U+(1-w)*D);
c = w*inv(D-w*L)*b;
x(:, k+1) = T*x(:,k) + c;
if norm(x(:, k+1) - x(:,k)) < tol, break;
endif
er = norm(x(:, k+1) - x(:,k));
endfor
% Factor de relajación
fprintf('Factor de relajacion: ')
disp(w)
% Solución iterativa
fprintf('Solucion iterativa: ')
disp(transpose(x(:,k)))
% Número de iteraciones
fprintf('Numero de iteraciones: ')
disp(k)
% Error de aproximación
fprintf('Error de aproximacion: ')
disp(er)
fprintf('\n')
K(end+1)=k;
endfor## Factor de relajacion: 1
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 68
## Error de aproximacion: 1.5127e-08
##
## Factor de relajacion: 1.1000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 54
## Error de aproximacion: 2.0446e-08
##
## Factor de relajacion: 1.2000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 43
## Error de aproximacion: 1.6626e-08
##
## Factor de relajacion: 1.3000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 31
## Error de aproximacion: 2.4399e-08
##
## Factor de relajacion: 1.4000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 22
## Error de aproximacion: 3.2733e-08
##
## Factor de relajacion: 1.5000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 29
## Error de aproximacion: 2.1949e-08
##
## Factor de relajacion: 1.6000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 38
## Error de aproximacion: 2.3513e-08
##
## Factor de relajacion: 1.7000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 54
## Error de aproximacion: 2.3015e-08
##
## Factor de relajacion: 1.8000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 86
## Error de aproximacion: 1.4929e-08
##
## Factor de relajacion: 1.9000
## Solucion iterativa: -1.0000 1.0000 -1.0000 1.0000
## Numero de iteraciones: 184
## Error de aproximacion: 1.5418e-08
##
## Factor de relajacion: 2
## Solucion iterativa: -1.4158 1.3524 -1.9505 1.7627
## Numero de iteraciones: 500
## Error de aproximacion: 1.7006
Trace la gráfica del número de iteraciones para la convergencia contra los valores de w. ¿Qué valor de w da como resultado la convergencia más rápida?
Para el 1er sistema de ecuaciones la convergencia más rápida se alcanzó con w = 1.1, con 10 iteraciones. Mientras que el 2do sistema requirió w = 1.4 , para 22 iteraciones.
Compare con los resultados obtenidos mediante los tres métodos iterativos.
En la siguiente tabla podemos ver la cantidad de iteraciones requerida para convergencia en cada uno de los tres métodos utilizados.
| 1er Sistema | 2do Sistema | |
|---|---|---|
| Jacobi | 27 | 127 |
| Gauss-Seidel | 15 | 23 |
| SOR | 10 | 22 |