3.5 Método de Gauss-Seidel
Este método es iterativo o de aproximación y es similar a las técnicas para obtener raíces vistas en el tema anterior. Aquellos métodos consisten en la determinación de un valor inicial a partir del cual, mediante una técnica sistemática se obtiene una mejor aproximación a la raíz. La razón por la cual los métodos iterativos son útiles en la disminución de los errores de redondeo en sistemas, se debe a que un método de aproximación se puede continuar hasta que converga dentro de alguna tolerancia de error previamente especificada. Las técnicas iterativas se emplean rara vez para resolver problemas de dimensiones pequeñas ya que el tiempo requerido para lograr una precisión suficiente excede al de las técnicas directas. Sin embargo, para sistemas grandes con un gran porcentaje de ceros, ésta técnica es eficiente. Los sistemas de este tipo surgen frecuentemente en la solución numérica de problemas de valores frontera y de ecuaciones diferenciales parciales.Este método iterativo utiliza la misma transformación que el método de Jacobi, de hecho es una mejora al método de Jacobi.
La mejora consiste en utilizar la incógnita encontrada, en la misma iteración para calcular la siguiente incógnita. Por ejemplo, en el método de Jacobi se obtiene en el primer cálculo xi+1, pero este valor de x no se utiliza sino hasta la siguiente iteración.
En el método de Gauss-Seidel en lugar de eso se utiliza de xi+1 en lugar de xi en forma inmediata
para calcular el valor de yi+1 de igual manera procede con las siguientes variables; siempre se utilizan las variables recien calculadas.
Entrada el número de ecuaciones o incógnitas n; los elementos de axn de la matriz A; los elementos bi, 1 ? i ? n de b; los elementos X0i, 1 ? i ? n de X0 = x0;
la tolerancia Es (error sugerido); el número máximo de iteraciones, iter.
Algoritmo:
1) Se debe despejar da cada ecuación despejar la variable sobre la diagonal principal.
2) Dar un valor inicial a las incógnitas (X generalmente se establecen ceros).
3) Sustituir los valores iniciales en la primera ecuación para obtener un nuevo valor para la primera incógnita.
4) Ese nuevo valor es usado para obtener el valor de la siguiente incógnita. Este procedimiento se repite hasta obtener los nuevos valores de todas las incógnitas despejadas.
5) Se evalúa la aproximación relativa de todas las incógnitas hasta que la solución converja bastante cerca de la solución real, según la tolerancia establecida para el método.
Se puede observa que los resultados obtenidos son prácticamente iguales a los obtenidos con los métodos directos y con el método de Jacobi, con la ventaja de un número menor de iteraciones.
CODIGO:
Método de Gauss-Seidel
Este
método es básicamente igual al método de Jacobi, la principal diferencia es que
cada valor calculado de xk es usado para recalcular el valor de xk+1
por ende converge más rápido a la solución que el método de Jacobi.
Matricialmente se define igual que Jacobi.
X(k+1)=Tg
Xk+Cg
Pero:
Tg=(D-L)-1U
Cg=(D-L)-1b
Al
igual que Jacobi este método es particularmente eficiente cuando se tienen
matrices diagonal dominante estrictamente y definidas positivas. De no ser el
caso se puede verificar que el radio espectral de Tg sea menor que 1 y por ende
convergiría para cualquier aproximación inicial de X.
El
método se itera hasta que || X(k+1)- Xk||<tolerancia
Pseudocódigo
gauss-seidel
Lea
A,b,n,x0,tol,D,L,U,radioespectral
para i=1hasta n
si A(i,i)>sum(abs(A(i,1:(i-1))))
+ sum(abs(A(i,(i+1):n)))
sino
muestre ('A no es de Diagonal
Estrictamente Dominante, puede que no converja')
fin si
fin si
Nmax=100;
T=(D-L)^-1*U
C=(D-L)^(-1)*(b);
si
radioespectral>=1
muestre('El Radio espectral de la matriz de
iteracion es mayor o igual a 1el método no converge')
paro=1;
terminar
end
i=1;
error=tol+1;
mientras i<=Nmax o
error>tol
x=T*x0+C;
error=norma(x-x0);
i=i+1;
x0=x;
fin mientras
si error<tol
muestre ('La solucion es: x ')
else
muestre: Fracaso en i iteraciones.
Fin si
MATHLAB:
function [solucion,num_iteraciones]=metodo_jacobi(A,B,punto_inicial,error)
cont_iteraciones=0;
s=size(A);
num_ecuaciones=s(1);
for k=1:num_ecuaciones
B(k)=B(k)/A(k,k);
A(k,:)=A(k,:)/A(k,k);
A(k,k)=0;
end
M=-A;
x_ant=punto_inicial';
x_sig=M*x_ant+B;
deltax_n=x_sig-x_ant;
while norm(deltax_n,inf) > error
x_sig=M*x_ant+B;
deltax_n=x_sig-x_ant;
x_ant=x_sig;
cont_iteraciones=cont_iteraciones+1;
end
solucion=x_sig;
num_iteraciones=cont_iteraciones;
end
Comentarios
Publicar un comentario