Вы находитесь на странице: 1из 4

ANÁLISIS NUMÉRICO 1

INGENIERÍA QUÍMICA

GUÍA DE TRABAJO PRÁCTICO Nº 2

Sistema de Ecuaciones Lineales. Método Eliminación de Gauss

Problema 2.1

Dado el siguiente seudo código del método de eliminación de Gauss, desarrollar un programa en C++.

Lista de los principales símbolos utilizados en el seudo código

• A : matriz de coeficientes • n : número de ecuaciones


• m : multiplicador • x : vector solución
• s : variable auxiliar

Seudo código
En el presente algoritmo, se implementa el método mediante la utilización de una matriz extendida para incluir el
término independiente.

Función: Obtener_Datos( )
Entre n, A = {A i , j ; 1 ≤ i ≤ n, 1 ≤ j ≤ n + 1}
Fin

Función: Aplicar_Metodo( )
Para k = 1, n
Si (A k ,k )
≤ 10−8 entonces
Retorne ERROR_PIVOTE_PCERO
Fin-si
Para i = k + 1, n
A
Haga m = i , k
Ak ,k
Para j = k + 1, n + 1
Haga A i , j = A i , j − m ⋅ A k , j
Fin-para
Fin-para
Fin-para
Para i = n,1, −1
Haga s = 0
Para j = i + 1, n
Haga s = s + A i , j ⋅ x j
Fin-para
A i , n +1 − s
Haga xi =
A i ,i
Fin-para
Retorne ERROR_OK
Fin

Función: Salida_en_Archivo( )
Para i = 1, n
Muestre xi
Fin-para
Fin
2 Trabajo Práctico Nº 2
Carlos M. Albarracín

Programa C++
Los datos se leen desde un archivo de texto denominado: sistema.txt (ver problema 2.2).

/* TRABAJO PRÁCTICO 2 */
/* Sistemas lineales. Método de Gauss básico */

#include "U:\anqlib++\anqlib++.h"
#include "U:\errores.h"

//DECLARACIÓN DE PROTOTIPOS DE FUNCIONES


//FUNCIONES QUE SE DEBEN MODIFICAR EN CADA TP
int Obtener_Datos(void);
int Aplicar_Metodo(void);
void MuestraResultados_en_Ventana(int error);
int Salida_en_Archivo(int error);

//declaración de variables globales


double a[100][101],x[100];
int n;

//Esquema de un programa de Análisis Numérico para consola


int main(){
int error;

//Obtener los datos del problema


error=Obtener_Datos();

//Efectuar Cálculos
if(error==ERROR_OK) error=Aplicar_Metodo();

//Salida de resultados en archivo


if(error==ERROR_OK) error=Salida_en_Archivo(error);

//Mensajes en ventana de ejecución


MuestraResultados_en_Ventana(error);

system("PAUSE");
return error;
}

int Obtener_Datos(){
int i,j,error;
char buffer_lectura[5000];//buffer para almacenar los datos del archivo

//Lectura de datos desde un archivo


error=LeeDatos_de_Archivo("sistema.txt",buffer_lectura);
if(error!=0) return error;

//Obtener el número n
error=leeEntero(buffer_lectura,&n);
if(error!=0) return error;

//Obtener los coeficientes del sistema


for(i=1; i<=n; i++){
for(j=1; j<=n+1; j++){
error=leeDouble(buffer_lectura,&a[i][j]);
if(error!=0) return error;
}//j
}//i

return ERROR_OK;
}

