Programmazione C: Integrazione numerica 1b
/*
Autore: Mandrà Salvatore, Brotto Diego
(www.criptonite.org)
Data: mar 22/03/05
Nome del File: trapezio_pf.c
Commenti: Programma per il calcolo integrale
di una funzione assegnata
*/
#include < stdio.h>
#include < stdlib.h>
#include < math.h>
// Il MIN ed il MAX va valutato
// da funzione a funzione (ovviamente ...)
#define MIN -10000
#define MAX 10000
#define VERY_MAX_ITE 10000
#define MIN_INTERV 100
#define MIN_PREC 10E-12
double funz(double val);
int main() {
double inf, sup;
double risultato=0, risultato1;
double prec;
int interv=MIN_INTERV, max_ite;
int conta=1;
int i;
double passo;
printf("Programma per il calcolo integrale\n\n");
printf("Inserire gli estremi di Integrazione
separati da uno spazio\n");
scanf("%lf%*c%lf", &inf, & sup );
printf("\nInserire la Precisione Massima (in perc.)\n");
scanf("%lf", &prec);
printf("\nInserire il Numero Massimo di
Iterazioni (0: inf)\n");
scanf("%d", &max_ite);
// Riaggiustiamo un po' i valori per evitare fesserie
// Nel caso del calcolo mediante la parabola è necessario
// che il numero di intervalli sia dispari
inf=(inf < MIN)?MIN:inf;
sup=(sup > MAX)?MAX:sup;
max_ite=(max_ite < = 0)?VERY_MAX_ITE:max_ite;
prec=(prec < =0)?MIN_PREC:prec;
// Qui uso la variabile passo come variabile di scambio
if(inf > sup) { sup=passo; sup=inf; inf=passo; }
// Qui comincia il vero e proprio software
printf("\nSto Calcolando i valori della
funzione ...\n\n");
risultato+=0.5*(funz(inf)+funz(sup));
// Procediamo con il primo passo "Particolare" ...
passo=(sup-inf)/interv;
for(i=1; i < interv; i++) risultato+=funz(inf+i*passo);
risultato*=passo;
// ... ed ora con i passi "Iterati"
risultato1=risultato;
do {
risultato=risultato1;
risultato1=0;
conta+=1;
passo/=2;
for(i=0; i < interv; i++)
risultato1+=funz(inf+(2*i+1)*passo);
risultato1=risultato1*passo+risultato/2;
interv*=2;
printf(".");
}
while(fabs(risultato1-risultato)/risultato > prec &&
conta < max_ite);
printf("\n\nIl Risultato dell'integrale (Trapezio)
risulta Essere: %lf\n", risultato);
printf("Ottenuto dopo %d passaggi.\n\n", conta);
exit(0);
}
double funz(double val) {
return sqrt(val);
}
» Torna »
|