Está en la página 1de 50

Universidad Santa María

Facultad de Ingeniería
Programación II
Profesor: Francisco Fuentes

Métodos de Solución de Sistemas


de Ecuaciones Lineales

Febrero, 2016
CONTENIDO

 Métodos Directos (Exáctos)

 Métodos Iterativos (Aproximados)


Métodos Directos (Exáctos)

 Método de Gauss

 Método de Gauss-Jordan
METODO
DE
GAUSS
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

Sea un sistema de ecuaciones lineales de orden n de


la forma:
a11x1 + a12x2 + a13x3 + ... + a1nxn = b1
a21x1 + a22x2 + a23x3 + ... + a2nxn = b2
. . . . .
. . . . .
. . . . .
an1x1 + an2x2 + an3x3 + ... + annxn = bn
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

Este sistema de ecuaciones lineales de orden n lo


podemos escribir matricialmente como:

A x = b, Ec. 1 , donde:
a11 a12 a13 ... a1n b1 x1
a21 a22 a23 ... a2n b2 x2
A= . . . . b= . x= .
an1 an2 an3 ... ann bn xn
Método de Gauss para calcular la Solución de
un Sistema de Ecuaciones Lineales

Retomando la Ec. 1
Ax=b
Pre-multiplicando a ambos lados por A-1, nos queda:
A-1 . A x = A-1 . b
De la definición de matriz inversa A-1 .A = I, entonces
I . x = A-1 . b
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales
Quedamos en:
I . x = A-1 . b
La matriz identidad I es el elemento neutro de la
multiplicación de matrices ( I.x = x ), de aquí:
x = A-1 . b Ec. 2
La Ec. 2 nos da la solución del sistema de
ecuaciones, solo tenemos que calcular la inversa de
la matriz A y multiplicarla por el vector b
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

Ya sabemos como calcular la inversa de una matriz,


solo nos faltaría aprender como multiplicar una
matriz por un vector.

Es una nueva versión del procedimiento multi


(recordemos que este multiplica 2 matrices),
necesitamos aquí matriz x vector, su resultado es un
nuevo vector y lo llamaremos procedimiento multiv
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales
void multiv(double f[ ][4], double y[ ], double t[ ])
{ int i,j;

Procedimiento MultiV
for (i=1;i<=3;i++)
{ Ejemplo: Matriz A 3x3
t[ i ] = 0;
for (j=1;j<=3;j++)
{
t[ i ] = t[ i ] + f[ i ][ j] * y[ j ] ;
}
}
Esquema de uso de procedimientos

Proced. Proced.
Matriz A Matriz Aext Matriz AI
Extender Gauss
Matriz

Matriz AI Proced.
Vector x
Vector b Multiv
Ejemplo 18 (Ejercicio # 44 de la guía de
la unidad III)

Escriba un programa turbo c++ que permita calcular y


mostrar la solución de un sistema de ecuaciones lineales
de orden 3 utilizando el método de Gauss
La Salida debe ser
A b
x
Utilice procedimientos y funciones definidas por el
usuario
Ejemplo 18 (Ejercicio # 44 de la guía de la unidad III)
#include <stdio.h>
#include <conio.h>
double a[4][4], b[4], x[4];
double ai[4][4], aext[4][7];
double deta;
Void leermatriz( double w[ ][4], char x);
Void leervector( double w[ ], char x);
Void escribirmatriz( double w[ ][4], int colin, int filin);
Void escribirvector( double w[ ], int colin, int filin);
double det33(double w[ ][4]);
Void extendermatriz( double w[ ][4], double r[ ][ 7]);
Void gauss(double r[ ][7], double ain[ ][4] );
Void multiv( double f[ ][4], double y[ ], double t[ ]);
Ejemplo 18 (Ejercicio # 44 de la guía de la unidad III)
void main( ) escribirvector(b,50,2);
{ escribirvector(x,30,14);
leermatriz( a, ‘a’); }
deta = det33(a); else
if (deta != 0) {
{ printf(“Error, Matriz A Singular”);
leervector(b, ‘b’); }
extendermatriz(a,aext); getch( );
gauss(aext, ai); }
multiv(ai,b,x); Completar:
clrscr(); Leermatriz 3x3, Leervector 3x3
escribirmatriz(a,10,2); escribirmatriz 3x3, escribirvector 3x3
extendermatriz 3x3, gauss 3x3
METODO
DE
GAUSS-JORDAN
Método de Gauss-Jordan para calcular la
Solución de un Sistema de Ecuaciones Lineales

Sea un sistema de ecuaciones lineales de orden n de


la forma:
a11x1 + a12x2 + a13x3 + ... + a1nxn = b1
a21x1 + a22x2 + a23x3 + ... + a2nxn = b2
. . . . .
. . . . .
. . . . .
an1x1 + an2x2 + an3x3 + ... + annxn = bn
Método de Gauss-Jordan para calcular la
Solución de un Sistema de Ecuaciones Lineales

Este sistema de ecuaciones lineales de orden n lo


podemos escribir matricialmente como:

A x = b, Ec. 1 , donde:
a11 a12 a13 ... a1n b1 x1
a21 a22 a23 ... a2n b2 x2
A= . . . . b= . x= .
an1 an2 an3 ... ann bn xn
Método de Gauss-Jordan para calcular la
Solución de un Sistema de Ecuaciones Lineales
Este método usa también el proceso de
eliminación gaussiana.
Su diferencia radica en la matriz extendida R, ya
que esta aquí se forma con la matriz A y el vector
b, es decir nos queda:
Ejemplo: Matriz A de rango 3x3
Matriz A Vector b
a11 a12 a13 b1
R = a21 a22 a23 b2
  a31 a32 a33 b3 3x4
Método de Gauss-Jordan para calcular la
Solución de un Sistema de Ecuaciones Lineales
Al final tenemos que llegar a:

Matriz I Vector x
1 0 0 x1
R = 0 1 0 x2
  0 0 1 x3 3x4

Ejemplo: Matriz A de rango 3x3


Ejemplo:
Sea el sistema de orden 3:
3.0 x1 - 0.1 x2 – 0.2 x3 = 7.85
0.1 x1 + 7.0 x2 – 0.3 x3 = -19.30
0.3 x1 – 0.2 x2 + 10.0 x3 = 71.40
Pasos.
a.- Obtenemos la matriz R inicial
Matriz A Vector b
3.0 -0.1 -0.2 7.85
  R = 0.1 7.0 -0.3 -19.30
  0.3 -0.2 10.0 71.40
Ejemplo:
b.- Los elementos pivotes serán r11, r22 y r33. Comenzamos
dividiendo la fila numero 1 por r11, es decir, por 3.0. Lo que nos
resulta como:
1 -0.033 -0.066 2.616
 R = 0.1 7.0 -0.3 -19.30
  0.3 -0.2 10.0 71.40
c.- Ahora, debemos colocar en cero los otros elementos de la
columna donde se encuentra el actual elemento pivote. Entonces,
multiplicaremos a la fila numero 1 por 0.1 (elemento r21) y la fila que
se obtiene la restaremos de la fila 2 actual, es decir:
Fila 2 actual = 0.1 7.0 -0.3 -19.30
0.1* 1 -0.033 -0.066 2.616 = 0.1 –0.0033 -0.0066 0.2616

Fila 2 obtenida al hacer la resta = 0 7.0033 -0.2934 -19.5616


Ejemplo:
Entonces, R nos quedará:
1 -0.033 -0.066 2.616
R = 0 7.0033 -0.2934 -19.5616
  0.3 -0.2 10.0 71.40
Multiplicaremos a la fila numero 1 por 0.3 (elemento r31) y la fila que
se obtiene la restaremos de la fila 3 actual, es decir:
  Fila 3 actual = 0.3 -0.2 10.0 71.40

0.3 * 1 -0.033 -0.066 2.616 = 0.3 -0.0099 -0.0198 0.078


Fila 3 obtenida al hacer la resta = 0 -0.1901 10.0198 70.615
Entonces, R nos quedará como:
1 -0.033 -0.066 2.616
R = 0 7.0033 -0.2934 -19.5616
  0 -0.1901 10.0198 70.615
Ejemplo:
Con lo cual habremos completado el proceso para la primera
columna. Ahora debemos repetir el proceso para las columnas 2 y 3.
Para la columna 2 el elemento pivote será r22 y para la 3 el
elemento pivote será r33.
Al final de todo, nos queda:
1 0 0 3.00
 R = 0 1 0 -2.50
0 0 1 7.00

de donde tenemos que la solución del Sistema de Ecuaciones es::


3.00
x = -2.50
7.00
Esquema de uso de procedimientos

Proced. Proced.
Matriz A Matriz Aext Vector x
Extender Gaussj
Matrizgj
Procedimiento Extendermatrizgj - ejemplo 3x3
void extendermatrizgj(double w[ ][4], double t[ ], double r[ ][5])
{
int i,j; for (i=1;i<=3;i++)

for (i=1;i<=3;i++) {
{ r[ i ] [ 4 ] = t[ i ];
for (j=1;j<=3;j++) }
{
r[ i ][ j ] = w[ i ][ j ] ; }
}
}
Procedimiento Gaussj - ejemplo 3x3
void gaussj(double r[ ][5], double t[ ])
{ for (i= 1;i<=3;i++)
int m,i,j; {
double g, q; if ( i != m )
for (m=1;m<=3;m++) {
{ q = r[i ][ m] ;
g = r[m ][m] ; for (j=1;j<=4;j++)
if (g !=0) {
{ r[i ][ j] = r[ i][ j] -r[ m][ j]*q ;
for (j=1;j<=4;j++) }
{ }
r[m][ j] = r[m][j] / g; }
} } /* if (g!=0) */
} /* for m */
Procedimiento Gaussj - ejemplo 3x3
( Continuación )

for (i=1;i<=3;i++)
{
t[ i ] =r[i ][ 4 ] ;
}

}
Ejemplo 19 (Ejercicio # 47 de la guía de
la unidad III)

Escriba un programa turbo c++ que permita calcular y


mostrar la solución de un sistema de ecuaciones lineales
de orden 3 utilizando el método de Gauss-Jordan
La Salida debe ser
A b
x
Utilice procedimientos y funciones definidas por el
usuario
Ejemplo 19 (Ejercicio # 47 de la guía de la unidad III)

#include <stdio.h>
#include <conio.h>
double a[4][4], b[4], x[4];
double aext[4][5];
void leermatriz( double w[ ][4], char x);
void leervector( double w[ ], char x);
void escribirmatriz( double w[ ][4], int colin, int filin);
void escribirvector( double w[ ], int colin, int filin);
void extendermatrizgj(double w[ ][4], double t[ ], double r[ ][5])
void gaussj(double r[ ][5], double t[ ] );;
Ejemplo 19 (Ejercicio # 47 de la guía de la unidad III)
void main( ) Completar:
{ Leermatriz 3x3, Leervector 3x3
leermatriz( a, ‘a’); escribirmatriz 3x3, escribirvector 3x3
leervector(b, ‘b’); extendermatriz 3x3, gauss 3x3
extendermatrizgj(a,b,aext);
gaussj(aext, x);
clrscr();
escribirmatriz(a,10,2);
escribirvector(b,50,2);
escribirvector(x,30,14);
getch( );
}
METODO
DE
GAUSS-SEIDDEL
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

Sea un sistema de ecuaciones lineales de orden n


de la forma:
a11x1 + a12x2 + a13x3 + ... + a1nxn = b1
a21x1 + a22x2 + a23x3 + ... + a2nxn = b2
. . . . .
. . . . .
. . . . .
an1x1 + an2x2 + an3x3 + ... + annxn = bn
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

Procedimiento:
a.- Se debe despejar las variables x de cada una de las
ecuaciones anteriores. Esto debe hacerse en orden, es decir,
despejar x1 de la ecuación 1, x2 de la ecuación 2 y así hasta la
ultima ecuación del sistema.

b.- Se toman valores iniciales para todas las variables x a


excepción de la variable x1. Normalmente se toman valores
iguales a cero.
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

c.- Con la ecuación despejada para x1 y los valores iniciales


tomados en el paso anterior, se consigue un nuevo valor para
x1, que denotaremos como x10 . Se debe realizar lo mismo para
x2 hasta xn.
d.- Con la ecuación despejada para x1 y los valores
obtenidos en el paso c, calculamos un nuevo valor para x1 que
denotaremos como x11.

Se debe realizar lo mismo para x2 hasta xn.


Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales
  e.- Calcular las diferencias:
d1 =  x11 - x10 

d2 =  x21 - x20 

 
dn =  xn1 - xn0 

Una vez calculadas las compararemos con un error 


previamente establecido. Si todas las diferencias son menores a
ese error  se detendrá el proceso, en caso contrario,
buscaremos nuevos valores para x, denotados como: x12 ,
x22 ..., xn2 . Y así hasta que estas diferencias en algún momento
sean menores que el error mencionado.
 
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

 Ejemplo:
Sea el sistema de ecuaciones lineales de
orden 3:
3.0 x1 - 0.1 x2 - 0.2 x3 = 7.85
0.1 x1 + 7.0 x2 - 0.3 x3 = -19.30
0.3 x1 - 0.2 x2 + 10.0 x3 = 71.40
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

 a.- Despejando, nos queda:


 
x1 = 7.85 + 0.1 x2 + 0.2 x3 (1)
3

x2 = -19.30 - 0.1 x1 + 0.3 x3 (2)


7
 
x3 = 71.4 - 0.3 x1 + 0.2 x2 (3)
10
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales
b.- Tomaremos x2 = 0 y x3 = 0

c.- Con la ecuación (1) y los valores iniciales obtenemos:


X10 = 2.616666

 
Con la ecuación (2) y los valores de X10 y x3 = 0 :

X20 = -2.794523

Con la ecuación (3) y los valores de X10 y X20:

X30 = 7.005609
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales
d.- Con la ecuación (1) y los valores de X20 y X30 :

X11 = 2.990556

 
Con la ecuación (2) y los valores de X11 y X30 :

X21 = -2.499624

Con la ecuación (3) y los valores de X11 y X21:

X31 = 7.000290
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

e.- Calculamos las diferencias,  = 0.0001:


d1 =  x11 - x10  = 0.373890

d2 =  x21 - x20  = 0.294899

d3 =  x31 - x30  = 0.005319

Se puede observar que no se cumple la condición de que todas


las diferencias sean menor que el error  dado.
Por esta razón, debemos seguir iterando.
Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales

Iterando 2 veces mas obtenemos:


X13 = 3.000000

X23 = -2.500000

X33 = 7.000000

Quedando las diferencias como:


d1 =  x13 - x12  =  3.000000 – 3.000031  = 0.000031

d2 =  x23 - x22  = -2.500000 – (-2.499988)  = 0.000012

d3 =  x33 - x32  =  7.000000 – 6.999999  = 0.000001


Método de Gauss para calcular la Solución
de un Sistema de Ecuaciones Lineales
Como se cumplen la condiciones del error. Se detiene el proceso
y nos queda:
X1 = 3.0
X2 = -2.5
X3 = 7.0
El mismo resultado que nos dio con el Método de Gauss-Jordan.
En este método mientras mas iteraciones se hace, es más
preciso, por esto es muy importante tomar un valor para el error ni
muy grande ni muy pequeño.
Esquema de uso de procedimientos

Matriz A Proced.
Vector x
Vector b Seiddel
Ejemplo 20 (Ejercicio # 52 de la guía de
la unidad III)

Escriba un programa turbo c++ que permita calcular y


mostrar la solución de un sistema de ecuaciones lineales
de orden 3 utilizando el método de Gauss-Seiddel
La Salida debe ser
A b
x
Utilice procedimientos y funciones definidas por el
usuario
Ejemplo 20 (Ejercicio # 52 de la guía de la unidad III)

#include <stdio.h>
#include <conio.h>
double a[4][4], b[4], x[4];
void leermatriz( double w[ ][4], char x);
void leervector( double w[ ], char x);
void escribirmatriz( double w[ ][4], int colin, int filin);
void escribirvector( double w[ ], int colin, int filin);
void seiddel( double w[ ][4], double y[ ], double t[ ]);
Ejemplo 20 (Ejercicio # 52 de la guía de la unidad III)
void main( )
{
  leermatriz(a,'a');
leervector(b,'b');
seiddel(a,b,x);
clrscr();
escribirmatriz(a,10,2);
escribirvector(b,50,2);
escribirvector(x,30,14);
getch();
 }
Ejemplo 20 (Ejercicio # 52 de la guía de la unidad III)
void seiddel(double w[][4], double y[], double t[])
{
double xp[4],d1,d2,d3,e;
int i,j,f;
double g,q;
 
t[2]=0;
t[3]=0;
 
t[1] = (y[1] - w[1][2]*t[2] -w[1][3]*t[3]) / w[1][1];
t[2] = (y[2] - w[2][1]*t[1] -w[2][3]*t[3]) / w[2][2];
t[3] = (y[3] - w[3][1]*t[1] -w[3][2]*t[2]) / w[3][3];
Ejemplo 20 (Ejercicio # 52 de la guía de la unidad III)
  xp[1] = t[1];
xp[2] = t[2];
xp[3] = t[3];
  f = 0;
e = 0.0001;
i = 0;
  while (f == 0)
{
i = i + 1;
  t[1] = ( y[1] - w[1][2]*t[2] -w[1][3]*t[3] ) / w[1][1];
t[2] = ( y[2] - w[2][1]*t[1] -w[2][3]*t[3] ) / w[2][2];
t[3] = ( y[3] - w[3][1]*t[1] -w[3][2]*t[2] ) / w[3][3];
Ejemplo 20 (Ejercicio # 52 de la guía de la unidad III)
d1 = fabs(t[1] - xp[1]);
d2 = fabs(t[2] - xp[2]);
d1 = fabs(t[3] - xp[3]);
if ( (d1 < e) && (d2 < e) && (d3< e) )
{
f = 1;
}
else
{ xp[1] = t[1];
xp[2] = t[2];
xp[3] = t[3];
}
} /* While */
}
Ejemplo 20 (Ejercicio # 52 de la guía de la unidad III)

Completar :
Leermatriz 3x3
Leervector 3x3
Escribirmatriz 3x3
Escribirvector 3x3

También podría gustarte