/* Questo programma svolge (mediante apposite funzioni) diverse "operazioni" utili sulle funzioni: 1. costruisce il grafico della funzione in un certo intervallo e lo stampa su file; 2. calcola numericamente la derivata della funzione in un punto; 3. calcola numericamente l'integrale definito della funzione in un intervallo. La funzione scelta in questo caso e' la radice quadrata. Cambiarla comporta, essenzialmente, modificare il solo contenuto della funzione Function. Il punto "tecnico" nuovo sono i puntatori a funzione */ #include #include #include #define MAX_DELTA 10000000 double Function(double); /* Notare il primo argomento nelle funzioni qui sotto: e' un puntatore ad una funzione -- per ora senza nome -- che restituisce un double ed ha un argomento che e' un double */ void PlotGraph(double (*)(double),double,double,int); double Derivative(double (*)(double),double,double); double Integral(double (*)(double),double,double,int); main(){ double xmin,xmax; int NPoints,NDelta; double epsilon=1.; double x,der,DerAnalitic,integral,IntAnalitic; double (* Ff)(); Ff=&Function; printf("Ff=%p Function=%p\n\n",Ff, Function); printf("Inserire l'estremo inferiore dell'intervallo in cui si vuol disegnare la funzione\n"); scanf("%lf",&xmin); printf("Inserire l'estremo superiore dell'intervallo in cui si vuol disegnare la funzione\n"); scanf("%lf",&xmax); do{ printf("Inserire il numero di punti (>0) nell'intevallo in cui si vuol disegnare la funzione\n"); scanf("%d",&NPoints); }while(NPoints<=0); PlotGraph(Function,xmin,xmax,NPoints); /* la "funzione" viene passata con il primo argomento nella chiamata, passando in realta'il puntatore alla prima locazione di memoria che essa occupa */ printf("Inserire il valore del punto in cui calcolare la derivata \n"); do{ scanf("%lf",&x); if(x==0.)printf("La derivata e' singolare nel punto scelto, ripetere la scelta\n"); }while(x==0.); DerAnalitic=0.5/sqrt(x); printf("epsilon Der. num. risultato esatto per x=%f.\n\n",x); while (epsilon>1.e-18) { der=Derivative(Function,x,epsilon); /* la "funzione" viene passata con il primo argomento nella chiamata, passando in realta'il puntatore alla prima locazione di memoria che essa occupa */ printf("%e %f %f \n",epsilon,der,DerAnalitic); epsilon/=10.; } printf("\n\n ######################################################### \n\n"); printf("Inserire l'estremo inferiore dell'integrale\n"); scanf("%lf",&xmin); printf("Inserire l'estremo superiore dell'integrale\n"); scanf("%lf",&xmax); printf("Inserire il numero di intervalli di partenza \n"); scanf("%d",&NDelta); IntAnalitic=2./3.*(pow(xmax,1.5)-pow(xmin,1.5)); printf("NDelta Int. num. risultato esatto \n\n"); while(NDelta