Está en la página 1de 13

MDULO SE: SISTEMAS DE ECUACIONES Alumno: 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 [nc,rnc,conds,detr]=condicion(A) nc=cond(A) rnc=rcond(A) conds=condest(A) detr=det(A) end

>> A=[0.832, -0.448;0.784,+0.421] A= 0.8320 -0.4480 0.7840 nc = 1.8658 rnc = 0.3391 conds = 2.9486 detr = 0.7015 0.4210 >> condicion(A)

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 diseala 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.5x1-2x2=3.5 -x1+0.5x2+3x3=9
function [x] = sp(A,I) [f,c]=size(A); if f~=c error('la matriz de coeficientes no es cuadrada') end x=zeros(f,1); for i=1:f x(i)=I(i); for j=1:i-1 x(i)=x(i)-A(i,j)*x(j); end x(i)=x(i)/A(i,i); end end

>> A=[1,0,0;0.5,2,0;-1,0.5,3] A= 1.0000 0.5000 -1.0000 0 2.0000 0.5000 0 0 3.0000

>> I=[1;3.5;9] I= 1.0000

3.5000 9.0000 >> [X]=sp(A,I) X= 1.0000 1.5000 3.0833 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.5x1+2x2+2.5x3+3x4=24 0.7x1+5.2x2-3x3+x4=6.1 0.8x1-6x2+3.4x3-2x4=-9 2.1x1+3.2x2-4.5x3+2.3x4=4.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.

>> A=[0.5,2,2.5,3;0.7,5.2,-3,1;0.8,-6,3.4,-2;2.1,3.2,-4.5,2.3] A= 0.5000 0.7000 2.0000 2.5000 3.0000 1.0000

5.2000 -3.0000

0.8000 -6.0000 2.1000

3.4000 -2.0000 2.3000

3.2000 -4.5000

>> b=[24;6.1;-9;4.2] b= 24.0000 6.1000 -9.0000 4.2000


function [x]= regresivas(A,b) [f,c]=size(A); if f~=c error('la matriz de coeficientes no es cuadrada') end x=zeros(f,1) for i=f:-1:1 x(i)=b(i); for j=f:-1:i+1 x(i)=x(i)-A(i,j)*x(j) end x(i)=x(i)/A(i,i); end end function [L,U,P,X]=factlu(A,b) nc=cond(A); [L,U,P]=lu(A) Pb=P*b; z=sp(L,Pb); X=regresivas(U,z); end

>> [L,U,P,X]=factlu(A,b) L= 1.0000 0.3810 0 1.0000 0 0 1.0000 0.3211 0 0 0 1.0000

0.2381 -0.1715 0.3333 -0.5726 U= 2.1000

3.2000 -4.5000

2.3000

0 -7.2190 0 0 P= 0 0 1 0 X= 1.0000 2.0000 3.0000 4.0000 0 0 0 1 0 1 0 0 1 0 0 0 0 0

5.1143 -2.8762 1.9591

4.4485

0 -2.0424

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: 3x+y+z=4 2x+5y+1x=-1 -x+y+3z=4 >> [x]=jacobi1(A,b,x0) L= 0 2 -1 U= 0 0 0 D= 3 0 0 x= 1.3333 0 5 0 0 0 3 1 0 0 1 1 0 0 0 1 0 0 0

-0.2000 1.3333 Para ello, ejecuta la funcin, tras asignar por pantalla los valores numricos a las variables de entrada 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 funcion jacobi1.m indicada anteriormente. 2- Escribe un script de Matlab que ejecute la funcin jacobi.m para el sistema 3x+y+z=4 2x+5y+1x=-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 entre x
(s+1) (s+1)

(i=1,...n) y el error

yx .

(s)

>> A=[3,1,1;2,5,1;-1,1,3]; >>b=[4;-1;4]; >>x0=[0;0;0]; >> tol=0.001;


function [xs1]=jacobi(A,b,x0,tol) xs=x0 xs1=jacobi1(A,b,x0) tolf=norm(xs1-xs) it=1 while tol<tolf xs=xs1; xs1=jacobi1(A,b,xs); tolf=norm(xs1-xs) it=it+1 end end

xs = 0.9997 -1.0003 2.0000 tolf = 6.3243e-004 it = 9 xs1 = 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. 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. A=[1,2,3;4,5,6;7,8,9]; b=[4;-1;4]; x0=[0;0;0]; tol=0.001; xs = 1.0e+308 * -Inf -1.7414 -1.5784 tolf = NaN

it = 757 xs1 = NaN Inf Inf Modificamos jacobi.m y jacobi1.m para solucionar el error que nos lleva a un bucle infinito. Ya que el mtodo de Jacobi converge si H es menor que 1 (H=D-1*(L+U)), si H es mayor que 1, entonces el sistema no converge y no da soluciones. El cdigo de jacobi1.m quedara:
function [xs1,H]=jacobi1(A,b,x0) L=A-triu(A) U=A-tril(A) D=diag(diag(A)) H=inv(D)*(L+U); xs1=inv(D)*(b-(L+U)*x0) end Linea modificada

Linea creada.

y jacobi.m quedar:
function [xs1]=jacobi(A,b,x0,tol) xs=x0; [xs1,H]=jacobi1(A,b,x0); Hmax=max(abs(eig(H))) tolf=norm(xs1-xs); it=1; if Hmax<1 while tol<tolf xs=xs1; xs1=jacobi1(A,b,xs); tolf=norm(xs1-xs) it=it+1 end else disp('No converge') end end

Linea modificada Linea creada Linea creada

Linea creada Linea creada Linea creada

>> [xs1]=jacobi(A,b,x0,tol) Hmax = 2.5616 No converge xs1 = 4.0000 -0.2000 0.4444

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?. A=[2,-2,0;2,3,-1;-5,0,2] b=[4;-1;4] x0=[0;0;0] tol=0.01 >> [xs1]=jacobi(A,b,x0,tol) xs1 = 2.0000 -0.3333 2.0000

Hmax = 1.0826 No converge xs1 = 2.0000 -0.3333 2.0000

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].
function [xs1]=jacobi_amor(A,b,x0,w,tol) n=size(A,1); xs=x0; D=diag(diag(A)); U=A-tril(A); L=A-triu(A); I=eye(n); f=w*D^-1*b; H=-w*D^-1*(L+U)+(1-w)*I; Hmax=max(abs(eig(H))); xs1=f+H*xs; tolf=norm(xs1-xs); it=1; if Hmax<1 while tol<tolf xs=xs1; xs1=f+H*xs; tolf=norm(xs1-xs); it=it+1; fprintf('\n iteraciones=%i xs=%f xs,xs1,tolf) end else disp('No converge') end

xs1=%f

error=%f',it,

xs = 2.8003 0.7995 9.0006 xs1 = 2.7996 0.7999 9.0008

tolf = 8.7554e-004 it = 135 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. Como solo pide una iteracin en el mtodo de Gauss-Seidel, el cdigo puede quedar asi:
function [xs1]=gseidel(A,b,xs) n=size(A,1); D=diag(diag(A)); U=A-tril(A); L=A-triu(A); f=(D+L)^(-1)*b; H=-(D+L)^(-1)*U; xs1=f+H*xs; tolf=norm(xs1-xs); it=1; end

>> [xs1]=gseidel(A,b,x0) xs1 = 2.0000 -1.6667 7.0000 Para realizer este metodo iterativamente, entonces el codigo quedara:
function [xs1]=gseidel(A,b,xs,tol) n=size(A,1); D=diag(diag(A)); U=A-tril(A); L=A-triu(A); f=(D+L)^(-1)*b; H=-(D+L)^(-1)*U; Hmax=max(abs(eig(H))); xs1=f+H*xs; tolf=norm(xs1-xs);

it=1; if Hmax<1 while tol<tolf xs=xs1; xs1=f+H*xs; tolf=norm(xs1-xs); it=it + 1; end else disp('No Converge') end end

>> [xs1]=gseidel(A,b,xs) No Converge xs1 = 2.0000 -1.6667 7.0000