Advertisement
dayvsonsantos

Untitled

Apr 30th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. double dominante(int n, double matriz[][n+1]){ //ESSA É A FUNÇÃO PRA DEIXAR A FUNÇÃO DOMINANTE
  5. int i,j,k, posicao_maior; //DECLARA-SE UMA VARIAVEL PARA GUARDAR A POSIÇAO DO MAIOR NUMERO DA LINHA, A SOMA PARA
  6. double auxiliar,soma,contador_true; //GUARDAR O VALOR DA SOMA DOS COEFICIENTES DA LINHA != Aii, "AUXILIAR" PARA AJUDAR NA TROCA DE LINHA
  7.  
  8. //CPNTADOR_TRUE PARA VERIFICAR SE Aii > SOMA.
  9.  
  10. do{
  11. contador_true = 0; //AQUI, O PROGRAMA VAI VERIFICAR A POSIÇÃO j DO MAIOR TERMO DA LINHA E VAI MUDAR AS LINHAS DE TAL FORMA
  12. //QUE ESSE TERMO FIQUE NA LINHA COM O MESMO VALOR DE j DO MAIOR TERMO. ASSIM TEREMOS UMA DIAGONAL SEMPRE
  13. for(i = 0 ; i < n; i++){ //COM O MAIOR TERMO DA LINHA.
  14.  
  15. auxiliar = fabs(matriz[i][i]); // <----GUARDA O TERMO DA DIAGONAL EM AUXILIAR.
  16. for(j=0 ;j < n ;j ++){
  17. if(fabs(matriz[i][j]) > auxiliar){ //<-----VERIFICA SE O TERMO Aij É MAIOR Q O DO MAIOR TERMO VERIFICADO ANTERIORMENTE.
  18. auxiliar = matriz[i][j]; //CASO NÃO ELE SEGE VERIFICANDO OS OUTROS TERMOS. CASO SIM, AUXILIAR FICA COM O SEU VALOR E SE GUARDA
  19. posicao_maior = j; //A SUA POSIÇÃO PARA TROCA-LO DE LINHA FUTURAMENTE.
  20. }
  21. }
  22. if(auxiliar != matriz[i][i]){
  23. for(k = 0; k < n + 1; k ++){
  24. auxiliar = matriz[posicao_maior][k]; //TROCA O AS LINHAS Q TEM O MAIOR TERMO Aij PELA LINHA Aj(OS MAIORES TERMOS DA LINHA SEMPRE FICARÃO
  25. matriz[posicao_maior][k] = matriz[i][k]; //NA POSIÇÃO DA DIAGONAL APÓS ESSA FUNÇÃO RODAR.
  26. matriz[i][k] = auxiliar;
  27. }
  28. }
  29. }
  30. for(i=0; i < n; i++){ //NESTA PARTE A FUNÇÃO VERIFICA SE A MATRIZ FICOU REALMENTE DIAGONAL DOMINANTE.
  31. soma= 0; //TODA VEZ Q UMA LINHA TEM Aij > SOMA, O CONTADOR_TRUE SOMA + 1
  32. for(j = 0; j < n; j ++){ // O LAÇO SÓ É QUEBRADO QUANDO CONTADO_TRUE FOR IGUAL AO TAMANHO DE LINHAS DO SISTEMA.
  33. if(i!= j){
  34. soma = soma + fabs(matriz[i][j]);
  35. }
  36. }
  37. if(fabs(matriz[i][i]) >= soma){
  38. contador_true++;
  39. }
  40.  
  41. }
  42. }while(contador_true < n);
  43. }
  44. int VerificaDominancia (int n, double matriz[][n +1 ]){ //ESSA É A FUNÇÃO Q VERIFICA SE É OU N DOMINANTE
  45.  
  46. int i,j,contador_true = 0;
  47. double soma;
  48.  
  49. for(i=0; i < n; i++){
  50. soma = 0;
  51. for(j = 0; j < n; j ++){
  52. if(i!= j){
  53. soma = soma + fabs(matriz[i][j]);
  54. }
  55. }
  56. if(fabs(matriz[i][i]) >= soma){
  57. contador_true++;
  58. }
  59.  
  60. }
  61.  
  62. if(contador_true < n){
  63. dominante(n, matriz);
  64. } else {
  65. return matriz;
  66. }
  67. }
  68. double GaussSeidel(int n, double m[][n+1],int max_inte, double erro_max) { // ESSA FOI A FUNÇÃO Q VC CRIOU, SÓ Q EM UMA FUNÇÃO ¯\_(?)_/¯
  69. int i,j,contador,cont_erro;
  70. double konst,x[n],y[n], mat_aux[n][n+1]; // DECLARO UM VETOR DE INCOGNITAS, UM VETOR Q O VAI AUXILIAR, UMA MATRIZ CÓPIA DA MATRIZ INFORMADA
  71.  
  72.  
  73. VerificaDominancia(n,m);
  74.  
  75. //PRIMEIRA INTERACAO
  76. for(i=1; i<n; i++) {
  77. x[i] = 0;
  78.  
  79. }
  80.  
  81. //N INTERACOES
  82. do{
  83.  
  84. cont_erro = 0;
  85.  
  86. printf("\n\ninteracao no %i\t",contador);
  87. for(i=0;i<n;i++){
  88. printf(" \tx(%i) = %.4lf\t",i+1,x[i]);
  89. }
  90.  
  91. for(i=0;i<n;i++){
  92. konst = 0.0;
  93. for(j=0;j<n;j++){
  94. if(i != j){
  95. konst = konst + x[j]*mat_aux[i][j];
  96. }
  97. }
  98. x[i] = (mat_aux[i][n] - konst)/mat_aux[i][i];
  99. }
  100.  
  101. for(i=0;i<n;i++){
  102. if(fabs(x[i]-y[i]) < erro_max){
  103. cont_erro++;
  104. }
  105. y[i] = x[i];
  106. }
  107.  
  108. contador++;
  109. if(contador == max_inte){
  110. printf("\n\n\n\n\n\n\t\t\t\t**Maxima interacao atingida!**\n");
  111. break;
  112. }
  113. }while(cont_erro != n);
  114.  
  115. printf("A solucao eh:\n");
  116. for(i=0; i<n; i++){
  117. printf("%.3lf \n", x[i]);
  118. }
  119. }
  120.  
  121. int main(){
  122.  
  123. int i, j, n/*TAMANHO DO SISTEMA*/;
  124. //TAMANHO DO SISTEMA
  125.  
  126. printf("Digite a ordem do sistema(Com maximo 100):\n");
  127. scanf("%d", &n);
  128. printf("Digite os coeficientes:\n");
  129.  
  130. double m[n][n+1]/*COEFICIENTES DO SISTEMA*/;
  131.  
  132. while(n<1 || n>100) { // restricao do sistema para ser no maximo de ordem 100
  133. printf("Valor invalido digite novamente:\n");
  134. scanf("%d", &n);
  135. }
  136.  
  137. for(i=0; i<n; i++){
  138. for(j=0; j<n+1; j++) {
  139. printf("Elemento:(%d,%d): \n", i+1,j+1);
  140. scanf("%lf", &m[i][j]);
  141. }
  142. }
  143.  
  144.  
  145. GaussSeidel(n,m,12,0.01); //50 = maximainteração 0.00001 = minimo erro
  146.  
  147. return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement