tarea
-
Upload
kevin-carrillo-reina -
Category
Documents
-
view
3 -
download
0
description
Transcript of tarea
Programación y métodos numéricos tarea 6
Kevin Steven Carrillo Reina
25 de octubre de 2015
Índice
1. Problema 2
2. Solución 2
3. Conclusiones 4
1
1. Problema
Básicamente el problema consiste en comparar la velocidad de convergencia del método de Jacobi y el método de
Gauss-Siedel y posteriormente, determinar cual es más eficiente.
Téngase en cuenta que trabajamos con un código que considera una tolerancia dada, de modo que es necesario que
los códigos de cada método tenga la misma tolerancia.
2. Solución
En principio se deben realizar los códigos con cada método, considerando un mismo problema y a su vez un mismo
parámetro de tolerancia de aproximación, con el fin de comparar ambos métodos de modo acertado.
Ahora bien, se han realizado dos códigos, los cuales se ven a continuación convenientemente explicados: (el primero
maneja método de Jacobi y el segundo maneja método de Gauss-Siedel).
function y2=mijacobi(N);
tic; (cuenta tiempo desde este momento)
A1=diag(ones(N,1)); A2=diag(ones(N-1,1),-1); A3=diag(ones(N-1,1),1);
A=2*A1-A2-A3; (condiciona la matriz de un modo conveniente)
b=ones(N,1);
M=diag(diag(A)); % M Jacobi
%M=tril(A); % M Gauss-Siedel
Nmax=100000; tolres=0.00001; tolinc=0.00001;
x0=zeros(N,1); (propone número de iteraciones u la tolerancia)
for i=1:Nmax
r=b-A*x0; (a partir de un x0 dado se aplica el método de iteración
delta=M\r; con el fin de determinar x1 donde después actualiza valores
x1=x0+delta; para que el ciclo no sea inútil
if( norm(r)<tolres )
fprintf( ’ok en %d pasos\n’,i); (si la norma de r es menor que la tolerancia dada
y2=i; anteriormente, se rompe el ciclo y se guarda el número
break; de la iteración como imágen de la función
end
x0=x1; se actualiza valor
end
toc; para de contar tiempo durante el proceso
2
tic;
A1=diag(ones(N,1)); A2=diag(ones(N-1,1),-1); A3=diag(ones(N-1,1),1);
A=2*A1-A2-A3;
b=ones(N,1);
%-----------------------
M=tril(A); (triangular inferior)
Nmax=100000;
tolres=0.00001;
x0=zeros(N,1); (vector dado)
for i=1:Nmax
r=b-A*x0;
delta=M\r; (se aplica el método, pero ahora con la matriz triangular inferior)
x1=x0+delta;
if(norm(r)<tolres)
fprintf(’ok con en %d pasos\n’,i);
y1=i; (se guarda el número que arroja la función)
break;
end
(ES BÁSICAMENTE EL MISMO CÓDIGO PERO CON M COMO UNA MATRIZ TRIANGULAR INFERIOR)
x0=x1;
end
x0;
toc;
puesto que la imagen de la función es el número de la iteración que hace que r sea menor que la tolerancia dada,
entonces es posible asociar el tamaño de la matriz a al número de iteración, posteriormente graficarlo y ver cómo varia
el número de iteraciones que son necesarias para matrices cada vez más grandes.
Tal idea se puede representar con el siguiente código (explicado linea a linea):
3
function comparacion(K)
for i=2:K (vamos a considerar que el K dado, representa el orden de la matriz (cuadrada))
y1=gausssiedel(i); (calcula el número de iteraciones)
v11(i)=i; (forma un vector desde 2 hasta k)
v12(i)=y1; (forma un vector desde la primera imágen de la función hasta la k-ésima imágen)
y2=mijacobi(i); (calcula el número de iteraciones)
v22(i)=y2; (forma un vector desde la primera imágen de la función hasta la k-ésima imágen)
end
xlabel("tamano de matriz")
ylabel("numero de iteraciones necesario")
plot(v11,v12,’r’) (grafica las dos gráficas simultaneamente)
hold on
plot(v11,v22,’g’)
VÉASE LA IMÁGEN EN LA ÚLTIMA PÁGINA
3. Conclusiones
la gráfica muestra que el método de Gauss-Siedel es más eficiente que el método de Jacobi, sobre todo cuando
consideramos matrices cuadradas de un orden grande.
4