Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Bisezione - bisezione.c

bisezione.c

Caricato da:
Scarica il programma completo

  1. /**
  2.  * @Author: Guglielmo Fachini a.k.a GuglielmoS
  3.  * @Purpose: Dimostrare il metodo di bisezione per ricavare gli zeri di una funzione.
  4.  * @Date: 11/03/2010
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <math.h>
  9.  
  10.  
  11. /* Precisione perfetta: pow(x, 2) + 2*x + 1 */
  12. #define FUN(x) pow(3,(x))+(x)-2
  13.  
  14. /*
  15.  * Rappresenta la funzione di cui bisogna trovare gli zeri.
  16.  */
  17. inline double f(double x) {
  18.         return FUN(x);
  19. }
  20.  
  21. /*
  22.  * Ritorna il valore medio tra a e b.
  23.  */
  24. inline double M(double a, double b) {
  25.         return (a+b)/2;
  26. }
  27.  
  28. /*
  29.  * Ritorna il segno del valore di 'a'.
  30.  */
  31. inline char sign(double a) {
  32.         return (a >= 0) ? '+' : '-';
  33. }
  34.  
  35. /*
  36.  * Ritorna la precisione tra i valori a e b.
  37.  */
  38. int getPrecisionOf(double a, double b) {
  39.         double diff;
  40.         int prec;
  41.  
  42.         prec = 0;
  43.         diff = fabs(a-b) * 10;
  44.         while (floor(diff) == 0) {
  45.                 prec++;
  46.                 diff *= 10;
  47.         }
  48.  
  49.         return prec;
  50. }
  51.  
  52. int main(int argc, char **argv) {
  53.         double a, b, m;
  54.  
  55.         printf("----------------------------------------------------\n");
  56.         printf("| %-7s | %-7s | %4s | %4s | %-7s | %4s |\n",
  57.                    "   a", "   b", "f(a)", "f(b)", "   m", "f(m)");
  58.  
  59.         a = 0; b = 1;
  60.         while (getPrecisionOf(a, b) <= 5) {
  61.                 double fa, fb, fm;
  62.  
  63.                 printf("----------------------------------------------------\n");
  64.  
  65.                 fa = f(a);   /* calcolo f(a) */
  66.                 fb = f(b);   /* calcolo f(b) */
  67.                 m = M(a, b); /* calcolo il valor medio tra a e b */
  68.                 fm = f(m);   /* calcolo f(m) */
  69.  
  70.                 printf("| %.5lf | %.5lf |   %c  |   %c  | %.5lf |   %c  |\n",
  71.                                 a, b, sign(fa), sign(fb), m, sign(fm));
  72.  
  73.                 if (sign(fa) == sign(f(m)))
  74.                         a = m;
  75.                 else
  76.                         b = m;
  77.         }
  78.         printf("----------------------------------------------------\n");
  79.         printf("x = %lf\n", m);
  80.  
  81.         return 0;
  82. }