Ci sono 10 tipi di persone: chi capisce il sistema binario e chi no!! :)
PROGRAMMAZIONE

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 »
(Ultima modifica: January 17 2008 10:01:37)
NOPROFIT