Advertisement
dayvsonsantos

Untitled

Apr 30th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 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 ]){ //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) {
  69. int i, j, k, interacoes=0;
  70. double x[n], soma1, y[n], z[n], erro;
  71.  
  72. VerificaDominancia(n,m);
  73.  
  74. //PRIMEIRA INTERACAO
  75. for(i=1; i<n; i++) {
  76. x[i] = 0;
  77.  
  78. }
  79.  
  80. //N INTERACOES
  81. do {
  82. if(interacoes > 0) {
  83. for(i=0; i<n; i++) {
  84. erro = fabs(y[i] - z[i]); // max( |Xi(k+1)- Xi(k)| ) < ERRO MAXIMO
  85. if(erro < erro_max) {
  86. printf("LIMITE DO ERRO ATINGIDO\n\n");
  87.  
  88. printf("A solucao eh:\n");
  89. for(i=0; i<n; i++){
  90. printf("X%d: %.5e \n", i, x[i]); //IMPRIME A SOLUCAO DO SISTEMA
  91. }
  92.  
  93. return 0;
  94. }
  95. }
  96.  
  97. }
  98.  
  99. for(i=0; i<n; i++) {
  100. soma1 = 0;
  101.  
  102. z[i] = x[i]; // USADO PARA ARMAZENA O VETOR PARA CALCULO DO ERRO
  103. for(j=0; j<n ; j++){ //O METODO DE GAUSS-SEIDEL OCORRE
  104. if(i != j) { //NESSA PARTE DO CODIGO
  105. soma1 = soma1 + m[i][j]*x[j];
  106. }
  107. }
  108. x[i] = (m[i][n] - soma1)/m[i][i];
  109. y[i] = x[i]; // USADO PARA ARMAZENA O VETOR ATUALIZADO PARA CALCULO DO ERRO
  110. }
  111.  
  112. printf("\nInteracao %d \n", interacoes+1);
  113. for(i=0; i<n; i++){
  114. printf("\nX%d: %.5lf \n\n", i, x[i]); //QUANTIDADE DE INTERACOES
  115. }
  116.  
  117. interacoes++;
  118.  
  119. }while(interacoes < max_inte);
  120.  
  121. printf("A solucao eh:\n");
  122. for(i=0; i<n; i++){
  123. printf("X%d: %.5e \n", i, x[i]); //IMPRIME A SOLUCAO DO SISTEMA
  124. }
  125. }
  126.  
  127. int main(){
  128.  
  129. int i, j, n/*TAMANHO DO SISTEMA*/;
  130. //TAMANHO DO SISTEMA
  131.  
  132. printf("Digite a ordem do sistema(Com maximo 100):\n");
  133. scanf("%d", &n);
  134. printf("Digite os coeficientes:\n");
  135.  
  136. double m[n][n+1]/*COEFICIENTES DO SISTEMA*/;
  137.  
  138. while(n<1 || n>100) { // RESTRICAO DO SISTEMA PARA SER NO MAXIMO DE ORDEM 100
  139. printf("Valor invalido digite novamente:\n");
  140. scanf("%d", &n);
  141. }
  142.  
  143. for(i=0; i<n; i++){
  144. for(j=0; j<n+1; j++) {
  145. printf("Elemento:(%d,%d): \n", i,j); //COEFICIENTES DAS VARIAVEIS DO SISTEMA
  146. scanf("%lf", &m[i][j]);
  147. }
  148. }
  149.  
  150.  
  151. GaussSeidel(n,m,20,0.00001); //maximainteração 0.00001 = minimo erro
  152.  
  153. return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement