Advertisement
coolphase

Metódos_Numéricos

May 25th, 2020
1,912
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define EULER 2.718281828459045235360287
  5. #define NMAX 200
  6. #define erro 0.0000000000000001
  7.  
  8. typedef double (*Funcao)(double);
  9.  
  10. //=============================== EQUAÇÕES ====================================================
  11.  
  12. double f1(double x){//Define a 1ª equação
  13.     return x - cos(x);
  14. }
  15.  
  16. double f2(double x){//Define a 2ª equação
  17.     return x*x*x - 9*x*x + 27*x - 27;
  18. }
  19.  
  20. double f3(double x){//Define a 3ª equação
  21.     return pow(EULER,x)-cos(x);
  22. }
  23.  
  24. double df1(double x){//Define a derivada 1ª da 1ª equação
  25.     return 1 + sin(x);
  26. }
  27.  
  28. double df2(double x){//Define a derivada 1ª da 2ª equação
  29.     return 3*x*x - 18*x + 27;
  30. }
  31.  
  32. double df3(double x){//Define a derivada 1ª da 3ª equação
  33.     return pow(EULER,x)+sin(x);
  34. }
  35.  
  36. double ddf1(double x){//Define a derivada 2ª da 1ª equação
  37.     return cos(x);
  38. }
  39.  
  40. double ddf2(double x){//Define a derivada 2ª da 2ª equação
  41.     return 6*x - 18;
  42. }
  43.  
  44. double ddf3(double x){//Define a derivada 2ª da 3ª equação
  45.     return pow(EULER,x)+cos(x);
  46. }
  47.  
  48. //=============================== MÉTODOS ====================================================
  49.  
  50. double* bissection_method(Funcao f, double valor_inicial_a, double valor_inicial_b, int* nB){
  51.     double a=valor_inicial_a, b=valor_inicial_b;//define os parametros iniciais
  52.     double* list = (double*)malloc(2*sizeof(double));//aloca memória para a lista das raizes iteradas
  53.     list[0] = a;//primeiros espaços do array reservados para as condições inicias
  54.     list[1] = b;//
  55.     double c;
  56.     int N = 1;//N: número de iterações
  57.     while(N<=NMAX){ //NMAX: número máximo de iterações
  58.         c = (a+b)/2; //aplica método da bissecção
  59.         list = realloc(list, (N+2)*sizeof(double)); //realoca o tamanho da lista de raizes
  60.         list[N+1] = c;// guarda o valor da nova raiz
  61.         *nB = N+2;//guarda o valor do novo tamanho da lista
  62.         if( f(c)==0 || (b-a)/2 < erro){// condição de parada
  63.             printf("[BISSECCAO]: Encontrou a raiz x=%.16lf em %d iteracoes\n", c, N);
  64.             return list;
  65.         }
  66.         N++;
  67.         if((f(c)<0 && f(a)<0) || (f(c)>0 && f(a)>0))// sinal(f(c)) == sinal(f(a))
  68.             a = c;
  69.         else
  70.             b = c;
  71.     }
  72. }
  73.  
  74. //==========================================================================================
  75.  
  76. double* secant_method(Funcao f, double valor_inicial_0, double valor_inicial_1, int* nS){
  77.     double x0=valor_inicial_0, x1=valor_inicial_1;
  78.     double* list = (double*)malloc(2*sizeof(double));//alocando memoria inicial no array para os valores iniciais
  79.     list[0] = x0;//espaços inicias reservados para as condições iniciais
  80.     list[1] = x1;//
  81.     double x2;
  82.     int N = 1;
  83.     while(N<=NMAX){
  84.         x2 = x1 - f(x1)*(x1 - x0)/(f(x1)-f(x0));//Aplicando o método da secante
  85.         list = realloc(list, (N+2)*sizeof(double));//realocando tamanho do array
  86.         list[N+1] = x2;//adicionando nova raiz a lista
  87.         *nS = N+2;//guardando o valor do tamanho da lista
  88.         if(fabs(x2-x1) < erro || f(x2)==0){//condição de parada
  89.             printf("[SECANTE]:   Encontrou a raiz x=%.16lf em %d iteracoes\n", x2, N);
  90.             return list;
  91.         }
  92.         N++;
  93.         x0 = x1;
  94.         x1 = x2;
  95.     }
  96. }
  97.  
  98. //==========================================================================================
  99.  
  100. double* newton_method(Funcao f, Funcao df, double valor_inicial, int* nN){
  101.     double x0 = valor_inicial;//definindo parametro inicial
  102.     double* list = (double*)malloc(sizeof(double));//alocando memória para o array de raizes
  103.     list[0] = x0;//espaço inicial resevado para o parametro inicial
  104.     double x;
  105.     int N = 1;
  106.     while(N<=NMAX){
  107.         x = x0 - (f(x0)/df(x0)); //Aplicando o método de Newton
  108.         list = realloc(list, (N+1)*sizeof(double));//realocando o tamanho do array
  109.         list[N] = x;//guardando a nova raiz
  110.         *nN = N+1;//guardando o novo tamanho do array
  111.         if( (fabs(x-x0) < erro) || (f(x) == 0) ){ //condição de parada
  112.             printf("[NEWTON]:    Encontrou a raiz x=%.16lf em %d iteracoes\n", x, N);
  113.             return list;
  114.         }
  115.         N++;
  116.         x0 = x;
  117.     }
  118. }
  119.  
  120. //==========================================================================================
  121.  
  122. double* halley_method(Funcao f, Funcao df, Funcao ddf, double valor_inicial, int* nH){
  123.     double x0 = valor_inicial;//definindo parametro inicial
  124.     double* list = (double*)malloc(sizeof(double));//alocando memória para o array de raizes
  125.     list[0] = x0;// espaço inicial reservado para o parametro inicial
  126.     double x;
  127.     int N = 1;
  128.     while (N<=NMAX){
  129.         x = x0 - ( f(x0)*df(x0)/((df(x0)*df(x0))-(f(x0)*ddf(x0))/2) ); //aplicando o método de Halley
  130.         list = realloc(list, (N+1)*sizeof(double));//realocando tamanho do array
  131.         list[N] = x;//guardando o valor da nova raiz
  132.         *nH = N+1;//guardando o novo valor do tamanho do array
  133.         if( (fabs(x-x0) < erro) || (f(x)==0) ) {//condição de parada
  134.             printf("[HALLEY]:    Encontrou a raiz x=%.16lf em %d iteracoes\n", x, N);
  135.             return list;
  136.         }
  137.         N++;
  138.         x0 = x;
  139.     }
  140. }
  141.  
  142. int main(){
  143.     //============================================================
  144.  
  145.     printf("Equacao a) x-cos(x)=0\n");
  146.  
  147.     int B1, S1, N1, H1;//Tamanho das listas com as raizes iteradas [INICIAL METÓDO][NUMERO RESPECTIVO A EQUAÇÃO]
  148.     double* list_bissection_1 = bissection_method(f1, 0, 1, &B1);//aplica o método da bissecção, retorna um array com as raizes iteradas e guarda o tamanho do array na variavel B1
  149.     //f1: função a ser aplicado o método
  150.     //0 e 1: parametros iniciais
  151.     //B1: tamanho do array de raizes iteradas a ser retornado
  152.     double* list_secant_1 = secant_method(f1, 0, 1, &S1);
  153.     double* list_newton_1 = newton_method(f1, df1, 0, &N1);
  154.     double* list_halley_1 = halley_method(f1, df1, ddf1, 0, &H1);
  155.     printf("\n\n");
  156.  
  157.     //============================================================
  158.  
  159.     printf("Equacao b) x^3-9x^2+27x-27=0\n");
  160.  
  161.     int B2, S2, N2, H2;
  162.     double* list_bissection_2 = bissection_method(f2, 0, 4, &B2);
  163.     double* list_secant_2 = secant_method(f2, 4, 5, &S2);
  164.     double* list_newton_2 = newton_method(f2, df2, 3.5, &N2);
  165.     double* list_halley_2 = halley_method(f2, df2, ddf2, 3.5, &H2);
  166.     printf("\n\n");
  167.  
  168.     //============================================================
  169.  
  170.     printf("Equacao c) e^x-cos(x)=0\n");
  171.  
  172.     int B3, S3, N3, H3;
  173.     double* list_bissection_3 = bissection_method(f3, -2, -1, &B3);
  174.     double* list_secant_3 = secant_method(f3, -3, -1, &S3);
  175.     double* list_newton_3 = newton_method(f3, df3, 1, &N3);
  176.     double* list_halley_3 = halley_method(f3, df3, ddf3, 1, &H3);
  177.     printf("\n\n");
  178.  
  179.     //============================================================
  180.  
  181. //=============================== LIBERAÇÃO DA MEMÓRIA ALOCADA ====================================================
  182.     free(list_bissection_1);
  183.     free(list_bissection_2);
  184.     free(list_bissection_3);
  185.  
  186.     free(list_secant_1);
  187.     free(list_secant_2);
  188.     free(list_secant_3);
  189.  
  190.     free(list_newton_1);
  191.     free(list_newton_2);
  192.     free(list_newton_3);
  193.  
  194.     free(list_halley_1);
  195.     free(list_halley_2);
  196.     free(list_halley_3);
  197. //=================================================================================================================
  198.     return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement