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:
Programmi
Posta un commento