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

Mtodo Gauss con pivoteo

*Enunciado: Disee un programa en C que realice el mtodo Gauss con pivoteo * Anlisis previo:

Una tcnica que se desarrollo para combatir los errores de truncamiento por ceros en la diagonal o los errores de redondeo por nmeros cercanos a cero es la tcnica de pivoteo parcial, esta tcnica consiste en ubicar en la fila pivote el termino de mayor magnitud de tal forma que al realizar la divisin por dicho termino no se incurre en la violacin de divisin por nmeros cercanos a cero ni la divisin 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 posicin akk, donde k<=i<=n. despus se realiza el intercambio de filas. El proceso como tal es idntico a eliminacin gaussiana simple solo que antes de calcular los multiplicadores se realiza el pivoteo si es necesario. Al realizar el pivoteo se obtienen valores lo ms pequeos posibles para los multiplicadores reduciendo as el error de redondeo.
*Codificacin: #include <stdio.h> #include<stdlib.h> void PideDatos(int argc, char *argv[],int *Dim, float Sist[][102]); void EscribeDatos(int Dim, float Sist[][102]); void ResuelveGauss(int Dim, float Sist[][102]);

int main(int argc, char *argv[]) { int C,Dimension; float Sistema[101][102];

PideDatos(argc,*argv,&Dimension,Sistema); printf("\n\n\nEl Sistema introducido es el siguiente: \n\n"); EscribeDatos(Dimension,Sistema); ResuelveGauss(Dimension,Sistema); printf("\n\n\nLas soluciones son:\n"); for(C=1;C<=Dimension;C++) printf("\n X%d=%f\n",C,Sistema[C][Dimension+1]); scanf(""); return(0); system("pause"); }

void PideDatos(int argc, char *argv[],int *Dim,float Sist[][102]){ int A,B,opc; printf("\nPrograma que realiza el Gauss con pivoteo\n "); printf("\n\n\n Ingresa el numero de incognitas:\n\n"); scanf("%d",&*Dim); printf("\n\n\n Introduce la opcion para leer desde archivo 1 o 2 para introducir desde teclado\n\n"); scanf("%d",&opc); FILE *f; if (argc>=1) f = fopen ("gaussconpivoteo.txt", "r"); else f = fopen (argv[1], "r"); if(f == NULL) {

printf("falla al abrir el archivo gaussconpivoteo.txt\n"); system("pause"); exit(0); } FILE *ff; if (argc>=1) ff = fopen ("terminosindependientespivoteo.txt", "r"); else ff = fopen (argv[1], "r"); if(ff == NULL){ printf("falla al abrir el archivo terminosindependientespivoteo.txt\n"); system("pause"); exit(1); } switch(opc){ case 1: for(A=1;A<=*Dim;A++) for(B=1;B<=*Dim;B++){ fscanf(f, "%f ", &Sist[A][B]); }

for(A=1;A<=*Dim;A++){

fscanf(ff, "%f ", &Sist[A][*Dim+1]); } break; case 2: printf("\n\n MATRIZ A:\n");

for(A=1;A<=*Dim;A++) for(B=1;B<=*Dim;B++){ printf("\n Termino A(%d,%d):",A,B); scanf("%f",&Sist[A][B]);} printf("\n\n\n VECTOR B:\n"); for(A=1;A<=*Dim;A++){ printf("\n Termino B(%d):",A);scanf("%f",&Sist[A][*Dim+1]); system("pause"); } break; } }

void EscribeDatos(int Dim, float Sist[][102]){ int A,B; for(A=1;A<=Dim;A++){ for(B=1;B<=(Dim+1);B++){ printf("%7.2f",Sist[A][B]); if(B==Dim) printf(" |");} printf("\n"); }

} void ResuelveGauss(int Dim, float Sist[][102]){ int NoCero,Col,C1,C2,A; float Pivote,V1;

for(Col=1;Col<=Dim;Col++){ NoCero=0;A=Col; while(NoCero==0){ if(Sist[A][Col]!=0){ NoCero=1;} else A++;} Pivote=Sist[A][Col]; for(C1=1;C1<=(Dim+1);C1++){ V1=Sist[A][C1]; Sist[A][C1]=Sist[Col][C1]; Sist[Col][C1]=V1/Pivote;} for(C2=Col+1;C2<=Dim;C2++){ V1=Sist[C2][Col]; for(C1=Col;C1<=(Dim+1);C1++){ Sist[C2][C1]=Sist[C2][C1]-V1*Sist[Col][C1];} } } for(Col=Dim;Col>=1;Col--) for(C1=(Col-1);C1>=1;C1--){ Sist[C1][Dim+1]=Sist[C1][Dim+1]-Sist[C1][Col]*Sist[Col][Dim+1]; Sist[C1][Col]=0; } system("pause"); }

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