Sunteți pe pagina 1din 20

# include <stdio.h> # include <stdlib.h> # include <math.

h> ///Daniel Vega Ruiz ///Metodos Numericos ///Programa para realizar ///->operaciones de matrices ///->factorizacion de matriz ///->solucion del sistema Ax=b void xresult(double *x,int n){ ///rutina de impresion de vector int i; for(i=0;i<n;i++) printf("\n\tx%d= % .6lf",i+1,x[i]); printf("\n"); } void mresult(double **M,int n,int m,int op){ int i,j; for(i=0;i<n;i++){ printf("\n"); for(j=0;j<m;j++) printf("% 10.4lf",M[i][j]);} printf("\n"); } void gauss_seidel(double **A,double *x0,double *xk,double *b,int n,int imax,double tol,int op){ ///metodo iterativo gauss seidel double sum1=0,sum2=0,aux; int i,j,k,r=0,ind=1,h; tol=1/pow(10,tol); ///se calcula la tolerancia de la solucion en base a los digitos significativos pedidos por el usuario ///tratando de acomodar matriz de tal modo que no queden ceros en la diagonal for(i=0;i<n-1;i++){ ///indeterminacion, se intercambian renglones o columnas if(A[i][i]==0){ for(k=i+1;k<n;k++){ if(A[k][i]!=0 && ind==1){ ///se compara con el elemento del siguiente renglon misma columna for(h=0;h<n+1;h++){ ///rutina de impresion de matriz de n*m

aux=A[i][h]; A[i][h]=A[k][h]; A[k][h]=aux;} ind=0;} if(A[i][k]!=0 && ind==1){ ///se compara con el elemento de la siguiente columna mismo renglon for(h=0;h<n;h++){ aux=A[h][i]; A[h][i]=A[h][k]; A[h][k]=aux;} ind=0;}}} ind=1;} ind=0; ///se realiza el metodo de gauss-seidel while(r<imax && ind==0){ for(i=0;i<n;i++){ xk[i]=b[i]/A[i][i]; for(j=0;j<i;j++) sum1+=A[i][j]*xk[j]; for(j=i+1;j<n;j++) sum2+=A[i][j]*x0[j]; xk[i]-=(sum1+sum2)/A[i][i]; if(fabs(xk[i]-x0[i])<tol){ ind=1;break;} sum1=0; sum2=0; } xresult(x0,n); for(i=0;i<n;i++) x0[i]=xk[i]; r++; } ///imprimiendo resultado if(r==imax) printf("\nSe he excedido el numero de iteraciones, y no se llego a la solucion del sistema :("); else{ printf("Soluciones encontradas en la iteracion: %d",r); xresult(xk,n);} }

void jacobi(double **A,double *x0,double *xk,double *b,int n,int imax,double tol,int op){ ///metodo iterativo de Jacobi double sum=0,aux; int i,j,k,r=0,ind=1,h; tol=1/pow(10,tol); ///se calcula la tolerancia de la solucion en base a los digitos significativos pedidos por el usuario ///tratando de acomodar matriz de tal modo que no queden ceros en la diagonal for(i=0;i<n-1;i++){ ///indeterminacion, se intercambian renglones o columnas if(A[i][i]==0){ for(k=i+1;k<n;k++){ if(A[k][i]!=0 && ind==1){ ///se compara con el elemento del siguiente renglon misma columna for(h=0;h<n+1;h++){ aux=A[i][h]; A[i][h]=A[k][h]; A[k][h]=aux;} ind=0;} if(A[i][k]!=0 && ind==1){ ///se compara con el elemento de la siguiente columna mismo renglon for(h=0;h<n;h++){ aux=A[h][i]; A[h][i]=A[h][k]; A[h][k]=aux;} ind=0;}}} ind=1;} ind=0; ///se realiza el metodo de Jacobi while(r<imax && ind==0){ for(i=0;i<n;i++){ xk[i]=b[i]/A[i][i]; for(j=0;j<n;j++) if(j!=i) sum+=A[i][j]*x0[j]; xk[i]-=sum/A[i][i]; if(fabs(xk[i]-x0[i])<tol){ ind=1;break;} sum=0; } xresult(x0,n); ///se van imprimiendo los resultados generados for(i=0;i<n;i++) x0[i]=xk[i]; r++;

} ///imprimiendo resultado if(r==imax) printf("\nSe he excedido el numero de iteraciones, y no se llego a la solucion del sistema :(.\n"); else{ printf("\nSoluciones encontradas en la iteracion: %d",r); xresult(x0,n); } } void SOR(double **A,double *x0,double *xk,double *b,int n,int imax,double tol,double w,int op){ ///Succesive over-relaxation method double sum1=0,sum2=0,aux; int i,j,k,r=0,ind=1,h; tol=1/pow(10,tol); ///se calcula la tolerancia de la solucion en base a los digitos significativos pedidos por el usuario ///tratando de acomodar matriz de tal modo que no queden ceros en la diagonal for(i=0;i<n-1;i++){ ///indeterminacion, se intercambian renglones o columnas if(A[i][i]==0){ for(k=i+1;k<n;k++){ if(A[k][i]!=0 && ind==1){ ///se compara con el elemento del siguiente renglon misma columna for(h=0;h<n+1;h++){ aux=A[i][h]; A[i][h]=A[k][h]; A[k][h]=aux;} ind=0;} if(A[i][k]!=0 && ind==1){ ///se compara con el elemento de la siguiente columna mismo renglon for(h=0;h<n;h++){ aux=A[h][i]; A[h][i]=A[h][k]; A[h][k]=aux;} ind=0;}}} ind=1;} ind=0; ///se realiza el metodo SOR while(r<imax && ind==0){ for(i=0;i<n;i++){ xk[i]=(1-w)*x0[i];

for(j=0;j<i;j++) sum1+=A[i][j]*xk[j]; for(j=i+1;j<n;j++) sum2+=A[i][j]*x0[j]; xk[i]+=(w/A[i][i])*(b[i]-sum1-sum2); if(fabs(xk[i]-x0[i])<tol){ ind=1;break;} x0[i]=xk[i]; sum1=0; sum2=0; } xresult(xk,n); ///se van imprimiendo resultados generados r++; } ///imprimiendo resultado if(r==imax) printf("\nSe he excedido el numero de iteraciones, y no se llego a la solucion del sistema :(\n"); else{ printf("Soluciones encontradas en la iteracion: %d",r); xresult(xk,n); } } void gauss_jordan(double **A,double *x,int n,int op){ ///metodo gauss jordan double aux,cte,cte2; int i,j,k,h,ind=1; ///realizando gauss jordan for(i=0;i<n;i++){ mresult(A,n,n+1,op); ///imprimiendo elementos modificados durante el proceso ///indeterminacion, se intercambian renglones o columnas if(A[i][i]==0 && i!=n-1){ for(k=i+1;k<n;k++){ if(A[k][i]!=0 && ind==1){ ///se compara con el elemento del siguiente renglon misma columna for(h=0;h<n+1;h++){ aux=A[i][h]; A[i][h]=A[k][h]; A[k][h]=aux;} ind=0;} if(A[i][k]!=0 && ind==1){ ///se compara con el elemento de la siguiente columna mismo renglon

for(h=0;h<n;h++){ aux=A[h][i]; A[h][i]=A[h][k]; A[h][k]=aux;} ind=0;}}} ind=1; ///se realiza proceso gauss-jordan cte=A[i][i]; for(j=0;j<n;j++){ cte2=A[j][i]; for(k=0;k<n+1;k++){ if(j==0) A[i][k]/=cte; if(j!=i) A[j][k]-=cte2*A[i][k];}}} mresult(A,n,n+1,op); ///imprimiendo elementos modificados durante el proceso ///imprimiendo soluciones for(i=0;i<n;i++) printf("\n\tx%d= % .6lf",i,A[i][n]); } void gaussiana(double **A,double *x,int n,int op){ ///metodo eliminacion gaussiana double aux,cte1,cte2,sum=0; int i,j,k,h,ind=1; ///modificando A para que sea matriz superior(U) printf("\nModificando A para que sea matriz superior."); for(i=0;i<n-1;i++){ ///indeterminacion, se intercambian renglones o columnas mresult(A,n,n+1,op); if(A[i][i]==0){ for(k=i+1;k<n;k++){ if(A[k][i]!=0 && ind==1){ ///se compara con el elemento del siguiente renglon misma columna for(h=0;h<n+1;h++){ aux=A[i][h]; A[i][h]=A[k][h]; A[k][h]=aux;} ind=0;} if(A[i][k]!=0 && ind==1){ ///se compara con el elemento de la siguiente columna mismo renglon for(h=0;h<n;h++){

aux=A[h][i]; A[h][i]=A[h][k]; A[h][k]=aux;} ind=0;}}} ind=1; ///modificando A para convertirla en U cte1=A[i][i]; for(j=i+1;j<n;j++){ cte2=(A[j][i])/cte1; for(k=i;k<n+1;k++) A[j][k]-=cte2*(A[i][k]);}} mresult(A,n,n+1,op); ///realizando sustitucion hacia atras con A de forma U y b en A, con soluciones en x. printf("\nRealizando sustitucion hacia atras:"); for(i=n-1;i>-1;i--){ xresult(x,n); if(A[i][i]==0){ printf("\nEl sistema tiene infinitas soluciones"); n=0; break;} x[i]=A[i][n]/A[i][i]; for(j=i+1;j<n;j++) sum+=A[i][j]*x[j]; x[i]-=sum/A[i][i]; sum=0;} if(n!=0) xresult(x,n); } void solveLU(double **A,double *x,double *b,int n,int op){ ///solucion de un sistema por factorizacion LU double **L,*y,cte,sum=0; int i,j,k,h; y=(double*)calloc(n,sizeof(double)); L=(double**)calloc(n,sizeof(double*)); for(i=0;i<n;i++) *(L+i)=(double*)calloc(n,sizeof(double)); ///llenando L como matriz identidad

for(i=0;i<n;i++) L[i][i]=1.0; printf("\nL="); mresult(L,n,n,op); ///modificando A para que sea matriz superior(U) for(i=0;i<n-1;i++) for(j=i+1;j<n;j++){ ///indeterminacion, se intercambian renglones o columnas if(A[i][i]==0){ printf("\nEl sistema no admite factorizacion A=LU ya que se necesita de pivoteo.\n"); i=n; n=0;break;} cte=(A[j][i])/(A[i][i]); L[j][i]=cte; for(k=i;k<n;k++) A[j][k]-=cte*(A[i][k]);} printf("\nU="); if(n!=0){ mresult(A,n,n,op); printf("\nObteniendo el vector y, de Ly=b");} ///sustitucion hacia adelante con L y b, con solucion en y for(i=0;i<n;i++){ sum=0; for(h=0;h<n;h++) printf("\n\ty%d= % .6lf",h+1,y[h]); printf("\n"); if(L[i][i]==0){ printf("\nEl sistema tiene infinitas soluciones"); n=0; break;} y[i]=b[i]/L[i][i]; for(j=0;j<i;j++) sum+=L[i][j]*y[j]; y[i]-=sum/L[i][i];} for(h=0;h<n;h++) printf("\n\ty%d= % .6lf",h+1,y[h]); printf("\n"); ///realizando sustitucion hacia atras con U y y, con solucion en x if(n!=0) printf("\nObteniendo el vector x, de Ux=y"); for(i=n-1;i>-1;i--){

sum=0; xresult(x,n); if(A[i][i]==0){ printf("\nEl sistema tiene infinitas soluciones"); n=0;break;} x[i]=y[i]/A[i][i]; for(j=i+1;j<n;j++) sum+=A[i][j]*x[j]; x[i]-=sum/A[i][i];} if(n!=0) xresult(x,n); free(y); for(i=0;i<n;i++) free(*(L+i)); free(L); } void s_adelante(double **A,double *x,double *b,int n,int op){ ///sustitucion hacia adelante para matriz inferior double sum=0; int i,j,k; ///se realiza sustitucion hacia adelente para L for(i=0;i<n;i++){ if(A[i][i]==0){ printf("\nEl sistema tiene infinitas soluciones"); n=0;break;} x[i]=b[i]/A[i][i]; for(j=0;j<i;j++) sum+=A[i][j]*x[j]; x[i]-=sum/A[i][i]; sum=0;} if(n!=0) xresult(x,n); } void s_atras(double **A,double *x,double *b,int n,int op){ ///sustitucion hacia atras para matriz superior double sum=0; int i,j,k; ///se realiza sustitucion hacia atras para U.

for(i=n-1;i>-1;i--){ if(A[i][i]==0){ printf("\nEl sistema tiene infinitas soluciones"); n=0;break;} x[i]=b[i]/A[i][i]; for(j=i+1;j<n;j++) sum+=A[i][j]*x[j]; x[i]-=sum/A[i][i]; sum=0;} if(n!=0) xresult(x,n); } void cholesky(double **A,double **L,int n,int op){ ///factorizacion de cholesky double cte,aux; int i,j,k; ///se comprueba si A es simetrica, transpuesta(A)=A for(i=0;i<n;i++) for(j=0;j<n;j++) if(j!=i) if(A[i][j]!=A[j][i]){ printf("\nLa matriz A no es simetrica\n\tNo acepta factorizacion de Cholesky.");n=0;} ///modificando A para que sea matriz superior(U) y llenando L printf("\nLlenando matriz inferior L."); for(i=0;i<n-1;i++) for(j=i+1;j<n;j++){ ///indeterminacion if(A[i][i]==0){ printf("\nEl sistema no admite factorizacion de Cholesky.\n"); i=n; n=0;break;} cte=(A[j][i])/(A[i][i]); printf("\nL="); mresult(L,n,n,op); L[j][i]=cte; for(k=i;k<n;k++) A[j][k]-=cte*(A[i][k]);} printf("\nL="); mresult(L,n,n,op); /// insertando los valores de U en L pero con raiz cuadrada

printf("\nInsertando la raiz cuadrada de los valores\nde la diagonal de A modificada como U en L."); for(i=0;i<n;i++) L[i][i]=sqrt(A[i][i]); printf("\nL="); mresult(L,n,n,op); ///se multiplica L[j][i]=L[j][i]*L[i][i], con i(renglones)=0,...,n y j(columnas)=i+1,...,n for(i=0;i<n;i++) for(j=i+1;j<n;j++) L[j][i]*=L[i][i]; printf("\nL="); mresult(L,n,n,op); if(n!=0){ printf("\nA = L * L^t\n "); printf("\tL =\n "); ///se muestra L mresult(L,n,n,op);} for(i=0;i<n;i++) ///2) se realiza la transpuesta de L for(j=i;j<n;j++){ aux=L[j][i]; L[j][i]=L[i][j]; L[i][j]=aux; } if(n!=0){ printf("\n\tL^t =\n "); ///se muestra L^t mresult(L,n,n,op);} } void faLU (double **A,double **L,int n,int op){ ///factorizacion de matriz, en matriz inferior por superior double cte; int i,j,k; ///llenando L como matriz identidad for(i=0;i<n;i++) L[i][i]=1.0; ///modificando A para que sea matriz superior(U) y llenando L for(i=0;i<n-1;i++) for(j=i+1;j<n;j++){ ///indeterminacion, se intercambian renglones o columnas if(A[i][i]==0){

printf("\nEl sistema no admite factorizacion A=LU ya que se necesita de pivoteo.\n"); i=n; n=0;break;} printf("\nL="); mresult(L,n,n,op); printf("\nU="); mresult(A,n,n,op); cte=(A[j][i])/(A[i][i]); L[j][i]=cte; for(k=i;k<n;k++) A[j][k]-=cte*(A[i][k]);} if(n!=0){ printf("\nA = L * U\n "); printf("\nL ="); mresult(L,n,n,op); printf("\nU ="); mresult(A,n,n,op);} } void multi(double **A,double **B,double **C,int n,int m,int p,int op2){ ///multiplicacion de matrices o vectores int i,j,k; for(i=0;i<n;i++) for(j=0;j<p;j++) for(k=0;k<m;k++) C[i][j]+=A[i][k]*B[k][j]; printf("\nA * B =\n "); mresult(C,n,p,op2); ///se muestra matriz resultado } void determinante(double **A,int n,int op){ ///determinante de matriz n*n double det=1,cte,aux; int i,j,k,h; char ind=1,change=0; ///modificando A para que sea matriz superior(U) for(i=0;i<n-1;i++) for(j=i+1;j<n;j++){ ///indeterminacion, se intercambian renglones o columnas if(A[i][i]==0){

for(k=i+1;k<n;k++){ if(A[k][i]!=0 && ind==1){ ///se compara con el elemento del siguiente renglon misma columna for(h=0;h<n;h++){ aux=A[i][h]; A[i][h]=A[k][h]; A[k][h]=aux;} ind=0; change++;} if(A[i][k]!=0 && ind==1){ ///se compara con el elemento de la siguiente columna mismo renglon for(h=0;h<n;h++){ aux=A[h][i]; A[h][i]=A[h][k]; A[h][k]=aux;} ind=0; change++;}}} ind=1; cte=(A[j][i])/(A[i][i]); for(k=i;k<n;k++) A[j][k]-=cte*(A[i][k]);} ///obteniendo determinante multiplicando los elementos de la diagonal for(i=0;i<n;i++) det*=A[i][i]; if(change%2) ///si el numero de cambios de renglon o columna es impar printf("\nDet(A)=% .6lf\n",-1*det); else printf("\nDet(A)=% .6lf\n",det); } void traza(double **A,int n,int m,int op){ ///traza de matriz n*m double traza=0; int i,j,k; ///se obtiene el menor de n y m if(n>m) k=m; else k=n; for(i=0;i<k;i++) ///se calcula la traza traza+=A[i][i]; printf("\nTraza(A)= % .4lf\n",traza); }

void transpuesta(double **A, double **AT,int n,int op){ ///transpuesta de matriz cuadrada int i,j; for(i=0;i<n;i++) for(j=i;j<n;j++){ ///se intercambian renglones por columnas y viceversa AT[i][j]=A[j][i]; AT[j][i]=A[i][j]; } printf("\nA^t=\n"); mresult(AT,n,n,op); } void sum_res(double **A,double **B,double **C,int n,int m,int op){ ///suma y resta de matrices int i,j; ///sumando o restando A+-B for(i=0;i<n;i++) for(j=0;j<m;j++){ if(op==1) C[i][j]=A[i][j]+B[i][j]; if(op==2) C[i][j]=A[i][j]-B[i][j];} if(op==1) printf("\nA+B=\n"); if(op==2) printf("\nA-B=\n"); mresult(C,n,m,op); } int main(void){ ///funcion principal double **A,**B,**C,*b,*x0,*x,tol,w; /// se declaran las matrices y vectores que se usaran para cualquier operacion que desee hacer el usario int op,op2,op3=0,n,m,p,i,j,aux,imax; /// se declaran las variables auxiliares a usar en las distintas funciones system("COLOR F0"); do{ printf("\nTRABAJANDO CON MATRICES.\n"); printf("\nQue deseas realizar?:\n1) Operaciones con matrices\n2) Factorizacion de matriz\n3) Solucion de sistema Ax=b \n\n4) Salir.\n\tOP?: "); scanf("%d",&op); ///se le pregunta al usuario la operzacion principal para despues mostrarle las siguientes opciones de lo que puede realizar, se proteje el programa ///para cualquier entrada erronea y se trata de economizar los printfs y scanfs con condicionales if ya que en varias operaciones se requieren los

///mismos datos ingresados por el usuario, como tambien se trata de economizar la creacion de memoria dinamica ya que la mayoria de las funciones ///las mismas caracteristicas como lo es una Matriz, 2 vectores (b y x, para problema Ax=b) switch(op){ case 1: do{printf("\nQue deseas realizar?:\n1) Suma\n2) Resta\n3) Multiplicacion\n4) Transpuesta\n5) Traza\n6) Determinante\n\n7) Salir.\n\tOP?: "); scanf("%d",&op2); op3=0; ///se reciben los datos para ejecutar las operaciones con matrices, con condicioneles if se separa lo que a mostrar y recibir para cada operacion if(op2==3){ printf("\nQue deseas realizar?:\n1) A(n*m) * B(m*p)\n2) A(n*n) * B(n*n)\n3) A(n*m) * B(m*1)\n\n4) Salir.\n\tOP?: "); scanf("%d",&op3);} if(op2>0 && op2<7 ){ if(op2==1 || op2==2 || (op2==3 && op3==3) || op2==5){ do{printf("\nRenglones n?: ");scanf("%d",&n); printf("Columnas m?: ");scanf("%d",&m);p=m; if(op3==3) p=1; }while(n<1 || m<1);} if(op2==4 || op2==6 || op3==2){ do{printf("\nDimension de la matriz, n?: ");scanf("%d",&n);m=n;p=n;}while(n<1);} if(op3==1){ do{printf("\nRenglones de A, n?: ");scanf("%d",&n); printf("Columnas de A, m?: ");scanf("%d",&m); printf("Columnas de B, p?: ");scanf("%d",&p);}while(n<1 || m<1 || p<1);} if((op3>=0 && op3<4) && (op2>0 && op2<7)){ A=(double**)malloc(n*sizeof(double*)); for(i=0;i<n;i++) *(A+i)=(double*)malloc(m*sizeof(double)); printf("\nA=\n"); for(i=0;i<n;i++) for(j=0;j<m;j++){ printf("[%d][%d]= ",i+1,j+1); scanf("%lf",&A[i][j]);} if(op2==3){ aux=n; n=m;} B=(double**)malloc(n*sizeof(double*)); for(i=0;i<n;i++) *(B+i)=(double*)malloc(p*sizeof(double)); ///se cambia a p para dimensionar correctamente al hacer la multiplicacion if(op2!=4 && op2!=5 && op2!=6){ printf("\nB=\n"); for(i=0;i<n;i++)

for(j=0;j<p;j++){ printf("[%d][%d]= ",i+1,j+1); scanf("%lf",&B[i][j]);}} if(op2==3){ n=aux;} C=(double**)calloc(n,sizeof(double*)); for(i=0;i<n;i++) *(C+i)=(double*)calloc(p,sizeof(double));}} switch(op2){ case 1: case 2: ///pedir A(n*m),B(n*m),realizar suma o resta, mostrar matriz resultado sum_res(A,B,C,n,m,op2); break; case 3: switch(op3){ case 1: ///pedir A(n*m),B(m*p), realizar multiplicacion, mostrar matriz resultado case 2: ///pedir A(n*n),B(n*n), realizar multiplicacion, mostrar matriz resultado case 3: ///pedir A(n*m),B(m*1), realizar multiplicacion, mostrar matriz resultado multi(A,B,C,n,m,p,op2); ///con los condicionales al recibir los datos se generaliza cualquier tipo de multiplicacion break; case 4: break; default: printf("\nOpcion invalida :(.\n");} break; case 4: ///pedir A(n*m),realizar transpuesta,mostrar matriz resultado transpuesta(A,C,n,op2); break; case 5: ///pedir A(n*m),k=min(n,m),calcular traza,mostrar resultado traza(A,n,m,op2); break; case 6: ///pedir A(n*n),calcular determinante, mostrar resultado determinante(A,n,op2); break; case 7: break; default:

printf("\nOpcion invalida :(, intenta de nuevo.\n"); } if((op2>0 && op2<7) && (op3>0 && op3<4)){ ///se libera la memoria usada dependiendo de la operacion que haya usado el usuario for(i=0;i<n;i++){ free(*(C+i));free(*(A+i));free(*(B+i));} free(C);free(A);free(B);} }while(op2!=7); break; case 2: do{printf("\nQue deseas realizar?:\n1) A=LU\n2) Cholesky A=LL^t\n\n3) Salir.\n\tOP?: "); scanf("%d",&op2); if((op2==1 || op2==2)){ do{printf("\nDimension de la matriz, n?: ");scanf("%d",&n);}while(n<1); A=(double**)malloc(n*sizeof(double*)); ///memoria para matriz donde se capturan los datos for(i=0;i<n;i++) *(A+i)=(double*)malloc(n*sizeof(double)); printf("\nA=\n"); for(i=0;i<n;i++) for(j=0;j<n;j++){ printf("[%d][%d]= ",i+1,j+1); scanf("%lf",&A[i][j]);} B=(double**)calloc(n,sizeof(double*)); ///memoria para matriz donde se realiza la factorizacion for(i=0;i<n;i++) *(B+i)=(double*)calloc(n,sizeof(double));} switch(op2){ case 1: ///pedir A(n*n),realizar factorizacion LU, mostrar dos matrices resultado faLU(A,B,n,op2); break; case 2: ///pedir A(n*n),comprobar simetria,realizar factorizacion LL^t, mostrar dos matrices resultado cholesky(A,B,n,op2); break; case 3: break; default: printf("\nOpcion invalida :(, intenta de nuevo.\n"); } if(op2==1 || op2==2){ ///se libera memoria usada para la factorizacion for(i=0;i<n;i++){

free(*(A+i)); free(*(B+i));} free(A);free(B);} }while(op2!=3); break; case 3: ///se resuelve el problema Ax=b, por medio de sistintos metodos do{printf("\nQue deseas realizar?:\n1) Sustitucion hacia atras\n2) Sustitucion hacia adelante\n3) Factorizacion LU\n4) Eliminacion gaussiana\n5) GaussJordan\nMetodos iterativos\n 6) Jacobi\n 7) Gauss-Seidel\n 8) SOR\n9) Salir\n\tOP?: "); scanf("%d",&op2); if(op2>0 && op2<9){ do{printf("\nDimension de la matriz, n?: ");scanf("%d",&n);m=n;}while(n<1); A=(double**)malloc(n*sizeof(double*)); for(i=0;i<n;i++){ if(op2==4 || op2==5) m++; *(A+i)=(double*)malloc(m*sizeof(double));} printf("\nA=\n"); ///lesctura de datos de A if(op2!=1 && op2!=2){ for(i=0;i<n;i++) for(j=0;j<n;j++){ printf("[%d][%d]= ",i+1,j+1); scanf("%lf",&A[i][j]);}} if(op2==1){ for(i=0;i<n;i++) for(j=i;j<n;j++){ printf("[%d][%d]= ",i+1,j+1); scanf("%lf",&A[i][j]);}} if(op2==2){ for(i=0;i<n;i++) for(j=0;j<i+1;j++){ printf("[%d][%d]= ",i+1,j+1); scanf("%lf",&A[i][j]);}} b=(double*)malloc(n*sizeof(double)); ///vector para guardar b x=(double*)calloc(n,sizeof(double)); ///vector para guardar x printf("\nb=\n"); for(i=0;i<n;i++){ printf("[%d]= ",i+1); if(op2==4 || op2==5) scanf("%lf",&A[i][n]); else scanf("%lf",&b[i]);}

