INTRODUCCIÓN
INTRODUCCIÓN
En
En el
el pr
pres
esen
ente
te do
docum
cumen
ento
to se
se ex
expl
plic
ica
a de
deta
tallllad
adam
amen
ente
te El
El
Método
Método de Gauss-
de Gauss-Seidel
Seidel..
Este es u
Este es uno de los m
no de los métod
étodos mas inte
os mas interesan
resantes sien
tes siendo
do una
una
h
he
errrra
am
miie
en
ntta
a iim
mp
po
orrtta
an
ntte
e
d
de
el
l a
an
ná
álliissiis
s n
nu
um
mé
érriicco
o yy
p
pa
arrttiiccu
ua
alm
lme
en
ntte
e ú
úttiil
l yya
a q
qu
ue
e n
no
os
s p
pe
errm
miitte
e e
en
ncco
on
nttrra
ar
r lla
a
sso
ollu
ucciió
ón
n d
de
e u
un
n ssiisstte
em
ma
a d
de
e ““n
n”
” e
eccu
ua
acciio
on
ne
es
s cco
on
n ““n
n””
incógnitas.
incógnitas.
Norm
Normalme
almente
nte este
este tem
tema
a tie
tiene
ne proc
procesos
esos larg
largos
os y
y por
por ell
ello
o
son ideales para programar por
son ideales para programar por computadora
computadora a través de
a través de
prog
programa
ramas com
s como M
o Mat.
at. LAB
LAB y v
y visual
isual Basi
Basic
c y n
y no s
o solam
olamente
ente
pa
para
ra ha
hace
cerl
rlos
os so
sob
bre
re e
el
l pa
pap
pel
el.
. Pr
Prog
ogra
ram
mar
ar es
esto
tos
s te
tem
mas
as
permite incluso obtener una mejor comprensión de la
permite incluso obtener una mejor comprensión de la teoría
teoría
aquí
OBJETIVOS
OBJETIVO GENERAL
Comprender las diferentes formas de solucionar
sistemas de ecuaciones lineales por medio del
método de descomposición de Gauss-Seidel.
OBJETIVOS ESPECÍFICOS
tener una idea clara y comprensible del método de
descomposición de Gauss-Seidel.
Mostrar cómo aplicar el método ya mencionado para
facilitar la solución de sistemas de ecuaciones
Elaborando
ejercicios con los
conocimientos
Método de gauss Seidel
en análisis numérico el método de gauss-Seidel es un método iterativo utilizado para resolver sistemas de ecuaciones lineales este método es similar al método de Jacobi.
Mientras que en el de Jacobi se utiliza el valor de las incógnitas para determinar una nueva aproximación, en el de Gauss-Seidel se va utilizando los valores de las incógnitas recién calculados en la misma iteración, y no en la siguiente.
Es un método iterativo, lo que significa que se parte de una aproximación inicial y se repite el proceso hasta llegar a una solución con un margen de error tan pequeño como se quiera.
Bien proseguiré con la explicación del método y luego aclararé los detalles necesarios para determinar la eficacia del mismo.
Teniendo el siguiente sistema de ecuaciones:
Despejamos x1 de la ecuación 1, x2 de la ecuación 2,…, xn de la ecuación n, quedando:
Desde la formula anterior resultan las fórmulas que se deberán ir aplicando en las diferentes iteraciones.
Para comenzar a aplicar el método debemos asignar un valor arbitrario a las variables x2,…xn con el fin de obtener x1.
Lo más conveniente en este caso es que comiencen en cero, lo cual nos facilitaría el trabajo ya que se reduce el cálculo de las primeras soluciones, entonces de esto resulta que:
Ahora despejamos x2 de la ecuación 2 y reemplazamos a x1 por el valor obtenido en la ecuación anterior. De esto nos queda:
Una vez que tenemos x2, despejamos x3 de la ecuación 3 y así sucesivamente con la n ecuaciones, cada vez asignando el valor de las x1, x2,… xn-1 obtenido en el paso anterior.
Cuando hemos despejado las xn, tenemos lo que se conoce como primera solución o solución de la primera iteración:
Con los nuevos valores de x1, x2,…,xn aplicamos los mismos pasos anteriores pero con los nuevos valores de las xn, de esta manera conseguimos una segunda solución:
Al tener esta segunda solución estamos en condiciones de calcular el error que se calcula como sigue:
PROBLEMA:
Usar el método de Gauss-Seidel para aproximar la solución del sistema:Hasta que
:SOLUCIÓN:
Primero se despejan las incógnitas x1, x2 y x3 de las ecuaciones 1, 2 y 3 respectivamente. Se tiene:
Estas son el juego de fórmulas iterativas que se estará utilizando.
Se comienza el proceso iterativo.
sustituyendo los valores de x2 = x3 = 0 en la primera ecuación,
para calcular el valor de x1:
Ahora se sustituye y x3 = 0 en la segunda ecuación
para obtener x2:
Ahora se sustituye y en la tercera
ecuación para obtener x3:
Puesto que todavía no se puede calcular ningún error aproximado, se repite el proceso pero ahora con los últimos datos obtenidos para las incógnitas:
Sustituyendo y en la ecuación 1 se obtiene Sustituyendo y en la ecuación 2 se obtiene Finalmente, sustituyendo y en la
ecuación 3 se obtiene .
Es así como se tiene la segunda lista de valores de aproximación a la solución del sistema:
Ahora se pueden calcular los errores absolutos para cada una de las incógnitas:
Ya que no se ha logrado el objetivo se debe repetir el mismo proceso con los últimos valores obtenidos omitiendo los pasos intermedios,
Nótese que aunque el error aproximado ya cumple con ser menor al 1%, esto se debe cumplir para los tres errores aproximados:
En este caso se tienen los siguientes errores aproximados:
Se puede observar que ahora se ha cumplido el objetivo para cada uno de los errores aproximados. Por lo tanto, se concluye que la solución aproximada es:
Programa para resolver el método de gauss
seidel
Ahora mostraré un ejemplo, mediante el uso de un programa hecho en Visual Basic para aplicar el método. El programa podrá ser descargado desde aqui. Para que todos los puedan ver y tratar de entender el funcionamiento del método.Al iniciar el programa índico que la matriz de coeficientes es de 3 filas y 3 columnas (la matriz siempre tiene que ser cuadrada). Entonces supongamos los siguientes coeficientes:
Luego cargo la matriz “b” que es la que contiene el valor de los resultados de las ecuaciones:
Hago clic en el botón verificar convergencia y si el programa me dice que se verifica, indico cuantas iteraciones quiero realizar y pulso en el botón “Calcular solución”.
De esta forma el programa me arroja la solución del sistema (el valor de x1, x2,…xn) y me muestra el error, denominado por el programa como “Norma Infinito”.
Se puede apreciar que la norma infinito no las muestra en notación científica, ya que es un error muy pequeño.
También el programa tiene la opción de guardar todas las iteraciones que hizo, hasta llegar a la última.
Codificación del programa #include <stdio.h> #include <math.h> #include <iostream.h> #include <conio.h> #define L 10 #define P L float A[L][P],MATRIZ[L][P],VECTOR[L],X[L],CX[L],C[L],RESULTADOS[L],tabla[1000]; float a, b, c, d, e, f; int it,ini,n,x,y,z,cont=0; void Gauss_Seidel(int n) { for(x=0;x<n;x++) { CX[x]=0; X[x]=0; } for(y=0;y<n;y++) {
for(x=0;x<n;x++) //Ingreso de la matriz A {
cout<<"A["<<y<<"]["<<x<<"] = "; cin>>e;
A[y][x]=e;
MATRIZ[y][x]=e; //esta es la matriz q no varia }
cout<<"Y la constante C["<<y<<"] = "; cin>>f;
C[y]=f;
VECTOR[y]=f; //este es el vector que no se modifica }
int sum=0,cont=0,reglon=0;
for(int i=0;i<n;i++) //se suma la diagonal principal sum=sum+abs(A[i][i]);
for(i=0;i<n;i++) //se compara cada reglon con el valor de la diagonal { for(int j=0;j<n;j++) reglon=reglon+abs(A[i][j]); if(reglon<=sum) cont++; reglon=0; } int temp[L][P],H[P];
if(cont!=n) //aqui se realiza el pivoteo { for(i=0;i<n;i++) { for(int j=i;j<n;j++) { int d,e; d=abs(A[i][i]); e=abs(A[j][i]); if(d<e) { for(int z=0;z<n;z++) { temp[i][z]=A[i][z]; A[i][z]=A[j][z]; A[j][z]=temp[i][z]; } H[i]=C[i]; H[j]=C[j]; C[i]=H[j]; C[j]=H[i]; } } } } i=0; for(it=0;it<100;it++)
{ for(y=0;y<n;y++) { for(x=0;x<n;x++) CX[y]-=(A[y][x]*X[x])/A[y][y]; CX[y]+=(C[y]/A[y][y]); X[y]=CX[y];
tabla[i]=CX[y]; //tabla sirve para imprimir la tabla de resultados i++; } } } void titulo(int n) { int o=10,i=1; clrscr(); for(i=1;i<n+1;i++) { o=o+10; gotoxy(o,3); cout<<"X"<<i; } gotoxy(15,4);cout<<"---"; } void resultados() { int q=0,i=1,t=3,s=n,r=0; int sw=0,w=0,ite=0,h=0; while((sw==0)&&(w<20)) { h=0; while(h<n) { if(tabla[r]==tabla[r+s]) { cont++; } if(cont==n) sw=1; r++; s++; h++; } ite++; w++; } w=ite-1; for(int j=0;j<w;j++) { t=t+2; if((i%10==0)) { textcolor(LIGHTRED+BLINK); gotoxy(5,t-2);
cprintf("\n\n Presione una tecla para ver la siguiente parte de la tabla!!! "); getch(); textcolor(GREEN); clrscr(); t=5; titulo(n); } gotoxy(15,t);cout<<i<<"ø"; int y=20,z=0; for(int r=0;r<n;r++) { gotoxy(y+z,t);cout<<tabla[q]; q++; z=z+10; } i++; } }
void main() {
textcolor(GREEN); clrscr();
cout<<" Solucion de ecuaciones simultaneas\n\n\n Metodo de Gauss-Seidel"; cout<<"\n\n Cuantas incognitas tendra el sistema: ";
scanf("%d",&n); Gauss_Seidel(n); titulo(n);
resultados();
cout<<"\n\nLos resultado son "; for(x=0;x<n;x++) { RESULTADOS[x]=X[x]; cout<<"\nX["<<x<<"]= "<<RESULTADOS[x]; }