Esimerkiksi funktion integrointi suorakaidesäännöllä voitaisiin hoitaa seuraavasti:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double integroi(double x1, double x2, int tiheys)
{
double x,dx,summa=0;
dx = (x2- x1)/tiheys;
for (x=x1+dx/2 ; x<x2; x+=dx)
summa += sin(x)*dx;
return summa;
}
int main(void)
{
printf("Integraali sin(x) väliltä [0,pi] on noin %7.5lf\n",
integroi(0,M_PI,100));
return 0;
}
Entäpä mikäli haluaisimme integroida vaikka ex. No
vaihdetaan sin(x) tilalle exp(x)! Entäpä jos
tarvitsemme samassa ohjelmassa sekä sin(x) että
exp(x) integraalit? Kirjoitammeko integroi_sin ja
integroi_exp. Ei kuulosta järkevältä!Otamme käyttöön funktio- osoittimet. Määritellään aluksi funktio_tyyppi
typedef double (*funktio_tyyppi)(double x);Sitten voimme esitellä tarpeellisen määrän vastaavaa tyyppiä olevia funktiota. Itse integrointi muutetaan käyttämään yhtä "ylimääräistä" parametria; funktiota jota integroidaan:
double oma_funktio(double x)
{
return 2*x- 5;
}
double integroi(funktio_tyyppi f,double x1, double x2, int tiheys)
{
double x,dx,summa=0;
dx = (x2- x1)/tiheys;
for (x=x1+dx/2 ; x<x2; x+=dx)
summa += f(x)*dx;
return summa;
}
Nyt voimme kutsua esimerkiksi:
double ifx; ... ifx = integroi(oma_funktio,0,5,100); ... ifx = integroi(sin,0,M_PI,1000); ... ifx = integroi(exp,0,1,500); ...Huomautus! Hienot adaptiiviset integrointimenetelmät muuttavat itse välin tiheyttä funktion käyttäytymisen mukaan.