Advertisement
Guest User

Untitled

a guest
May 30th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <conio.h>
  5. #include <time.h>
  6. #define NTESTE 10
  7.  
  8. double f(double a0,double a1,double a2,double a3,double a4,double a5,double x)
  9. {
  10.     return a0*cos(a1*x) + a2*sin(a3*x) + exp(a4*x) + a5;
  11. }
  12.  
  13. double d1(double a0,double a1,double a2,double a3,double a4,double x)
  14. {
  15.     return -a0*a1*sin(a1*x) + a2*a3*cos(a3*x) + a4*exp(a4*x);
  16. }
  17.  
  18. double d2(double a0,double a1,double a2,double a3,double a4,double x)
  19. {
  20.     return -a0*a1*a1*cos(a1*x) - a2*a3*a3*sin(a3*x) + a4*a4*exp(a4*x);
  21. }
  22.  
  23. int NewtonRaphson(int N,double a,double b,double e1,double e2,double a0,double a1,double a2,double a3,double a4,double a5)
  24. {
  25.     double erro1 = 1.,erro2 = 0., fx, der, fa, fb;
  26.     double *xi;
  27.     int i = 0;
  28.     FILE *fp;
  29.     clock_t tin, tf, diff;
  30.  
  31.     tin = clock()/(CLOCKS_PER_SEC/1000);
  32.  
  33.     xi = (double*)malloc(N*sizeof(double));
  34.     fp = fopen("resultados.txt","a");
  35.  
  36.     xi[0] = (a+b)/2;
  37.  
  38.     erro2 = f(a0,a1,a2,a3,a4,a5,xi[0]);
  39.     if(erro2 < 0)
  40.         erro2 = -erro2;
  41.  
  42.     while(erro1 > e1 && erro2 > e2)
  43.     {
  44.         if(i > N)
  45.         {
  46.             printf("O método não convergiu em %d iteracoes!\n",N);
  47.             return 1;
  48.         }
  49.  
  50.         //Teorema de Bolzano
  51.         fa = f(a0,a1,a2,a3,a4,a5,a);
  52.         fb = f(a0,a1,a2,a3,a4,a5,b);
  53.  
  54.         if(fa*fb > 0)
  55.         {
  56.             printf("Pelo Teorema de Bolzano, o intervalo nao eh de separacao, entao nao ha raiz \nnesse intervalo!\n");
  57.             break;
  58.         }
  59.  
  60.         fx = f(a0,a1,a2,a3,a4,a5,xi[i]);
  61.         der = d1(a0,a1,a2,a3,a4,xi[i]);
  62.  
  63.         if(der == 0)
  64.         {
  65.             printf("A derivida eh zero! O processo nao pode continuar!\n\n");
  66.             break;
  67.         }
  68.  
  69.         xi[i+1] = xi[i] - fx/der;
  70.  
  71.         erro1 = xi[i+1] - xi[i];
  72.         if(erro1 < 0)
  73.             erro1 = -erro1;
  74.  
  75.         erro2 = f(a0,a1,a2,a3,a4,a5,xi[i+1]);
  76.         if(erro2 < 0)
  77.             erro2 = -erro2;
  78.  
  79.         i++;
  80.  
  81.         printf("Iteracao: %d\n",i);
  82.         printf("Raiz aproximada: %.5f\n",xi[i]);
  83.         printf("Erro 1: |x[i+1] - x[i]| = %.5f\n",erro1);
  84.         printf("Erro 2: |f(x[i])| = %.5f\n\n",erro2);
  85.     }
  86.  
  87.     tf = clock()/(CLOCKS_PER_SEC/1000);
  88.  
  89.     diff = tf - tin;
  90.  
  91.     printf("Tempo de Execucao Newton: %d ms\n",(int)diff);
  92.  
  93.     // Salvar no arquivo texto
  94.     fprintf(fp,"Newton\n");
  95.  
  96.     if(fa*fb > 0 || der == 0)
  97.         fprintf(fp,"Nao convergiu\n\n");
  98.     else
  99.     {
  100.         fprintf(fp,"Convergiu\n");
  101.         fprintf(fp,"Iteracao: %d\n",i);
  102.         fprintf(fp,"Raiz: %.5lf\n",xi[i]);
  103.         fprintf(fp,"Erro 1: %.5lf\n",erro1);
  104.         fprintf(fp,"Erro 2: %.5lf\n\n",erro2);
  105.     }
  106.  
  107.     fclose(fp);
  108.     free(xi);
  109.     return 0;
  110. }
  111.  
  112. int Halley(int N,double a,double b,double e1,double e2,double a0,double a1,double a2,double a3,double a4,double a5)
  113. {
  114.     double erro1 = 1., erro2 = 0., fx, der1, der2, fa, fb;
  115.     double *xi;
  116.     int i = 0;
  117.     FILE *fp;
  118.     clock_t tin, tf, diff;
  119.  
  120.     tin = clock()/(CLOCKS_PER_SEC/1000);
  121.  
  122.     xi = (double*)malloc(N*sizeof(double));
  123.     fp = fopen("resultados.txt","a");
  124.  
  125.     xi[0] = (a+b)/2;
  126.  
  127.     erro2 = f(a0,a1,a2,a3,a4,a5,xi[0]);
  128.     if(erro2 < 0)
  129.         erro2 = -erro2;
  130.  
  131.     while(erro1 > e1 && erro2 > e2)
  132.     {
  133.         if(i > N)
  134.         {
  135.             printf("O metodo nao convergiu em %d iteracoes!\n",N);
  136.             return 2;
  137.         }
  138.  
  139.         //Teorema de Bolzano
  140.         fa = f(a0,a1,a2,a3,a4,a5,a);
  141.         fb = f(a0,a1,a2,a3,a4,a5,b);
  142.  
  143.         if(fa*fb > 0)
  144.         {
  145.             printf("Pelo Teorema de Bolzano, o intervalo nao eh de separacao, entao nao ha raiz \nnesse intervalo!\n");
  146.             break;
  147.         }
  148.  
  149.         fx = f(a0,a1,a2,a3,a4,a5,xi[i]);
  150.         der1 = d1(a0,a1,a2,a3,a4,xi[i]);
  151.         der2 = d2(a0,a1,a2,a3,a4,xi[i]);
  152.  
  153.         if(der1 == 0 && der2 == 0)
  154.         {
  155.             printf("As derividas sao zero! O processo nao pode continuar!\n\n");
  156.             break;
  157.         }
  158.  
  159.         xi[i+1] = xi[i] - (2*fx*der1)/(2*der1*der1 - fx*der2);
  160.  
  161.         erro1 = xi[i+1] - xi[i];
  162.         if(erro1 < 0)
  163.             erro1 = -erro1;
  164.  
  165.         erro2 = f(a0,a1,a2,a3,a4,a5,xi[i+1]);
  166.         if(erro2 < 0)
  167.             erro2 = -erro2;
  168.  
  169.         i++;
  170.  
  171.         printf("Iteracao: %d\n",i);
  172.         printf("Raiz aproximada: %.5f\n",xi[i]);
  173.         printf("Erro 1: |x[i+1] - x[i]| = %.5f\n",erro1);
  174.         printf("Erro 2: |f(x[i])| = %.5f\n\n",erro2);
  175.     }
  176.  
  177.     tf = clock()/(CLOCKS_PER_SEC/1000);
  178.  
  179.     diff = tf - tin;
  180.  
  181.     printf("Tempo de Execucao: %d ms\n",(int)diff);
  182.  
  183.     // Salvar no arquivo texto
  184.     fprintf(fp,"Halley\n");
  185.  
  186.     if(fa*fb > 0 || (der1 == 0 && der2 == 0))
  187.         fprintf(fp,"Nao convergiu\n\n");
  188.     else
  189.     {
  190.         fprintf(fp,"Convergiu\n");
  191.         fprintf(fp,"Iteracao: %d\n",i);
  192.         fprintf(fp,"Raiz: %.5lf\n",xi[i]);
  193.         fprintf(fp,"Erro 1: %.5lf\n",erro1);
  194.         fprintf(fp,"Erro 2: %.5lf\n\n",erro2);
  195.     }
  196.  
  197.     fclose(fp);
  198.     free(xi);
  199.     return 0;
  200. }
  201.  
  202. int Bissecao(int N,double a,double b,double e1,double e2,double a0,double a1,double a2,double a3,double a4,double a5)
  203. {
  204.     double erro1 = 1., erro2 = 0., fa, fb, fxi;
  205.     double *xi;
  206.     int i = 0;
  207.     FILE *fp;
  208.     time_t tin, tf, diff;
  209.  
  210.     tin = clock()/(CLOCKS_PER_SEC/1000);
  211.  
  212.     xi = (double*)malloc(N*sizeof(double));
  213.     fp = fopen("resultados.txt","a");
  214.  
  215.     xi[0] = (a+b)/2;
  216.  
  217.     erro2 = f(a0,a1,a2,a3,a4,a5,xi[0]);
  218.     if(erro2 < 0)
  219.         erro2 = -erro2;
  220.  
  221.     while(erro1 > e1 && erro2 > e2)
  222.     {
  223.         if(i > N)
  224.             break;
  225.  
  226.         fa = f(a0,a1,a2,a3,a4,a5,a);
  227.         fb = f(a0,a1,a2,a3,a4,a5,b);
  228.         fxi = f(a0,a1,a2,a3,a4,a5,xi[i]);
  229.  
  230.         //Teorema de Bolzano
  231.          if(fa*fb > 0)
  232.         {
  233.             printf("Pelo Teorema de Bolzano, o intervalo nao eh de separacao, entao nao ha raiz \nnesse intervalo!\n");
  234.             break;
  235.         }
  236.  
  237.         if(fa*fxi < 0)
  238.             b = xi[i];
  239.         if(fb*fxi < 0)
  240.             a = xi[i];
  241.  
  242.         xi[i+1] = (a+b)/2;
  243.  
  244.         erro1 = xi[i+1] - xi[i];
  245.  
  246.         if(erro1 < 0)
  247.             erro1 = -erro1;
  248.  
  249.         erro2 = f(a0,a1,a2,a3,a4,a5,xi[i+1]);
  250.         if(erro2 < 0)
  251.             erro2 = -erro2;
  252.  
  253.         i++;
  254.  
  255.         printf("Iteracao: %d\n",i);
  256.         printf("Raiz aproximada: %.5f\n",xi[i]);
  257.         printf("Erro 1: |x[i+1] - x[i]| = %.5f\n",erro1);
  258.         printf("Erro 2: |f(x[i])| = %.5f\n\n",erro2);
  259.     }
  260.  
  261.     tf = clock()/(CLOCKS_PER_SEC/1000);
  262.  
  263.     diff = tf - tin;
  264.  
  265.     printf("Tempo de Execucao: %d ms\n",(int)diff);
  266.  
  267.     // Salvar no arquivo texto
  268.     fprintf(fp,"Bissecao\n");
  269.  
  270.     if(fa*fb > 0 || i > N)
  271.         fprintf(fp,"Nao convergiu");
  272.     else
  273.     {
  274.         fprintf(fp,"Convergiu\n");
  275.         fprintf(fp,"Iteracao: %d\n",i);
  276.         fprintf(fp,"Raiz: %.5lf\n",xi[i]);
  277.         fprintf(fp,"Erro 1: %.5lf\n",erro1);
  278.         fprintf(fp,"Erro 2: %.5lf\n\n",erro2);
  279.     }
  280.  
  281.     fclose(fp);
  282.     free(xi);
  283.     return 0;
  284. }
  285.  
  286. void calculoArqtext()
  287. {
  288.     double a0, a1, a2, a3, a4, a5;
  289.     double e1, e2;
  290.     double a, b;
  291.     int N, j = 0;
  292.     char inicio;
  293.     FILE *fp,*p;
  294.  
  295.     fp = fopen("testes.txt","r");
  296.  
  297.     p = fopen("resultados.txt","w");
  298.     fclose(p);
  299.  
  300.     for(j = 0;j < NTESTE;j++)
  301.     {
  302.         if(fp == NULL)
  303.         {
  304.            printf("Impossível abrir o arquivo!\n");
  305.            exit(3);
  306.         }
  307.         else
  308.         {
  309.  
  310.             printf("\t\tTESTE %d\n\n",j+1);
  311.  
  312.             fscanf(fp,"%lf",&a0);
  313.             printf("a0: %.5lf\n",a0);
  314.  
  315.             fscanf(fp,"%lf",&a1);
  316.             printf("a1: %.5lf\n",a1);
  317.  
  318.             fscanf(fp,"%lf",&a2);
  319.             printf("a2: %.5lf\n",a2);
  320.  
  321.             fscanf(fp,"%lf",&a3);
  322.             printf("a3: %.5lf\n",a3);
  323.  
  324.             fscanf(fp,"%lf",&a4);
  325.             printf("a4: %.5lf\n",a4);
  326.  
  327.             fscanf(fp,"%lf",&a5);
  328.             printf("a5: %.5lf\n",a5);
  329.  
  330.             fscanf(fp,"%d",&N);
  331.             printf("N: %d\n",N);
  332.  
  333.             fscanf(fp,"%lf",&e1);
  334.             printf("e1: %.5lf\n",e1);
  335.  
  336.             fscanf(fp,"%lf",&e2);
  337.             printf("e2: %.5lf\n",e2);
  338.  
  339.             fscanf(fp,"%lf",&a);
  340.             printf("a: %.5lf\n",a);
  341.  
  342.             fscanf(fp,"%lf",&b);
  343.             printf("b: %.5lf\n\n",b);
  344.  
  345.             printf("Iniciar?\n");
  346.             fflush(stdin);
  347.             scanf("%c",&inicio);
  348.  
  349.             printf("----------------------------------------\n\n");
  350.             printf("\t\t1 - Método de Newton-Raphson\n\n");
  351.             NewtonRaphson(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
  352.             printf("----------------------------------------\n\n");
  353.             getch();
  354.  
  355.             printf("----------------------------------------\n\n");
  356.             printf("\t\t2 - Método de Halley\n\n");
  357.             Halley(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
  358.             printf("----------------------------------------\n\n");
  359.             getch();
  360.  
  361.             printf("----------------------------------------\n\n");
  362.             printf("\t\t3 - Método da Bissecao\n\n");
  363.             Bissecao(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
  364.             printf("----------------------------------------\n\n");
  365.             getch();
  366.  
  367.         }
  368.     }
  369.     fclose(fp);
  370. }
  371.  
  372. void calculoUsuario()
  373. {
  374.     double a0, a1, a2, a3, a4, a5;
  375.     double e1, e2;
  376.     double a, b;
  377.     int N;
  378.     char inicio;
  379.     FILE *p;
  380.  
  381.     //Limpar o arquivo
  382.     p = fopen("resultados.txt","w");
  383.     fclose(p);
  384.  
  385.     //Coeficientes
  386.     printf("Entre os coeficientes:\na0: ");
  387.     fflush(stdin);
  388.     scanf("%lf",&a0);
  389.  
  390.     printf("a1: ");
  391.     fflush(stdin);
  392.     scanf("%lf",&a1);
  393.  
  394.     printf("a2: ");
  395.     fflush(stdin);
  396.     scanf("%lf",&a2);
  397.  
  398.     printf("a3: ");
  399.     fflush(stdin);
  400.     scanf("%lf",&a3);
  401.  
  402.     printf("a4: ");
  403.     fflush(stdin);
  404.     scanf("%lf",&a4);
  405.  
  406.     printf("a5: ");
  407.     fflush(stdin);
  408.     scanf("%lf",&a5);
  409.  
  410.     // Intervalo de Separação
  411.     printf("Qual o intervalo de separacao?\na: ");
  412.     fflush(stdin);
  413.     scanf("%lf",&a);
  414.  
  415.     printf("b: ");
  416.     fflush(stdin);
  417.     scanf("%lf",&b);
  418.  
  419.     //Erros
  420.     printf("Qual o erro 1: |x[i+1] - x[i]|? \n");
  421.     fflush(stdin);
  422.     scanf("%lf",&e1);
  423.  
  424.     printf("Qual o erro 2: |f(x[i])|? \n");
  425.     fflush(stdin);
  426.     scanf("%lf",&e2);
  427.  
  428.     //Número Máximo de Iterações
  429.     printf("Qual o numero maximo de iteracoes?\n");
  430.     fflush(stdin);
  431.     scanf("%d",&N);
  432.  
  433.     printf("Iniciar?\n");
  434.     fflush(stdin);
  435.     scanf("%c",&inicio);
  436.  
  437.     printf("----------------------------------------\n\n");
  438.     printf("\t\t1 - Método de Newton-Raphson\n\n");
  439.     NewtonRaphson(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
  440.     printf("----------------------------------------\n\n");
  441.     getch();
  442.  
  443.     printf("----------------------------------------\n\n");
  444.     printf("\t\t2 - Método de Halley\n\n");
  445.     Halley(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
  446.     printf("----------------------------------------\n\n");
  447.     getch();
  448.  
  449.     printf("----------------------------------------\n\n");
  450.     printf("\t\t3 - Método da Bissecao\n\n");
  451.     Bissecao(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
  452.     printf("----------------------------------------\n\n");
  453.     getch();
  454. }
  455.  
  456. int main()
  457. {
  458.     int opcao;
  459.  
  460.  
  461.     printf("Este eh um programa para calcular raizes da funcao\n\n\ta0cos(a1*x) + a2sen(a3*x) + e^(a4*x) + a5\n\n");
  462.  
  463.     while(1)
  464.     {
  465.         printf("Menu:\n1-Entrada do usuario\n2-Testes com arquivo texto\n3-Finalizar programa\n\n");
  466.         printf("Escolha uma opcao: ");
  467.         scanf("%d",&opcao);
  468.  
  469.         switch(opcao)
  470.         {
  471.             case 1:
  472.                 calculoUsuario();
  473.                 break;
  474.             case 2:
  475.                 calculoArqtext();
  476.                 break;
  477.             case 3:
  478.                 printf("Muito obrigado por usar o programa!\n\n");
  479.                 getch();
  480.                 exit(1);
  481.  
  482.         }
  483.     }
  484.     return 0;
  485. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement