laboratorio 2 metodos numericos uni

14
1 UNI – FIM MB536 - METODOS NUMERICOS VERANO 2011 LABORATORIO 2: SISTEMAS DE ECUACIONES LINEALES PROGRAMA 1.- Archivo para multiplicar matrices % Archivo para multiplicar matrices % C = A*B; donde A, B son matrices y C es la matriz resultado function C = Multiplica_Matriz(A, B) [M,K] = size(A); [K1,N] = size(B); if K1 ~= K error('El numero de columnas de A no es igual al número de columnas de B') else for m = 1:K for n = 1:K C(m,n) = A(m,1)*B(1,n); for k = 2:K C(m,n) = C(m,n) + A(m,k)*B(k,n); end end end end PROGRAMA 2: Elimacion de Gauss Resolver el sistema 2 x 1 + x 2 3 x 3 =−1 x 1 +3 x 2 +2 x 3 =12 3 x 1 + x 2 3 x 3 = 0 % Archivo que implementa la Eliminacion de Gauss function x = EliminacionGauss(AA,b) % Datos % AA es la matriz de coeficientes

Upload: peter-pittman

Post on 23-Nov-2015

60 views

Category:

Documents


1 download

TRANSCRIPT

1

UNI FIMMB536 - METODOS NUMERICOSVERANO 2011

LABORATORIO 2: SISTEMAS DE ECUACIONES LINEALES

PROGRAMA 1.- Archivo para multiplicar matrices

% Archivo para multiplicar matrices% C = A*B; donde A, B son matrices y C es la matriz resultadofunction C = Multiplica_Matriz(A, B)[M,K] = size(A);[K1,N] = size(B);if K1 ~= K error('El numero de columnas de A no es igual al nmero de columnas de B')else for m = 1:K for n = 1:K C(m,n) = A(m,1)*B(1,n); for k = 2:K C(m,n) = C(m,n) + A(m,k)*B(k,n); end end endend

PROGRAMA 2: Elimacion de GaussResolver el sistema

% Archivo que implementa la Eliminacion de Gaussfunction x = EliminacionGauss(AA,b)% Datos% AA es la matriz de coeficientes% A es la matriz aumentada% b es el vector de la mano derecha% n es el orden de la matriz% Resultados% x es el vector solucion del sistema[n n]= size(AA);x = zeros(n,1);A = [AA b'];n1 = n +1;% Fase I: Elimnacion hacia adelantefor i = 1:n if A(i,i) == 0 A = Intercambio(A,i); end for k = i+1:n Pivote = A(k,i)/A(i,i); for j = i:n1 A(k,j) = A(k,j) - Pivote*A(i,j); end endend% Fase II: Sustitucion hacia atrasx(n) = A(n,n1)/A(n,n);for i = n-1:-1:1 suma = A(i,n1); for j = i+1:n suma = suma - A(i,j)*x(j); end x(i) = suma/A(i,i);end

function A = Intercambio(A,i)% Datos% A es la matriz% n es el orden de la matriz% Resultados% A es la nueva matriz despues del intercambio[n n1] = size(A);k = i + 1;while (k A=[2 -1 1;-3 4 -1;1 -1 1];>> b=[4 5 6];>> Crout(A,b)

A =

2 -1 1 -3 4 -1 1 -1 1

L =

1.0000 0 0 -1.5000 1.0000 0 0.5000 -0.2000 1.0000

U =

2.0000 -1.0000 1.0000 0 2.5000 0.5000 0 0 0.6000

y =

4.0000 11.0000 6.2000

x =

-2.0000 2.3333 10.3333

ans =

-2.0000 2.3333 10.3333

PROGRAMA 4: Normas matriciales

En Matlab existe la funcin norm(A) que devuelve la norma de la matriz A. por ejemplo para la matriz del problema anterior se tiene

norm(A)

ans =

5.7866

Podemos escribir archivos M, que nos averiguen la norma de una matirz

% Averiguar la norma de una matrizfunction norma = NormaMatrizMax(A)% Datos% A es la matriz% n es el numero de elementos% Resultados% norma es el valor de la norma o cuantificacion de la Matriz[n,n] = size(A);norma = -inf; % inf esta predefinida en Matlabfor i = 1:n for j = 1:n if (norma < abs(A(i,j))) norma = abs(A(i,j)); end endend

% Norma suma-fila de una matrizfunction norma = NormaSumaFila(A)% Datos% A es la matriz% n es el numero de elementos% Resultados% norma es el valor de la norma suma fila de la Matriz[n,n] = size(A);norma = -inf; % inf esta predefinida en Matlabfor i = 1:n suma = 0; for j = 1:n suma = suma + abs(A(i,j)); end if (norma < suma) norma = suma endend

Ejercicios:1. Escribir una funcin que averige la norma suma columna de una matriz2. Escribir una funcin que averige la norma de Frobenius de una matriz

PROGRAMA 5: CONDICIONAMIENTO DE UN SISTEMAAntes de aplicar un mtodo de solucin a un sistema de ecuaciones lineales, es conveniente averiguar el buen condicionamiento del sistema. Los nmeros de condicin indican el buen o mal condicionamiento de un sistema. Cuando un sistema tiene un nmero de condicin grande o muy grande se dice que se trata de un sistema mal condicionado. Los sistemas mal condicionados son especialmente sensibles a los errores de redondeo en los clculos por lo que la solucin que encuentre un mtodo aplicado al sistema no es confiable. Para un sistema mal condicionado un cambio pequeo en uno o algunos de los coeficientes o en el vector de la mano derecha, ocasiona un gran cambio en el vector solucin, debido a su mal condicionamiento.

En Matlab se tiene la funcin predefinida cond(A) que averigua el nmero de condicin de la Matriz A. La funcion cond toma valores de 1 a infinito. Inversamente la funcin rcond toma valores de 0 a 1, correspondiendo los prximos a 0 a matrices mal condicionadas y los prximos a 1, a matrices bien condicionadas.

Ejemplo Analizar el condicionamiento de los siguientes sistemas de ecuaciones lineales

A)

B)

SOLUCION

A) La solucin de este sistema es x = 2 e y = 1. Si hallamos el nmero de condicin de la matriz A, tenemos

>> A=[3 1;3 1.0001];>> cond(A)

ans =

6.6667e+004

Encontramos que tiene un numero de condicin bastante grande para ser una matriz pequea de tamao 2x2.

Ahora si hacemos el siguiente cambio al sistema en la segunda ecuacin en su trmino independiente a 6.9999

Se encuentra que la solucin es x = 8/3 e y = -1, que es una solucin completamente distinta de la original.

B) Para este sistema de ecuaciones averiguamos su nmero de condicin:

>> B=[0.003,1;3,1];>> cond(B)

ans =

3.3740

Se observa que el nmero de condicin es pequeo los cual indica que se trata de un sistema bien condicionado.

La matriz de Hilbert es un caso tpico de una matriz mal condicionada. El siguiente cdigo o Script de Matlab lo demuestra:

% Matriz de Hilbert y el condicionamiento del sistemafunction Hilbert()% Datos% A es la matriz de Hilbert% n es el orden de la matriz% Resultados% c es el numero de condicionclc; % Limpiar consolafor n = 2: 10 for i = 1: n for j = 1:n A(i,j) = 1/(i+j); end end c = cond(A); % numero de condicion de A d = det(A); % Determinante de A fprintf('n=5%d cond(A) = %30.10f det(A) = %12.8f\n',n,c,d);end

>>Hilbert

n=52 cond(A) = 38.4740084270 det(A) = 0.01388889n=53 cond(A) = 1353.2870054487 det(A) = 0.00002315n=54 cond(A) = 45880.4755481736 det(A) = 0.00000000n=55 cond(A) = 1535043.8953291299 det(A) = 0.00000000n=56 cond(A) = 51098162.9616707560 det(A) = 0.00000000n=57 cond(A) = 1697836314.6026618000 det(A) = 0.00000000n=58 cond(A) = 56391871376.8134770000 det(A) = 0.00000000n=59 cond(A) = 1873544749653.0254000000 det(A) = 0.00000000n=510 cond(A) = 62306611012222.7110000000 det(A) = 0.00000000>>

PROGRAMA 6: ITERACION DE JACOBIResolver mediante la iteracin de Jacobi el siguiente sistema, usando como solucin inicial

>> A=[5 -1 1;2 8 -1;-1 1 4];>> b=[10 11 3];>> P=[0 0 0]';>> Jacobi(A,b,P)

ans =

2.0000 1.0000 1.0000

% Metodo iterativo de Jacobifunction x = Jacobi(A,b,P)% Datos% A es la matriz invertible de orden nXn% b es el vector de la mano derecha% P es el vector solucion inicial% delta es la tolerancia para P% maxiter es el numero maximo de iteraciones% Resultados% x es el vector solucion generado por el metodo iterativo de % Jacobidelta = 0.00005;maxiter = 50;n = length(b);for k = 1: maxiter for j = 1:n x(j)=(b(j)-A(j,[1:j-1,j+1:n])*P([1:j-1,j+1:n]))/A(j,j); end err = abs(norm(x'-P)); relerr = err/(norm(x) + eps); P = x'; if (err < delta) | (relerr < delta) break endendx = x';

PROGRAMA 7: ITERACION DE GAUS SEIDEL

Resolver mediante la iteracin de Gauss-Seidel el siguiente sistema, usando como solucin inicial

function x = Gauss_Seidel(A,b,P)% Datos% A es la matriz invertible de orden nXn% b es el vector de la mano derecha% P es el vector solucion inicial% delta es la tolerancia para P% maxiter es el numero maximo de iteraciones% Resultados% x es el vector solucion generado por el metodo iterativo de % Gauss-Seideldelta = 0.00005;maxiter = 50;n = length(b);for k = 1: maxiter for j = 1:n if j==1 x(1)=(b(1)-A(1,2:n)*P(2:n))/A(1,1); elseif j == n x(n)=(b(n)-A(n,1:n-1)*(x(1:n-1))')/A(n,n); else % x contiene la k-esima aproximacion % p es la (k-1)-esima x(j)=(b(j)-A(j,1:j-1)*x(1:j-1)-A(j,j+1:n)*P(j+1:n))/A(j,j); end end err = abs(norm(x'-P)); relerr = err/(norm(x) + eps); P = x'; if (err < delta) | (relerr < delta) break endendx = x';