Calcolo dell’arcoseno col metodo dicotomico INVSIN Calcolo dell’arcoseno col metodo dicotomico
Esercitazione 6, esercizio 7 Si realizzi un algoritmo in grado di tabulare il valore della funzione arcsin(x) per x compreso nell'intervallo [a,b] con passo c. I valori di a, b, c siano forniti in input da tastiera. Non si utilizzi a tale scopo la funzione arcsin() di libreria, ma si realizzi una funzione invsin(z1,z2,k,e) in grado di calcolarla col metodo di bisezione.
Studio del problema in matematica. Definizione: z = sin() = arcsin(z)
La funzione seno:
Per l’adozione del metodo dicotomico: Devo considerare un intervallo in cui la funzione è monotona: Nell’intervallo -/2 + /2 la funzione seno è monotona crescente valori assunti: -1 +1
Applicazione metodo dicotomico Fissato un k, devo trovare un : Pongo z1 = -/2, z2 = +/2 Calcolo il valore media=(z1+z2)/2 Se sin(media) = k, media e’ il risultato cercato, altrimenti Se sin(media) è > k, sposto z2 a media, altrimenti sposto z1 a media.
Problemi di terminazione Poiché sin(media) = k potrebbe non verificarsi mai (lavoro con reali), posso porre: |sin(media) – k| < epsilon Svantaggi: applico la precisione alla funzione inversa, e potrei essere in una zona quasi piatta.
Problemi di terminazione (2) In alternativa, potrei verificare se z1 e z2 sono troppo vicini, ad esempio: z2 – z1 < 2 * epsilon Altro metodo ancora: contare le iterazioni, se si supera una prefissata soglia si prende per buono l’ultimo valore. Nota: spesso nel metodo dicotomico si usano tutti e tre i criteri, per avere un algoritmo robusto.
Funzione invsin() Double invsin(double a, double b, double k, double precisione) { float media; int finito; finito = FALSE; while(!finito) media = (a+b)/2; if(fabs(sin(media)-k) > precisione) finito = TRUE; else if(sin(media) > k) b = media; a = media; } return(media);
ATTENZIONE Visto che chiede la precisione dalla tastiera, se fossero stati usati i float, l'utente avrebbe dovuto essere avvertito che la precisione deve essere data al massimo su 7 cifre (il famoso epsilon della macchina), altrimenti il programma potrebbe andare in loop.
ATTENZIONE(1) Per quanto riguarda pigreco, il C definisce in math.h le costanti M_PI, M_PI_2 e M_PI_4 rispettivamente per pi greco, pi greco mezzi, pi greco quarti (ATTENZIONE: non e' compatibile con ISO C90, occorre andare in: Setting Compile e togliere lo spunto in terza posizione, corrispondente a -ansi).