Advertisement
ewertonfelippe

Zero das Raizes Bisseção e Falsa Posição

Jun 30th, 2016
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int main()
  6. {
  7.     int nmax,op2;
  8.     float xa,xb,erro;
  9.  
  10.     printf("\nDigite o Intervalo A:\n");
  11.     scanf(" %f",&xa);
  12.     printf("\nDigite o Intervalo B:\n");
  13.     scanf(" %f",&xb);
  14.     printf("\nDigite o numero maximo de Interacoes. Digite 0 para interacoes sem limite:\n");
  15.     scanf(" %d",&nmax);
  16.     printf("\nDigite a Precisao 'E':\n");
  17.     scanf(" %f",&erro);
  18.     Calc(xa,xb,nmax,erro);
  19.     printf("\nDigite 1 para ver o resultado em outro metodo ou 0 para continuar:\n");
  20.     scanf("%d",&op2);
  21.  
  22.     switch(op2)
  23.     {
  24.     case 1:
  25.         Calc(xa,xb,nmax,erro);
  26.         break;
  27.  
  28.     case 0:
  29.         break;
  30.     default:
  31.  
  32.         printf("\nOpcao nao suportada.");
  33.     }
  34.     return 0;
  35. }
  36.  
  37. float CalcFx(float x) //retorna f(x)
  38. {
  39.     return 2*pow(x,2)-10;
  40. }
  41.  
  42. float modulo(float y) //Valor em Modulo
  43. {
  44.     if(y<0) return (-1)*y;
  45.     return y;
  46. }
  47. float zeroBissecao(float xa,float xb,int nmax,float erro) //Calcula a raiz pelo metodo da bisseção
  48. {
  49.     int j=1;
  50.     float xm;
  51.     if(nmax==0) //desconsidera numero maximo de interações
  52.     {
  53.         while(1)
  54.         {
  55.             xm=(float)(xa+xb)/(2);
  56.             if(modulo(CalcFx(xm))<erro) break;
  57.             if(CalcFx(xa)*CalcFx(xm)<0)
  58.             {
  59.                 xb=xm;
  60.             }
  61.             else
  62.             {
  63.                 xa=xm;
  64.             }
  65.             j++;
  66.         }
  67.     }
  68.     else
  69.     {
  70.         while(j<=nmax) //considera numero maximo de interações
  71.         {
  72.             xm=(xa+xb)/2;
  73.             if(modulo(CalcFx(xm))<erro) break;
  74.             if(CalcFx(xa)*CalcFx(xm)<0)
  75.             {
  76.                 xb=xm;
  77.             }
  78.             else
  79.             {
  80.                 xa=xm;
  81.             }
  82.             j++;
  83.         }
  84.         if(!(modulo(CalcFx(xm))<erro)) printf("\nNumero maximo de interações Exedido. Numero de interações insuficientes para a precisão mencionada");
  85.     }
  86.     printf("\n Iteracoes: %d",j);
  87.     return xm;
  88.  
  89. }
  90.  
  91. float zeroPosFalsa(float xa,float xb,int nmax,float erro) //calcula a raiz pelo metodo da posicao falsa
  92. {
  93.     int i=2;
  94.     float x;
  95.     float k;
  96.     float ka=CalcFx(xa);
  97.     float kb=CalcFx(xb);
  98.     if(nmax==0) //numero maximo de interações sem limite
  99.     {
  100.         while(1)
  101.         {
  102.             x=xb-kb*((xb-xa)/(kb-ka));
  103.             if(modulo(x-xb)<erro)
  104.             {
  105.                 printf("\n Iteracoes: %d",i);
  106.                 return x;
  107.             }
  108.             i++;
  109.  
  110.             k=CalcFx(x);
  111.             if(k*kb<0)
  112.             {
  113.                 xa=xb;
  114.                 ka=kb;
  115.             }
  116.             xb=x;
  117.             kb=k;
  118.         }
  119.     }
  120.     else
  121.     {
  122.         while(i<=nmax) //considera numero maximo de interações
  123.         {
  124.             x=xb-kb*((xb-xa)/(kb-ka));
  125.             if(modulo(x-xb)<erro)
  126.             {
  127.                 printf("\n Iteracoes: %d",i);
  128.                 return x;
  129.             }
  130.             i++;
  131.             k=CalcFx(x);
  132.             if(k*kb<0)
  133.             {
  134.                 xa=xb;
  135.                 ka=kb;
  136.             }
  137.             xb=x;
  138.             kb=k;
  139.         }
  140.         printf("\nNumero maximo de interações Exedido. Numero de interações insuficientes para a precisão mencionada.");
  141.     }
  142. }
  143.  
  144. void Calc(float xa,float xb,int nmax,float erro) //funcao que recebe os dados como parametro e permite ao usuario escolher metodo de resolucao
  145. {
  146.     int op;
  147.  
  148.     do
  149.     {
  150.         printf("\nDigite 1 para Metodo da Bissecao ou 2 para Metodo da Posicao Falsa: ");
  151.         scanf("%d",&op);
  152.  
  153.         switch(op)
  154.         {
  155.         case 1:
  156.             printf("\nMetodo da Bissecao:");
  157.             float ResBI=zeroBissecao(xa,xb,nmax,erro);
  158.             printf("\nRaiz=%f ; f(raiz)=%f",ResBI,CalcFx(ResBI));
  159.             break;
  160.  
  161.         case 2:
  162.             printf("\nMetodo da Posicao Falsa:");
  163.             float ResFP=zeroPosFalsa(xa,xb,nmax,erro);
  164.             printf("\nRaiz=%f ; f(Raiz)=%f",ResFP,CalcFx(ResFP));
  165.             break;
  166.  
  167.         default:
  168.             printf("\nOpção Incorreta");
  169.         }
  170.     }
  171.     while(op!=1&&op!=2);
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement