/src/Superior.c
C | 353 lines | 268 code | 71 blank | 14 comment | 55 complexity | 442e58d94b06ce398547953031a1398c MD5 | raw file
- /*
- * Superior.c
- *
- * Created on: 30/06/2012
- * Author: utnso
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- char* FuncionDec(int n);
- int main(int argc, char **argv) {
- char c;
- int n;
- int decimales;
- char *cad;
- do{
- int nofunk;
- nofunk = 0;
- printf("Ingrese la cantidad de filas/Columnas: ");
- scanf("%d",&n);
- float matriz[n][n+1];
- int i, j;
- i = 0;
- printf("Ingrese la cantidad de decimales a utilizar (max 7): ");
- scanf("%d",&decimales);
- if ((decimales > 0) && (decimales < 8)){
- cad = FuncionDec(decimales);
- }else{
- nofunk = 2;
- printf("ERROR: Exceso de decimales\n");
- }
- if (nofunk == 0){
- printf("Matriz de %dx%d\n\n",n,n);
- while (i<=n-1){
- j = 0;
- while (j<=n-1){
- printf("Ingrese el a%d de la fila %d: ",j,i);
- scanf("%f", &matriz[i][j]);
- j++;
- }
- printf("Ingrese el b%d de la fila %d: ",j,i);
- scanf("%f", &matriz[i][j]);
- i++;
- }
- printf("\n\nSistema de Ecuaciones: \n\n");
- i = 0;
- while (i<=n-1){
- j = 0;
- while (j<=n-1){
- printf(cad,matriz[i][j]);
- printf("x%d ", i+1);
- j++;
- }
- printf ("= ");
- printf (cad,matriz[i][j]);
- printf ("\n");
- i++;
- }
- //Comprobar si Es Diagonalmente Dominante
- {
- int diagdom;
- float maxaux, suma;
- int indexaux;
- diagdom = 0;
- i = 0;
- while ((nofunk == 0) && (i<=n-1)){
- maxaux = 0;
- suma = 0;
- for (j=0;j<=n-1;j++){
- if (abs(matriz[i][j]) > abs(maxaux)){
- maxaux = abs(matriz[i][j]);
- indexaux = j;
- }
- if (abs(matriz[i][j]) == abs(maxaux)){
- }
- }
- diagdom = diagdom + indexaux +1;
- for (j=0;j<=n-1;j++){
- if (j!=indexaux){
- suma = suma + abs(matriz[i][j]);
- }
- }
- if (suma > maxaux){
- nofunk = 1;
- }
- i++;
- }
- if (nofunk == 1){
- printf("\nNo es Diagonalmente Dominante\n");
- nofunk = 1;
- }
- if (nofunk == 0){
- //Comprobar Orden de Columnas
- int sumin;
- sumin = 0;
- for (i=1;i<=n;i++){
- sumin = sumin +i;
- }
- if (sumin == diagdom){
- printf("Es Diagonalmente Dominante \n");
- }else{
- printf("No es Diagonalmente Dominante\n");
- nofunk = 1;
- }
- }
- }
- }
- //Ordenar Matriz
- if (nofunk==0){
- int indexaux;
- float Aux, maxaux;
- i = 0;
- while (i <= n-1){
- maxaux = 0;
- for (j=0;j<=n-1;j++){
- if (abs(matriz[i][j]) > abs(maxaux)){
- maxaux = abs(matriz[i][j]);
- indexaux = j;
- }
- if (abs(matriz[i][j]) == abs(maxaux)){
- }
- }
- if (indexaux != i){
- int contador;
- for (contador=0;contador<=n-1;contador++){
- Aux = matriz[contador][i];
- matriz[contador][i] = matriz[contador][indexaux];
- matriz[contador][indexaux] = Aux;
- }
- }
- i++;
- }
- printf("\n\nSistema de Ecuaciones ordenado \n\n");
- i = 0;
- while (i<=n-1){
- j = 0;
- while (j<=n-1){
- printf(cad,matriz[i][j]);
- printf("x%d ",j+1);
- j++;
- }
- printf ("= ");
- printf (cad,matriz[i][j]);
- printf ("\n");
- i++;
- }
- }
- //Metodo de Jacobi
- if (nofunk==0){
- float error;
- float calcerror;
- float erroractual;
- printf("\n\nIngrese el error aceptado: ");
- scanf("%f",&error);
- float matrizR[n];
- float matrizT[n][n];
- float matrizC[n];
- float matrizAux[n];
- float matrizError[n];
- int i,j;
- for (i=0;i<=n-1;i++){
- printf("Ingrese el x%d Inicial: ", i);
- scanf("%f",&matrizR[i]);
- }
- for (i=0;i<=n-1;i++){
- for (j=0;j<=n-1;j++){
- matrizT[i][j] = - matriz[i][j]/matriz[i][i];
- }
- matrizT[i][i] = 0;
- }
- for(i=0;i<=n-1;i++){
- matrizC[i] = matriz[i][n]/matriz[i][i];
- }
- int iteracion;
- float resultado;
- iteracion = 1;
- for (i=0;i<=n-1;i++){
- resultado = 0;
- for(j=0;j<=n-1;j++){
- resultado = resultado + (matrizT[i][j] * matrizR[j]);
- }
- matrizAux[i] = resultado + matrizC[i];
- }
- for (i=0;i<=n-1;i++){
- matrizError[i] = matrizR[i] - matrizAux[i];
- }
- for (i=0;i<=n-1;i++){
- matrizR[i] = matrizAux[i];
- }
- //Sacar error
- calcerror = 0;
- for (i=0;i<=n-1;i++){
- calcerror = calcerror + (matrizError[i]*matrizError[i]);
- }
- erroractual = sqrt(calcerror);
- //Imprimir Iteracion
- i = 0;
- printf("Iteracion: %d\n",iteracion);
- printf("Resultado: ( ");
- while (i<=n-2){
- printf(cad, matrizR[i]);
- printf(" ,");
- i++;
- }
- printf (cad,matrizR[i]);
- printf(" )\n");
- printf("Error de iteracion: %f\n\n",erroractual);
- while (erroractual >= error){
- iteracion++;
- for (i=0;i<=n-1;i++){
- resultado = 0;
- for(j=0;j<=n-1;j++){
- resultado = resultado + (matrizT[i][j] * matrizR[j]);
- }
- matrizAux[i] = resultado + matrizC[i];
- }
- for (i=0;i<=n-1;i++){
- matrizError[i] = matrizR[i] - matrizAux[i];
- }
- for (i=0;i<=n-1;i++){
- matrizR[i] = matrizAux[i];
- }
- //Sacar error
- calcerror = 0;
- for (i=0;i<=n-1;i++){
- calcerror = calcerror + (matrizError[i]*matrizError[i]);
- }
- erroractual = sqrt(calcerror);
- //Imprimir Iteracion
- i = 0;
- printf("Iteracion: %d\n",iteracion);
- printf("Resultado: ( ");
- while (i<=n-2){
- printf(cad, matrizR[i]);
- printf(" ,");
- i++;
- }
- printf (cad,matrizR[i]);
- printf(" )\n");
- printf("Error de iteracion: %f\n\n",erroractual);
- }
- }
- printf("\n Ingrese 's' Para ingresar un nuevo sistema de ecuaciones: ");
- scanf("%s", &c);
- }while ((c=='s')||(c=='S'));
- return 0;
- }
- char* FuncionDec(int n){
- char *j;
- j = malloc(15);
- switch (n){
- case 1:
- j = "%5.1f";
- return j;
- break;
- case 2:
- j = "%5.2f";
- return j;
- break;
- case 3:
- j = "%5.3f";
- return j;
- break;
- case 4:
- j = "%5.4f";
- return j;
- break;
- case 5:
- j = "%5.5f";
- return j;
- break;
- case 6:
- j = "%5.6f";
- return j;
- break;
- case 7:
- j = "%5.7f";
- return j;
- break;
- }
- return j;
- }