practicas de matlab - sistemas lineales
DESCRIPTION
Practicas de Computacion científica, UCMTRANSCRIPT
-
LABORATORIO DE COMPUTACIN CIENTFICA (Prcticas) Curso 2009-10 1
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 2 3
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 2
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 3
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 x2= -0.200000 x3= 1.333333 e= 1.896195 it= 1 x1= 0.955556 x2= -1.000000 x3= 1.844444 e= 1.021739 it= 2 x1= 1.051852 x2= -0.951111 x3= 1.985185 e= 0.177401 it= 3
x1= 0.988642 x2= -1.017778 x3= 2.000988 e= 0.093218 it= 4 x1= 1.005597 x2= -0.995654 x3= 2.002140 e= 0.027897 it= 5 x1= 0.997838 x2= -1.002667 x3= 2.000417 e= 0.010599 it= 6
x1= 1.000750 x2= -0.999219 x3= 2.000168 e= 0.004520 it= 7 x1= 0.999683 x2= -1.000334 x3= 1.999990 e= 0.001553 it= 8 x1= 1.000115 x2= -0.999871 x3= 2.000006 e= 0.000632 it= 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