/src/main.c
C | 272 lines | 203 code | 55 blank | 14 comment | 46 complexity | 0c97c33f631e1cafce422efaf0b05d4f MD5 | raw file
- /*
- * main.c
- *
- * Created on: 30/06/2012
- * Author: utnso
- */
- #include "main.h"
- int main(int argc, char **argv) {
- int n;
- printf("Ingrese la cantidad de filas/Columnas: ");
- scanf("%d",&n);
- printf("Matriz de %dx%d\n\n",n,n);
- float matriz[n][n+1];
- int i, j;
- i = 0;
- 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("%fx%d ",matriz[i][j],j+1);
- j++;
- }
- printf ("= %f\n",matriz[i][j]);
- i++;
- }
- //Comprobar si Es Diagonalmente Dominante
- {
- int nofunk;
- int diagdom;
- float maxaux, suma;
- int indexaux;
- nofunk = 0;
- 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");
- return 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");
- return 0;
- }
- }
- }
- //Ordenar Matriz
- {
- 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("%fx%d ",matriz[i][j],j+1);
- j++;
- }
- printf ("= %f\n",matriz[i][j]);
- i++;
- }
- //Metodo de Jacobi
- {
- 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][i]/matriz[i][n];
- }
- 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("%f ,",matrizR[i]);
- i++;
- }
- printf("%f )\n",matrizR[i]);
- 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("%f ,",matrizR[i]);
- i++;
- }
- printf("%f )\n",matrizR[i]);
- printf("Error de iteracion: %f\n\n",erroractual);
- }
- }
- return 0;
- }