void MuestraResultados_en_Ventana(int error){


int error2;

if(error!=ERROR_OK){//Verificar si se produjeron errores

//Errores de la librería anqlib++


error2=ImprimeTextoErrorV(error);

if(error2<0){
//Errores de cada método numérico en particular
ANÁLISIS NUMÉRICO 3
INGENIERÍA QUÍMICA

if(error==ERROR_PIVOTE_PCERO) printf("Error. Pivote próximo a cero.\r\n");


}
}
else{//mensaje de ejecución satisfactoria
cout<<"Ejecución sin errores\r\n";
}

int Salida_en_Archivo(int error){


int i;
char buff_numero[100],buffer_salida[5000];

//escribir en el buffer el vector x


lstrcpy(buffer_salida,"Solución\r\n\r\n");

for(i=1; i<=n; i++){


lstrcat(buffer_salida,"x[");
ConvertirEntero_a_Texto(i,buff_numero); lstrcat(buffer_salida,buff_numero);
lstrcat(buffer_salida,"]= ");
ConvertirDouble_a_Texto(x[i],8,buff_numero); lstrcat(buffer_salida,buff_numero);
lstrcat(buffer_salida,"\r\n");
}//for i

//copiar el contenido de buffer_salida en el archivo de salida


error=EscribeResultados_en_Archivo("salida.txt",buffer_salida);
return error;
}

int Aplicar_Metodo(){
int i,j,k;
double q,s;

//Triangulación
for(k=1; k<=n; k++){
if(fabs(a[k][k]) <= 1.0e-8) return ERROR_PIVOTE_PCERO;
for(i=k+1; i<=n; i++){
q=a[i][k]/a[k][k];
for(j=k+1; j<=n+1; j++){
a[i][j]-=q*a[k][j];
}
}//for i
}//for k

//Sustitución regresiva
for(k=n; k>=1; k--){
s=0.0;
for(j=k+1; j<=n; j++) s+=a[k][j]*x[j];
x[k]=(a[k][n+1]-s)/a[k][k];
}//for k

return ERROR_OK;
}

Archivo: errores.h

#define ERROR_OK 0
#define ERROR_PIVOTE_PCERO 1

Utilice el programa desarrollado en el problema 2.1 para obtener la solución del siguiente sistema de ecuaciones:

2 x1 + 3 x2 − x3 = −1
4 x1 + 4 x2 − 3x3 = 1
−2 x1 + 3 x2 − x3 = −1
4 Trabajo Práctico Nº 2
Carlos M. Albarracín

Archivo de datos: sistema.txt

[Número de ecuaciones]
3

[ecuación 1]
2.0 3.0 -1.0
[término independiente 1]
-1.0

[ecuación 2]
4.0 4.0 -3.0
[término independiente 2]
1.0

[ecuación 3]
-2.0 3.0 -1.0
[término independiente 3]
-1.0

[Fin datos]

Resultado: x1 = 0 , x2 = −0.8 , x3 = −1.4

Problema 2.2
Dado el siguiente sistema de ecuaciones:

1 1 1 25
x1 + x2 + x3 + x4 =
2 3 4 12
1 1 1 1 77
x1 + x2 + x3 + x4 =
2 3 4 5 60
1 1 1 1 57
x1 + x2 + x3 + x4 =
3 4 5 6 60
1 1 1 1 319
x1 + x2 + x3 + x4 =
4 5 6 7 420

a) Obtenga una solución redondeando los coeficientes a 3 dígitos significativos.


b) Obtenga una solución a partir de coeficientes redondeados a 3 dígitos decimales.
Utilice el programa desarrollado en el problema 2.1.

Problema 2.3
Utilice el programa desarrollado en el problema 2.1 para obtener la solución del siguiente sistema de ecuaciones:

⎡ 4 −1 0 −1 0 0 ⎤ ⎡ x1 ⎤ ⎡ 2 ⎤
⎢ −1 4 −1 0 −1 0 ⎥ ⎢ x ⎥ ⎢ 1 ⎥
⎢ ⎥ ⎢ 2⎥ ⎢ ⎥
⎢ 0 −1 4 0 0 −1⎥ ⎢ x3 ⎥ ⎢ 2 ⎥
⎢ ⎥•⎢ ⎥ = ⎢ ⎥
⎢ −1 0 0 4 −1 0 ⎥ ⎢ x4 ⎥ ⎢ 2 ⎥
⎢ 0 −1 0 −1 4 −1⎥ ⎢ x5 ⎥ ⎢ 1 ⎥
⎢ ⎥ ⎢ ⎥ ⎢ ⎥
⎣⎢ 0 0 −1 0 −1 4 ⎦⎥ ⎣⎢ x6 ⎦⎥ ⎣⎢ 2 ⎦⎥

Problema 2.4
Resuelva el sistema dado en el sistema Web de trabajos prácticos, completando las tablas que allí se indican. Efectúe
los cálculos en forma manual.

Вам также может понравиться