if(op2==6 || op2==7 || op2==8){ ///en caso de que sea metodo iterativo se captura solucion propuesta x0=(double*)malloc(n*sizeof(double)); printf("\nx0=\n"); for(i=0;i<n;i++){ printf("[%d]= ",i+1); scanf("%lf",&x0[i]);} do{printf("\nNumero maximo de iteraciones?: ");scanf("%d",&imax);}while(imax<1); ///se capturan los datos necesarios para metodo iterativo do{printf("Digitos significativos despues del punto?: ");scanf("%lf",&tol);}while(tol<1); if(op2==8){do{printf("w?: ");scanf("%lf",&w);}while(w<=0 || w>=2);}}} switch(op2){ case 1: ///pedir U(n*n), b(n), realizar sustitucion hacia atras, mostrar vector resultado(x) s_atras(A,x,b,n,op2); break; case 2: ///pedir L(n*n), b(n), realizar sustitucion hacia adelante, mostrar vector resultado(x) s_adelante(A,x,b,n,op2); break; case 3: ///pedir A(n*n), b(n), realizar factorizacion LU para resolver sistema, mostrar vector resultado(x) solveLU(A,x,b,n,op2); break; case 4: ///pedir A(n*n), y b(n) en la ultima columna de A(de forma que tengamos A(n*(n+1))), realizar eliminacion gausssiana, mostrar vector resultado (x) gaussiana(A,x,n,op2); break; case 5: ///pedir A(n*n), y b(n) en la ultima columna de A(de forma que tengamos A(n*(n+1))), realizar gauss-jordan, mostrar vector resultado (x) gauss_jordan(A,x,n,op2); break; case 6: ///pedir A(n*n),b(n),x0(n),imax>0,digitos de tolerancia>0, realizar metodo de jacobi, mostrar vector resultado xf jacobi(A,x0,x,b,n,imax,tol,op2); break; case 7: ///pedir A(n*n),b(n),x0(n),imax>0,digitos de tolerancia>0, realizar metodo de gauss-seidel, mostrar vector resultado xf gauss_seidel(A,x0,x,b,n,imax,tol,op2); break; case 8: ///pedir A(n*n),b(n),x0(n),imax>0,digitos de tolerancia>0, realizar metodo SOR, mostrar vector resultado xk

SOR(A,x0,x,b,n,imax,tol,w,op2); break; case 9: break; default: printf("\nOpcion invalida :(, intenta de nuevo.\n"); } if(op2>0 && op2<9){ ///se libera memoria usada para la solucion del problema Ax=b for(i=0;i<n;i++) free(*(A+i)); free(A); free(b); free(x); if(op2==6 || op2==7 || op2==8){ free(x0);}} }while(op2!=9); break; case 4: printf("\nQue diversion trabajar con matrices, adios. :D\n"); break; default: printf("\nOpcion invalida :(, intenta de nuevo.\n"); } }while(op!=4); system("PAUSE"); return 0; }

S-ar putea să vă placă și