Académique Documents
Professionnel Documents
Culture Documents
Curso 2009-10
Podemos concluir que el sistema est muy mal condicionado, y ello se debe a que la matriz de coeficientes es casi
singular (su determinante es prximo a cero)
x1 1
0.5 x1 2 x2 3.5
x1 0.5 x2 3 x3 9
function x=sp(A,b)
%
%x=sp(A,b) Resuelve el sistema de ecuaciones Ax=b, siempre que A sea
%triangular inferior, por el algoritmo de sustitucin progresiva
%
%Valores de entrada:
%
A: Matriz triangular inferior del sistema
%
b: vector columna parte derecha del sistema
%
%Valores de salida:
%
x: solucin del sistema de ecuaciones (vector)
%
[m,n]=size(A); %medimos el tamao de A y almacenamos su n de filas y columnas en m y n
if m~=n
error('La matriz del sistema debe ser cuadrada')
end
x=zeros(1,n); %definimos con anterioridad el tamao del vector solucin por eficiencia
computacional
for k=1:n
x(k)=b(k);
for i=1:k-1
x(k)=x(k)-A(k,i)*x(i);
end
x(k)=x(k)/A(k,k);
end
>> A=[1 0 0;0.5 -2 0;-1 0.5 3]; b=[1 -3.5 9]'
>> x=sp(A,b)
x =
1
Curso 2009-10
NOTA: Matlab suministra una funcin propia para el clculo de la factorizacin LU, con pivoteo de filas. La
sintaxis es, [L,U,P]=lu(A); donde L es una matriz triangular inferior, U una matriz triangular superior y P es la
matriz de permutaciones que da cuenta del cambio de orden aplicado a las ecuaciones del sistema, P*A=LU.
La funcin en Matlab debe admitir como entradas la matriz de coeficientes de un sistema y un vector columna
con los trminos independientes, y debe devolver, las matrices L, U y P y un vector columna con las
soluciones del sistema.
function [L,A]=mi_lu(A)
%
%[L,A]=mi_lu(A) Aplica el algoritmo de reduccin progresiva a la matriz A
%para obtener su descomposicin LU
%sistema Ax=b
%
%Valores de entrada
%
A: Matriz
%
%Valores de salida
%
L: Matriz triangular inferior
%
A: Matriz triangular superior
%
L=eye(size(A));
for k=1:(size(A)-1)
for i=k+1:size(A)
L(i,k)=A(i,k)/A(k,k);
for j=k:size(A)
A(i,j)=A(i,j)-L(i,k)*A(k,j);
end
end
end
Curso 2009-10
function [x]=jacobi1(A,b,x0)
%
% x=jacobi1(A,b,x0). Aplica UNA iteracin del mtodo iterativo de Jacobi
%
al sistema de ecuaciones A. x = b, usando x0 como valor
%
de la aproximacin a la solucin en la iteracin anterior.
% Valores de entrada: A (matriz con los coeficientes del sistema)
%
b (vector COLUMNA con los trminos independientes del sistema)
%
x0 (vector COLUMNA con la aproximacin a la solucin en la iteracin anterior)
% Valores de salida: x (nueva aproximacin a la solucin)
%
L=A-triu(A)
U=A-tril(A)
D=diag(diag(A))
x=inv(D)*(b-(L+U)*x0)
Partiendo de (0,0,0) como aproximacin inicial de la solucin (x0), determina la primera solucin del
sistema de ecuaciones:
Para ello, ejecuta la funcin, tras asignar por pantalla los valores numricos a las variables de entrada
Podemos realizar varias iteraciones con el programa ejecutndolo varias veces con diferentes x0.
>>A=[3,1,1;2,5,1;-1,1,3]; b=[4 -1 4]'; x0=[0,0,0]';
>>jacobi1(A,b,x0);
>>jacobi1(A,b,ans) %Vamos aplicando una iteracin varias veces hasta llegar a la
solucin
ans =
1.0000
-1.0000
2.0000
1. Escribe una funcin jacobi.m, con estructura x=jacobi(A,b,x0,tol), de modo que resuelva el sistema
de ecuaciones A.x=b por el mtodo iterativo de Jacobi hasta conseguir un error inferior (usar el
comando matlab norm) a la tolerancia tol y partiendo de un valor x0 como aproximacin inicial a la
solucin. La funcin debe llamar en su interior a la funcin jacobi1.m indicada anteriormente.
function x=jacobi(A,b,x0,tol)
%
%x=jacobi1(A,b,x0,tol) Resuelve el sistema de ecuaciones Ax=b utilizando el
%mtodo de Jacobi hasta que el error este dentro de la tolerancia
%
%Valores de entrada
%
A: Matriz del sistema de ecuaciones
%
b: Vector columna parte derecha del sistema de ecuaciones
%
x0: Aproximacin inicial a la solucin
%
tol: Factor de convergencia o tolerancia
%
%Valores de salida
%
x: Solucin del sistema dentro de la tolerancia
%
x=jacobi1(A,b,x0); %realiza una primera iteracin
it=1;
while norm(x-x0)>tol
x0=x;
x=jacobi1(A,b,x0); %llama a la funcin jacobi1.m que realiza una iteracin
it=it+1;
disp([x' norm(x-x0) it]);
end
Si llamamos al script:
>> sistema
x1= 1.333333
x1= 0.955556
x1= 1.051852
x1= 0.988642
x1= 1.005597
x1= 0.997838
x1= 1.000750
x1= 0.999683
x1= 1.000115
x2=
x2=
x2=
x2=
x2=
x2=
x2=
x2=
x2=
-0.200000
-1.000000
-0.951111
-1.017778
-0.995654
-1.002667
-0.999219
-1.000334
-0.999871
x3=
x3=
x3=
x3=
x3=
x3=
x3=
x3=
x3=
1.333333
1.844444
1.985185
2.000988
2.002140
2.000417
2.000168
1.999990
2.000006
e=
e=
e=
e=
e=
e=
e=
e=
e=
1.896195
1.021739
0.177401
0.093218
0.027897
0.010599
0.004520
0.001553
0.000632
it=
it=
it=
it=
it=
it=
it=
it=
it=
1
2
3
4
5
6
7
8
9
x =
1.0001
-0.9999
2.0000
El mtodo no converge
Qu soluciones obtienes? Si obtienes soluciones incorrectas o no te permite calcular la solucin modifica
-5x+2z=4
Qu ocurre?
Itera constantemente hasta que da unos valores de infinito o NaN
SE.7. Escribir una funcin x=jacobi_amor(A,b,x0,w,tol) que resuelva el sistema de ecuaciones A.x = b por
el mtodo iterativo Jacobi amortiguado, hasta conseguir un error de convergencia inferior a la tolerancia
function x=jacobi_amor(A,b,x0,w,tol)
%
%x=jacobi_amor(A,b,x0,w,tol) Resuelve el sistema de ecuaciones Ax=b utilizando el
%mtodo de Jacobi amortiguado (peso w)
%
%Valores de entrada
%
A: Matriz del sistema de ecuaciones
%
b: Vector columna parte derecha del sistema de ecuaciones
%
x0: Aproximacin inicial a la solucin
%
w: peso
%
tol: Factor de convergencia o tolerancia
%
%Valores de salida
%
x: Solucin del sistema dentro de la tolerancia
%
x=jaw(A,b,x0,w);
it=1;
while norm(x-x0)>tol
x0=x;
x=jaw(A,b,x0,w);
it=it+1;
fprintf('x1= %f x2= %f x3= %f e= %f it= %i\n',x(1),x(2),x(3),norm(x-x0),it)
end
function xk1=jaw(A,b,xk,w)
%Funcion auxiliar
%xk1=ja(A,b,xk,w) Aplica una iteracin de Jacobi amortiguada al sistema de ecuaciones
%Ax=b
%usando como aproximacin a la solucin en la iteracin anterior xk
%
%Valores de entrada
%
A: Matriz del sistema de ecuaciones
%
b: Vector columna parte derecha del sistema de ecuaciones
%
xk: Aproximacin a la solucin en la iteracin anterior
%
w: peso
%
%Valores de salida
%
xk1: Aproximacin a la solucin tras aplicar Jacobi
%
D=diag(diag(A)); L=A-triu(A); U=A-tril(A);
xk1=w*(inv(D)*b-inv(D)*(L+U)*xk)+(1-w)*xk; %iteracin amortiguada
Ahora empleamos este programa para hallar la solucin del sistema dado
>>A=[2 -2 0;2 3 -1;-5 0 2]; b=[4 -1 4]'; x0=zeros(3,1);
>>x=jacobi_amor(A,b,x0,0.9,1e-3)
x =
2.7996
0.7999
9.0008
Tras 135 iteraciones, que hemos omitido en esta pgina por motivos obvios
SE.8. Gauss-Seidel (opcional) Escribe, en un anexo, una funcin llamada xs1 = gseidel(A,b,xs) que
realice una iteracin de Gauss-Seidel sobre el sistema de ecuaciones anterior.
function x=gseidel(A,b,x0,tol)
%
%x=gs(A,b,x0,tol) Resuelve el sistema de ecuaciones Ax=b, utilizando el
%metodo de Gauss-Seidel, hasta que el error este dentro de la tolerancia
%Valores de entrada
%
A: Matriz del sistema de ecuaciones
%
b: Vector columna parte derecha del sistema de ecuaciones
%
x0: Aproximacin inicial a la solucion
%
tol: Factor de convergencia o tolerancia
%
%Valores de salida
%
x: Solucion del sistema dentro de la tolerancia
%
x=gauss_seidel(A,b,x0);
it=1;
while abs(x-x0)>tol
x0=x;
x=gauss_seidel(A,b,x0);
it=it+1;
end
fprintf('\nN de iteraciones:%i\n',it)
function xk1=gauss_seidel(A,b,xk)
%Funcion auxiliar que realiza una iteracin de gauss seidel
D=diag(diag(A)); L=A-triu(A); U=A-tril(A); %obtenemos matrices diagonal y
estrictamente inferior y superior
xk1=inv(D+L)*b-inv(D+L)*U*xk; %iteracin