Metodi di integrazione:


//Midpoint
double midpoint (int npassi, float xmin, float xmax, double (*fun)(double)) {
  double integrale=0;
  double h=(xmax-xmin)/npassi;
  double x;
  while (x
    int i=0;
    x = xmin+(i+0.5)*h;
    i++;
    integrale += h*(*fun)(x); 
  }
  return integrale;
}


//Trapezoidi
double trapezoidi(int npassi, float xmin, float xmax, double (*fun)(double)) {
  double integrale=0;
  double intmezzo=0;
  double h=(xmax-xmin)/npassi;
  double intmax = (h*(*fun)(xmax))/2;
  double intmin = (h*(*fun)(xmin))/2;
  double x;
  int i=1; 
  while(i<=npassi-1) {  
    x = xmin+i*h;
    i++;
    intmezzo += h*(*fun)(x); 
  }
  integrale = intmezzo+intmax+intmin;
  return integrale;
}


//Simpson
double simpson(int npassi, float xmin, float xmax, double (*fun)(double)) {
  double integrale=0;
  double intmezzopari=0;
  double intmezzodispari=0;
  double h=(xmax-xmin)/npassi;
  double intmax = (h*(*fun)(xmax))/3;
  double intmin = (h*(*fun)(xmin))/3;
  double x;
  int i=1;
  int k=i/2;
  int s=k+1;  
  while(k<=npassi-1) {  
    x = xmin+k*h;
    k++;
    intmezzodispari += (4/3)*h*(*fun)(x); 
  }
   while(s<=npassi-1) {  
    x = xmin+s*h;
    s++;
    intmezzopari += (2/3)*h*(*fun)(x); 
  }
  integrale = intmezzodispari+intmezzopari+intmax+intmin;
  return integrale;
}


//Trapezoidi iterativo
double itera(float xmin, float xmax, float precision, double(*fun)(double)){
  double npassi = 1, x;
  double h = (xmax-xmin)/npassi;
  double oldint, newint; 
  double sum;
  int i;   
  do {
    oldint = newint;
    npassi *= 2;
    h /= 2;
    for(i=1; i
      x = xmin+i*h;
      sum += (*fun)(x);
    }
   
    newint = sum*h;
   }
  while(fabs((newint-oldint)/oldint) > precision);
return newint;
}


Categories: