Está en la página 1de 4

UNIVERSIDAD AUTÓNOMA DEL ESTADO

DE MORELOS.
CENTRO DE INVESTIGACIÓN EN INGENIERÍA Y CIENCIAS APLICADAS.
MAESTRÍA EN SUSTENTABILIDAD ENERGÉTICA.

“Sistemas lineales: Método de Jacobi, Solución.”


#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#define n 10 //Tamaño máximo de vectores y matrices

using namespace std; //Da lugar a la salida y entrada de datos (cout


y cin).

void Jacobi(int l, float x[], float A[][10], float b[] ); //Vector: v[], Matríz[Filas][Columnas],
no se requiere que la función regrese info.
int imax,iter;
int main (){
cout<<("\nSolucion de sistemas lineales");
cout<<("\nMETODO DE JACOBI forma Ax=b\n");
cout<<("Autor: Angel Sanchez Cruz\n");
time_t tiempo = time(0);
char output[128];
struct tm *tlocal = localtime(&tiempo);
strftime(output,128,"Fecha: %d/%m/%y %H:%M:%S\n\n",tlocal);
cout<<("%s\n",output);

int i,j,l, cont=0;


float x[n], A[n][n], b[n], dd, suma; //Se le asigna el valor definido como
número máximo de ecuaciones
cout<<"Introduce la dimension de la matriz a evaluar: ";
cin>>l; //l almacena la dimension de la matriz
cout<<"\nIntroduce los coeficientes de la matriz A[i][j]: " <<endl;

for (i=0;i<l;i++){ //Contador i, inicia en 0, el número de incog < dim


de matriz, incognita x+1
x[i]=0; //La matriz de las incógnitas comienza con valor 0
para arranque de iteraciones.
for(j=0;j<l;j++) {
cout<<"A["<<i<<","<<j<<"]= "; //Coordenadas de la matriz, fila, columna.
cin>>A[i][j];

}
}
cout<<"Introduce el vector de los resultados b[i]: "<<endl; //Resultado de cada sistema
de ecuaciones, de arriba a abajo.

Ing. Ángel Sánchez Cruz Dr. Antonio Rodríguez Martínez Métodos numéricos, C++
for (i=0;i<l;i++){
cout<<"b["<<i<<",0]= "; //Solicita valores del vecrtor b
cin>>b[i];

}
printf("Introduce el numero de iteraciones maximas\n");
scanf("%d",&imax);

for (i=0;i<l;i++){ //Comprobar si la matriz es diagonalmente


dominante o no.
suma=0; //Se almacenan los valores de la matriz que
no pertenecen a la diagonal
for (j=0;j<l;j++){
if(i==j){ //valores de la diagonal de la matriz
dd=A[i][j]; //dd= diagonal dominate, nueva
matriz A con estos valores.

}else { suma+=A[i][j]; //Suma los elementos de la fila, y los


almacena en la variable "suma", como suma es 0, no afecta nada.
}
}
if(dd>suma){ //si la diagonal dominante es mayos que la
suma de los otros valores, el contador aumenta en 1
cont++;
}
}
if (cont==l){ //si el contador es igual al numero de ecuaciones,
todas las filas cumplen con la condicion de diagonal dominante.
Jacobi(l,x,A,b);
}else{
cout<<"La matriz no es diagonalmente dominante. Proceso finalizado." <<endl;}
system("PAUSE");
return 0;
}

void Jacobi(int l, float x[], float a[][10], float b[]){


char p;
float c[n];
int k,i,j;
line: //Función en línea, realiza un cálculo específico
para devolver un resultado.
iter=0;
do{
iter++;
for (k=0; k<10; k++){ //(xk+1, yk+1, zk+1...)
for (i=0; i<l; i++){

Ing. Ángel Sánchez Cruz Dr. Antonio Rodríguez Martínez Métodos numéricos, C++
c[i]=b[i]; //El vector c, toma los valores del vector b
que contiene los resultados de la ecuación.
for (j=0;j<l;j++){
if(i!=j){ //Si i es diferente a j (los valores que no
estan en la diagonal)
c[i]=c[i]-a[i][j]*x[j]; //Calcular los valores de b-
matriz A*vector x
}
}

}
for(i=0;i<n;i++){
x[i]=c[i]/a[i][i]; //Despeja en función de los valores de la fila
}
}
cout<<"La solucion es: "<<endl;
for (i=0;i<l;i++){
cout<<"x("<<i<<") = "<<x[i]<<endl;
}

} while(iter<imax);

Ing. Ángel Sánchez Cruz Dr. Antonio Rodríguez Martínez Métodos numéricos, C++
Ing. Ángel Sánchez Cruz Dr. Antonio Rodríguez Martínez Métodos numéricos, C++

También podría gustarte