Informatica 5 Liceo Scientifico Scienze Applicate/Area

Indice del libro

Calcolo di un integrale finito

modifica

Per calcolare l'integrale finito di una funzione ad esempio   utilizzando Octave procediamo nel seguente modo

1) creiamo un file che si chiama funzdaintegrare.m e scriviamo il seguente codice

function [y]= funzdaintegrare(x)
y=5.*sin(x)+3;


questo codice definisce una funzione che si chiama funzdaintegrare che riceve un valore in ingresso (rappresentato dal parametro x) e che restituisce un valore ( rappresentato da y), internamente alla funzione si usa il parametro x per calcolare il valore assunto dall'espressione che vogliamo integrare 5sin(x)+3 che viene assegnato alla variabile y


2) creiamo un secondo file in octave con un nome qualsiasi ad esempio integrazionemediantetrapezi.m (ricordatevi di non usare spazi nel nome del file) e scriviamo il seguente codice


a=0;
b=2;
tolleranza=0.001;
area=0;
n=1;
do
areaold=area; 
n=n*2;
delta=(b-a)/n;
area=0;
 for i=0:n-1
   area=area+delta*(funzdaintegrare(a+i*delta)+funzdaintegrare(a+(i+1)*delta))/2;
 end
until(tolleranza>abs(area-areaold))
printf("l'area vale %f \n", area);
printf("n= %i \n",n);
%verifica tramite funzione di integrazione di octave
% v=valorearea, ier diverso da 0 indica errori nella procedura di calcolo
% nfun e' il numero di suddivisioni usate  (l'algoritmo e' di simpson?)
% err e' la precisione del calcolo

printf("tramite le funzioni di octave otteniamo invece\n");

[v, ier, nfun, err]=quad("funzdaintegrare", a, b, [tolleranza,0])

Nelle prime righe assegno ad a e b i valori numerici che esprimono gli estremi di integrazione dell'integrale finito e la precisione (tolleranza) che si vuole ottenere

indichiamo con n il numero di suddivisioni dell'intervallo ab ( inizialmente 2 parti poi 4 parti poi 8 ,16 e cosi' via fino a ottenere la tolleranza fissata) . Ci sono due variabili che indicano l'area dell'integrale indicate con areaold e area, in areaold c'e' il valore dell'area calcolata nel precedente ciclo i (con n= 2^i) e invece in area quella calcolata nel ciclo attuale i+1 (con n= 2^(i+1), (alla partenza si assegna 0 alla variabile areaold, i cicli di cui si parla sono quelli della struttura ripetitiva do-until)

con un ciclo for calcoliamo la somma di tutti i trapezi in cui e' stata divisa l'area sottesa alla funzione da integrare, per calcolare le basi di ciascun trapezio si deve calcolare il valore che la funzione assume in 2 punti che

  • nel primo trapezio sono i punti a e  
  • nel secondo trapezio sono i punti   e  
  • ... ne
  • nel trapezio k sono i punti   e  

per calcolare il valore della funzione si richiama la funzione funzdaintegrare passando il valore del punto ( che viene associato nella variabile x ) e ottenendo il corrispondente valore y


il ciclo del do-while che serve per trovare il valore di n adatto a garantire la tolleranza richiesta si ferma quando tolleranza>abs(area-areaold)


l'istruzione printf("messaggio",var1,var2 ... varn) serve per visualizzare la scritta fra " ", alcuni simboli del messaggio come %i %f vengono sostituiti con i valori del elenco di variabili scritto dopo rispettandone l'ordine,

  • se scrivo %i mi aspetto che la corrispondente variabile sia intera
  • se scrivo %f mi aspetto che la corrispondente variabile sia un numero floatpoint cioe' un numero con la virgola (reale)

altri simboli inseriti nel messaggio come \n hanno significati particolari, /n significa vai a capo (spostati nella riga successiva)


per controllare che il tutto funzioni usiamo il comando quad (che sta per quadratura ) per il calcolo dell'integrale definito (per capire come funziona ricercate il comando quad nel help di octave, basta scrivere nella console comandi help quad )