Laboratorio 2 Metodos Numericos UNI

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 11

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 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
end
end


PROGRAMA 2: Elimacion de Gauss
Resolver el sistema



% Archivo que implementa la Eliminacion de Gauss
function 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'];
2

n1 = n +1;
% Fase I: Elimnacion hacia adelante
for 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
end
end
% Fase II: Sustitucion hacia atras
x(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<=n) & (A(k,i)==0)
k = k + 1;
end
if k <= n
for j = 1 : n1
temp = A(i,j);
A(i,j) = A(k,j);
A(k,j) = temp;
end
end




3

PROGRAMA 3: Algoritmo de Crout
Resolver mediante Crout el siguiente sistema

(



)(

) (

)


function x = Forward(A,b)
% Datos
% A es la matros de coeficientes
% b es el vector de la mano derecha
% n es el orden de la matriz
% Resultados
% x es el vector solucion
n = length(b);
x = zeros(n,1);
x(1) = b(1)/A(1,1);
for i = 2:n
suma = b(i);
for j = 1: i-1
suma = suma - A(i,j)*x(j);
end
x(i) = suma / A(i,i);
end


function x = BackSust(A,b)
% Datos
% A es la matros de coeficientes
% b es el vector de la mano derecha
% n es el orden de la matriz
% Resultados
% x es el vector solucion
n = length(b);
x = zeros(n,1);
x(n) = b(n)/A(n,n);
for k = n-1: -1: 1
x(k) = b(k);
for j = k+1 : n
x(k) = x(k) - A(k,j)*x(j);
end
x(k) = x(k)/A(k,k);
end


4


% Implementacion del algoritmo de Descomposicion de CROUT
% Crout realiza la descomposicion o factorizacion LU para resolver
% un sistema de ecuaciones lineales.
function x = Crout(A,b)
% Datos
% A es la matriz de coeficientes
% b es el vector de la mano derecha
% n es el orden de la matriz
% L es la matriz Lower
% U es la matriz Upper
% Resultados
% x es el vector solucion
n = length(b);
L = zeros(n,n);
U = zeros(n,n);
x = zeros(n,1);
y = zeros(n,1);
for i = 1:n
L(i,i) = 1;
end
for j = 1:n
for i = 1:j
suma = A(i,j);
for k = 1: i-1
suma = suma -L(i,k)*U(k,j);
end
U(i,j) = suma;
end
for i = j+1:n
suma = A(i,j);
for k = 1:j-1
suma = suma - L(i,k)*U(k,j);
end
L(i,j) = suma/U(j,j);
end
end
A % devolver A
L % devolver L
U % devolver U
y = Forward(L,b); % llamar a la eliminacion hacia adelante
y % devolver y
x = BackSust(U,y); % Llamar a la sustitucion hacia atras
x % devolver x


>> A=[2 -1 1;-3 4 -1;1 -1 1];
>> b=[4 5 6];
>> Crout(A,b)

5

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




6

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 matriz
function 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 Matlab
for i = 1:n
for j = 1:n
if (norma < abs(A(i,j)))
norma = abs(A(i,j));
end
end
end



% Norma suma-fila de una matriz
function 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 Matlab
for i = 1:n
suma = 0;
for j = 1:n
suma = suma + abs(A(i,j));
end
7

if (norma < suma)
norma = suma
end
end


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


PROGRAMA 5: CONDICIONAMIENTO DE UN SISTEMA
Antes 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)
8


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 sistema
function Hilbert()
% Datos
% A es la matriz de Hilbert
% n es el orden de la matriz
% Resultados
% c es el numero de condicion
clc; % Limpiar consola
for n = 2: 10
for i = 1: n
for j = 1:n
A(i,j) = 1/(i+j);
9

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.01388889
n=53 cond(A) = 1353.2870054487 det(A) = 0.00002315
n=54 cond(A) = 45880.4755481736 det(A) = 0.00000000
n=55 cond(A) = 1535043.8953291299 det(A) = 0.00000000
n=56 cond(A) = 51098162.9616707560 det(A) = 0.00000000
n=57 cond(A) = 1697836314.6026618000 det(A) = 0.00000000
n=58 cond(A) = 56391871376.8134770000 det(A) = 0.00000000
n=59 cond(A) = 1873544749653.0254000000 det(A) = 0.00000000
n=510 cond(A) = 62306611012222.7110000000 det(A) = 0.00000000
>>


PROGRAMA 6: ITERACION DE JACOBI
Resolver 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 Jacobi
10

function 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
% Jacobi
delta = 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
end
end
x = 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
11

% Resultados
% x es el vector solucion generado por el metodo iterativo de
% Gauss-Seidel
delta = 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
end
end
x = x';

También podría gustarte