solución de sistemas de ecuaciones con el método de Gauss(eliminación de Gauss con pivote) en c++



  una técnica que se desarrollo para combatir los     errores de truncamiento por ceros en la diagonal   o los errores de redondeo por números cercanos   a cero es la técnica de pivoteo parcial, esta          técnica consiste en ubicar en la fila pivote el  termino de mayor magnitud de tal forma que al realizar la división por dicho termino no se incurre en la violación de división por números cercanos a cero ni la división por cero.

Se define entonces como:

En cada etapa k se busca el mayor de los elementos de la columna k, que ocupan posiciones mayores o iguales que k, ocupe la posición i, donde k<=i<=n. después se realiza el intercambio de filas. El proceso como tal es idéntico a eliminación gaussiana simple solo que antes de calcular los multiplicadores se realiza el pivoteo si es necesario. Al realizar el pivoteo se obtienen valores lo más pequeños posibles para los multiplicadores reduciendo así el error de redondeo.

#include<iostream>
#include<cmath>

using namespace std; /*
M-->matriz aumentada
n-->numero de ecuaciones

*/


//triangularizacion con pivote

void triangularizacion(double M[20][20],int n){
    
    
double may;//variable para almacenar el mayor de la columna k

    int ind;//indice del mayor-->indice de may
    double aux;
    
double pivote;
    
    
for(int k=0;k<n-1;k++){//recorrer columnas de la matriz reducida


        may=abs(M[k][k]);
        
ind=k;
        
//recorrer filas de la columna k para buscar el indice del mayor

        for(int l=k+1;l<n;l++){
            
if(may<abs(M[l][k])){
                
may=abs(M[l][k]);
                
ind=l;
            
}
           
        
}
        
        
        
//cambiar filas

        if(k!=ind){
            
for(int i=0;i<n+1;i++){
                
aux=M[k][i];
                
M[k][i]=M[ind][i];
                
M[ind][i]=aux;
            
}
        
        
}
        
        
//comienza la triangularizacion normal         
        
if(M[k][k]==0){
            
cout<<"no tiene solucion";
            
break;
        
}
        
else{
            
            
for(int i=k+1;i<n;i++){//recorrer fila

                pivote=-M[i][k];
                
for(int j=k;j<n+1;j++){//recorrer elementos de una fila

                    M[i][j]=M[i][j]+pivote*M[k][j]/M[k][k];
                
}
                
            
}
        
}
   
    
}
}

void vector_solucion(double V[20],double M[20][20],int n){
    
    
double acum;
    
//recorrer matriz triangularizada

    for(int i=n-1;i>=0;i--){
        
acum=0;
        
for(int j=n-1;j>=0;j--){
            
if(j>i){//recorrer matriz triangular

                acum+=M[i][j]*V[j];
            
}
        
}
        
V[i]=(M[i][n]-acum)/M[i][i];
    
}

}
void ingresar_coeficientes(double M[20][20],int n){
    
cout<<"ingrese ecuaciones:"<<endl;
    
for(int i=0;i<n;i++){
        
cout<<"\t"<<"fila "<<i+1<<" : "<<endl;
        
for(int j=0;j<n+1;j++){
            
cin>>M[i][j];
        
}
    
}

}
int main (int argc, char *argv[]) {
    
int n;
    
double M[20][20];
    
double V[20];
    
cout<<"ingrese numero de ecuaciones:";
    
cin>>n;
    
ingresar_coeficientes(M,n);
    
cout<<"matriz aumentada:"<<endl;
    
for(int i=0;i<n;i++){
        
for(int j=0;j<n+1;j++){
            
cout<<M[i][j]<<"\t";
        
}cout<<endl;
    
}
    
cout<<"triangularizacion:"<<endl;
    
triangularizacion(M,n);
    
for(int i=0;i<n;i++){
        
for(int j=0;j<n+1;j++){
            
cout<<M[i][j]<<"\t";
        
}cout<<endl;
    
}
    
cout<<"la solucion del sistema de ecuaciones es:"<<endl;
    
vector_solucion(V,M,n);
    
for(int i=0;i<n;i++){
        
cout<<"X"<<i+1<<"="<<V[i]<<"\t";
    
}
    
    
return 0;

}

Compartir

0 Comment to "solución de sistemas de ecuaciones con el método de Gauss(eliminación de Gauss con pivote) en c++"

Publicar un comentario