PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main.c

https://github.com/nahuelm/Superior
C | 272 lines | 203 code | 55 blank | 14 comment | 46 complexity | 0c97c33f631e1cafce422efaf0b05d4f MD5 | raw file
  1. /*
  2. * main.c
  3. *
  4. * Created on: 30/06/2012
  5. * Author: utnso
  6. */
  7. #include "main.h"
  8. int main(int argc, char **argv) {
  9. int n;
  10. printf("Ingrese la cantidad de filas/Columnas: ");
  11. scanf("%d",&n);
  12. printf("Matriz de %dx%d\n\n",n,n);
  13. float matriz[n][n+1];
  14. int i, j;
  15. i = 0;
  16. while (i<=n-1){
  17. j = 0;
  18. while (j<=n-1){
  19. printf("Ingrese el a%d de la fila %d: ",j,i);
  20. scanf("%f", &matriz[i][j]);
  21. j++;
  22. }
  23. printf("Ingrese el b%d de la fila %d: ",j,i);
  24. scanf("%f", &matriz[i][j]);
  25. i++;
  26. }
  27. printf("\n\nSistema de Ecuaciones: \n\n");
  28. i = 0;
  29. while (i<=n-1){
  30. j = 0;
  31. while (j<=n-1){
  32. printf("%fx%d ",matriz[i][j],j+1);
  33. j++;
  34. }
  35. printf ("= %f\n",matriz[i][j]);
  36. i++;
  37. }
  38. //Comprobar si Es Diagonalmente Dominante
  39. {
  40. int nofunk;
  41. int diagdom;
  42. float maxaux, suma;
  43. int indexaux;
  44. nofunk = 0;
  45. diagdom = 0;
  46. i = 0;
  47. while ((nofunk == 0) && (i<=n-1)){
  48. maxaux = 0;
  49. suma = 0;
  50. for (j=0;j<=n-1;j++){
  51. if (abs(matriz[i][j]) > abs(maxaux)){
  52. maxaux = abs(matriz[i][j]);
  53. indexaux = j;
  54. }
  55. if (abs(matriz[i][j]) == abs(maxaux)){
  56. }
  57. }
  58. diagdom = diagdom + indexaux +1;
  59. for (j=0;j<=n-1;j++){
  60. if (j!=indexaux){
  61. suma = suma + abs(matriz[i][j]);
  62. }
  63. }
  64. if (suma > maxaux){
  65. nofunk = 1;
  66. }
  67. i++;
  68. }
  69. if (nofunk == 1){
  70. printf("\nNo es Diagonalmente Dominante\n");
  71. return 0;
  72. }
  73. //Comprobar Orden de Columnas
  74. {
  75. int sumin;
  76. sumin = 0;
  77. for (i=1;i<=n;i++){
  78. sumin = sumin +i;
  79. }
  80. if (sumin == diagdom){
  81. printf("Es Diagonalmente Dominante \n");
  82. }else{
  83. printf("No es Diagonalmente Dominante\n");
  84. return 0;
  85. }
  86. }
  87. }
  88. //Ordenar Matriz
  89. {
  90. int indexaux;
  91. float Aux, maxaux;
  92. i = 0;
  93. while (i <= n-1){
  94. maxaux = 0;
  95. for (j=0;j<=n-1;j++){
  96. if (abs(matriz[i][j]) > abs(maxaux)){
  97. maxaux = abs(matriz[i][j]);
  98. indexaux = j;
  99. }
  100. if (abs(matriz[i][j]) == abs(maxaux)){
  101. }
  102. }
  103. if (indexaux != i){
  104. int contador;
  105. for (contador=0;contador<=n-1;contador++){
  106. Aux = matriz[contador][i];
  107. matriz[contador][i] = matriz[contador][indexaux];
  108. matriz[contador][indexaux] = Aux;
  109. }
  110. }
  111. i++;
  112. }
  113. }
  114. printf("\n\nSistema de Ecuaciones ordenado \n\n");
  115. i = 0;
  116. while (i<=n-1){
  117. j = 0;
  118. while (j<=n-1){
  119. printf("%fx%d ",matriz[i][j],j+1);
  120. j++;
  121. }
  122. printf ("= %f\n",matriz[i][j]);
  123. i++;
  124. }
  125. //Metodo de Jacobi
  126. {
  127. float error;
  128. float calcerror;
  129. float erroractual;
  130. printf("\n\nIngrese el error aceptado: ");
  131. scanf("%f",&error);
  132. float matrizR[n];
  133. float matrizT[n][n];
  134. float matrizC[n];
  135. float matrizAux[n];
  136. float matrizError[n];
  137. int i,j;
  138. for (i=0;i<=n-1;i++){
  139. printf("Ingrese el x%d Inicial: ", i);
  140. scanf("%f",&matrizR[i]);
  141. }
  142. for (i=0;i<=n-1;i++){
  143. for (j=0;j<=n-1;j++){
  144. matrizT[i][j] = - matriz[i][j]/matriz[i][i];
  145. }
  146. matrizT[i][i] = 0;
  147. }
  148. for(i=0;i<=n-1;i++){
  149. matrizC[i] = matriz[i][i]/matriz[i][n];
  150. }
  151. int iteracion;
  152. float resultado;
  153. iteracion = 1;
  154. for (i=0;i<=n-1;i++){
  155. resultado = 0;
  156. for(j=0;j<=n-1;j++){
  157. resultado = resultado + (matrizT[i][j] * matrizR[j]);
  158. }
  159. matrizAux[i] = resultado + matrizC[i];
  160. }
  161. for (i=0;i<=n-1;i++){
  162. matrizError[i] = matrizR[i] - matrizAux[i];
  163. }
  164. for (i=0;i<=n-1;i++){
  165. matrizR[i] = matrizAux[i];
  166. }
  167. //Sacar error
  168. calcerror = 0;
  169. for (i=0;i<=n-1;i++){
  170. calcerror = calcerror + (matrizError[i]*matrizError[i]);
  171. }
  172. erroractual = sqrt(calcerror);
  173. //Imprimir Iteracion
  174. i = 0;
  175. printf("Iteracion: %d\n",iteracion);
  176. printf("Resultado: ( ");
  177. while (i<=n-2){
  178. printf("%f ,",matrizR[i]);
  179. i++;
  180. }
  181. printf("%f )\n",matrizR[i]);
  182. printf("Error de iteracion: %f\n\n",erroractual);
  183. while (erroractual >= error){
  184. iteracion++;
  185. for (i=0;i<=n-1;i++){
  186. resultado = 0;
  187. for(j=0;j<=n-1;j++){
  188. resultado = resultado + (matrizT[i][j] * matrizR[j]);
  189. }
  190. matrizAux[i] = resultado + matrizC[i];
  191. }
  192. for (i=0;i<=n-1;i++){
  193. matrizError[i] = matrizR[i] - matrizAux[i];
  194. }
  195. for (i=0;i<=n-1;i++){
  196. matrizR[i] = matrizAux[i];
  197. }
  198. //Sacar error
  199. calcerror = 0;
  200. for (i=0;i<=n-1;i++){
  201. calcerror = calcerror + (matrizError[i]*matrizError[i]);
  202. }
  203. erroractual = sqrt(calcerror);
  204. //Imprimir Iteracion
  205. i = 0;
  206. printf("Iteracion: %d\n",iteracion);
  207. printf("Resultado: ( ");
  208. while (i<=n-2){
  209. printf("%f ,",matrizR[i]);
  210. i++;
  211. }
  212. printf("%f )\n",matrizR[i]);
  213. printf("Error de iteracion: %f\n\n",erroractual);
  214. }
  215. }
  216. return 0;
  217. }