/* File: ricerca0varianteNewton.c */
/* Legge da tastiera due valori reali, a e b, tale che ya = f(a) abbia segno
   diverso da yb=f(b), e stampa uno zero della funzione y = f(x) (cioe' un
   valore ris tale che yris = f(ris) = 0).  Adotta i metodo di Newton.  Divide
   l'intervallo secondo lo zero della retta che passa tra (a,f(a) e (b,f(b)):
   m = a + (f(a)*(a-b))/(f(b)-f(a)) */

#include <stdio.h>
#include <math.h>

#define EPSILON 0.000000001

double funzione(double x) {
  return 2*x*x*x - 4*x + 1;
}


int main(void) {

  double a;
  double b;
  double m;
  int i = 0;
  printf("Inserire estremi intervallo dove cercare lo 0\n");
  printf("Inserire primo estremo: ");
  scanf("%lg", &a);
  printf("Inserire secondo estremo: ");
  scanf("%lg", &b);

  if (funzione(a)*funzione(b) >= 0) {
    printf("Intervallo non valido!\n");
    return 0;
  }
    
  m = a + (funzione(a)*(a-b))/(funzione(b)-funzione(a));

  while (fabs(funzione(m)) > EPSILON) {
    if (funzione(a)*funzione(m) < 0) 
      b = m;
    else 
      a = m;
    m = a + (funzione(a)*(a-b))/(funzione(a)-funzione(b));
    i++;
  }
  printf("Zero della funzione e' x = %.9g\n", m);
  printf("In x = %.9g, y = %g\n", m, funzione(m));
  printf("Numero iterazioni: %d\n", i);

  return 0;
}

