Está en la página 1de 9

LABORATORIO DE COMPUTACIN CIENTFICA (Prcticas)

Curso 2009-10

MDULO SE: SISTEMAS DE ECUACIONES


Alumno: Daniel Diego Horcajuelo
Lee detenidamente los enunciados. Copia las funciones y scripts que crees a lo largo de la practica, as
como los resultados de las ejecuciones en este documento .
SE.1. Condicionamiento de una matriz con MATLAB.
Matlab incorpora funciones para conocer el condicionamiento de un sistema de ecuaciones a travs de las
funciones intrnsecas cond, rcond o condest.
Haciendo uso de las tres funciones anteriores, escribe una funcin llamada condicion.m que nos diga los
valores de los tres nmeros de condicin, y del determinante de la matriz:
0.832 x1 - 0.448 x2 = 1
0.784 x1 + 0.421 x2 = 0
Considera la matriz A del sistema y el vector independiente b como variables de entrada.
function [valorcond,valorrcond,valorcondest,determinante]=condicion(A,b)
valorcond=cond(A);
valorrcond=rcond(A);
valorcondest=condest(A);
determinante=det(A);
>> A=[0.832 0.448;0.784 0.421]; b=[1 0]';
>> [cond,rcond,condest,det]=condicion(A,b)
cond =
1.7550e+003
rcond =
4.6411e-004
condest =
2.1547e+003
det =
-9.6000e-004

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)

SE.2. Sistemas Fciles de Resolver


Crea una funcin en Matlab que permita resolver un sistema de ecuaciones triangular inferior por el mtodo
de sustituciones progresivas. Llama a la funcin sp.m y disala de tal modo que reciba como parmetros de
entrada la matriz de coeficientes y un vector columna que contenga los trminos independientes, y devuelva
como salida un vector columna con las soluciones del sistema. Aplica la funcin creada para obtener la
solucin del sistema:

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

SE.3. Factorizacin LU (opcional)


Escribe un programa que permita obtener las matrices correspondientes a la factorizacin LU, a partir de la
matriz de coeficientes de un sistema de ecuaciones lineales. Aplcalo a la resolucin del sistema,
0.5 x1 2 x2 2.5 x3 3 x4 24
0.7 x1 5.2 x2 3 x3 x4 6.1
0.8 x1 6 x2 3.4 x3 2 x4 9

2.1x1 3.2 x2 4.5 x3 2.3 x4 4.2

LABORATORIO DE COMPUTACIN CIENTFICA (Prcticas)

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

LABORATORIO DE COMPUTACIN CIENTFICA (Prcticas)

Curso 2009-10

SE.4. Mtodos Iterativos


Sea la siguiente funcin

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)

Escrbela usando el editor de Matlab y gurdala como fichero jacobi1.m

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

2. Escribe un script de Matlab que ejecute la funcin jacobi.m para el sistema


3x+y+z=4
2x+5y+1z=-1
-x+y+3z=4
con una tolerancia de 0.001. Guarda el script como sistema.m. Este script debe incluir la presentacin en
pantalla de los pasos o iteraciones sucesivas, mostrando los valores de nmero de iteracin s, los valores
de las incgnitas xi(s+1) (i=1,...n) y el error entre x(s+1) y x(s).
A=[3 1 1;2 5 1;-1 1 3]; b=[4 -1 4]'; x0=zeros(3,1);
x=jacobi1(A,b,x0); %realiza una primera iteracin
it=1;
fprintf('x1= %f x2= %f x3= %f e= %f it= %i\n',x(1),x(2),x(3),norm(x-x0),it)
while norm(x-x0)>1e-3
it=it+1;
x0=x;
x=jacobi1(A,b,x0); %llama a la funcin jacobi1.m que realiza una iteracin
fprintf('x1= %f x2= %f x3= %f e= %f it= %i\n',x(1),x(2),x(3),norm(x-x0),it)
end
x %muestra el resultado
clear A b it x0

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

SE.5. Utiliza el programa jacobi.m, para resolver el sistema de ecuaciones:


x+2y+3z=4
4x+5y+6z=-1
7x+8y+9z=4
partiendo de (0,0,0) como aproximacin inicial de la solucin.
>>A=[1 2 3;4 5 6;7 8 9]; b=[4 -1 4]'; x0=zeros(3,1);
>>jacobi(A,b,x0,1e-3)
x =
NaN
NaN
-Inf

El mtodo no converge
Qu soluciones obtienes? Si obtienes soluciones incorrectas o no te permite calcular la solucin modifica

jacobi.m para que el programa funcione correctamente


Escribe el conjunto de sentencias que has incorporado al programa jacobi.m, especificando slo entre qu
sentencias se encuentra, es decir escribe la lnea anterior, conjunto de sentencias nuevas y lneas
posterior que tenas de tu programa de jacobi.m.

SE.6.Teniendo en cuenta tu programa de jacobi.m determina la solucin del siguiente sistema,


2x-2y = 4
2x+3y-z=-1

-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

tol, partiendo de un valor x0 como aproximacin inicial a la solucin y w como peso.


Nota: Con aadir en tu programa jacobi.m la sentencia de amortiguamiento tras la sentencia que define el
mtodo de jacobi es suficiente.
Aplica tu funcin al sistema de ecuaciones anterior con una tolerancia de 0.001, un peso de 0.9 y vector
solucin inicial [0;0;0].
El programa en esencia es exactamente igual que el mtodo de Jacobi normal, pero aadiendo una iteracin
amortiguada, para ello emplearemos una funcin auxiliar inline que la realiza

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