domingo, 3 de diciembre de 2017

Método de Jacobi

Método de Jacobi


DEFINICIÓN:
En análisis numérico el método de Jacobi es un método iterativo, usado para resolver sistemas de ecuaciones lineales del tipo Ax=b. El algoritmo toma su nombre del matemático alemán Carl Gustav Jakob Jacobi. El método de Jacobi consiste en usar fórmulas como iteración de punto fijo.

La base del método consiste en construir una sucesión convergente definida iterativamente. El límite de esta sucesión es precisamente la solución del sistema. A efectos prácticos si el algoritmo se detiene después de un número finito de pasos se llega a una aproximación al valor de x de la solución del sistema.

El método de Jacobi siempre converge si la matriz A es estrictamente diagonal dominante y puede converger incluso si esta condición no se satisface.

CÓDIGO DEL MÉTODO DE JACOBI EN C++:

#include<iostream>
#include<stdlib.h>
#define n 10
using namespace std;
void Jacobi(int l, float x[], float a[][10], float b[]); 
int main() {
    int i, j, l, cont=0;
float x[n],a[n][n],b[n], dd, suma;
    cout<<"Introduce el numero de ecuaciones: ";
    cin>>l;
    cout<<"Introduce la matriz con los coeficientes: "<<endl;
    for(i=0;i<l;i++) {
        x[i]=0;
        for(j=0;j<l;j++) {
        cout<<"a["<<i<<","<<j<<"]= ";
            cin>>a[i][j];
        }
    }
    cout<<"Introduce el vector de los resultados: "<<endl;
    for(i=0;i<l;i++) {
    cout<<"b["<<i<<",0]= ";
        cin>>b[i];
    }
    for(i=0; i<l; i++){
    suma=0;
    for(j=0; j<l; j++){
    if(i==j){
    dd=a[i][j];
}else{
suma+=a[i][j];
}
}
if(dd>suma){
cont++;
}
}
if(cont==l){
    Jacobi(l, x, a, b);
}else{
cout<<"La matriz no es diagonalmente dominante (No es el método de jacobi). 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:
    for(k=0; k<10; k++){
    for(i=0;i<l;i++) {
        c[i]=b[i];
        for(j=0;j<l;j++) {
            if(i!=j) {
                c[i]=c[i]-a[i][j]*x[j];
            }
        }
    }
    for(i=0;i<n;i++) {
        x[i]=c[i]/a[i][i];
    }
}
        cout<<"La solucion es: "<<endl;
        for(i=0;i<l;i++) {
            cout<<"x("<<i<<") = "<<x[i]<<endl;
        }
cout<<"¿Requiere que el resultado sea mas preciso?"<<endl;
cout<<"(s) Si"<<endl;
cout<<"(n) No"<<endl;
cin>>p;
switch(p){
case 's': goto line; break;
case 'n': cout<<"Proceso finalizado."<<endl; break;
return;
}

}

Puedes descargar el programa en el siguiente enlace:
https://drive.google.com/open?id=19Z2vwO5oT0KrHlaMvS1xHhtIF5tECg-V

VIDEO DEL PROGRAMA EN C++


https://www.youtube.com/watch?v=mG5quqkhUJw&feature=youtu.be

Bibliografia:
http://metodosnumericosquintino.blogspot.mx/2012/05/metodo-de-jacobi.html
https://es.wikipedia.org/wiki/M%C3%A9todo_de_Jacobi

No hay comentarios:

Publicar un comentario