practicas de matlab - sistemas lineales

9
LABORATORIO DE COMPUTACIÓN CIENTÍFICA (Prácticas) Curso 2009-10 1 MÓDULO 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 través de las funciones intrínsecas cond, rcond o condest. Haciendo uso de las tres funciones anteriores, escribe una función llamada condicion.m que nos diga los valores de los tres números de condición, 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 próximo a cero)

Upload: daniel-diego-horcajuelo

Post on 24-Sep-2015

14 views

Category:

Documents


8 download

DESCRIPTION

Practicas de Computacion científica, UCM

TRANSCRIPT

  • 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