function [xv, fxv, k] = bisezione (f, a, b, toll, kmax) % BISEZIONE Metodo di Bisezione % % Uso: % [xv, fxv, n] = bisezione(f, a, b, toll, kmax) % % Dati di ingresso: % f: funzione (handle function) % a: estremo sinistro % b: estremo destro % toll: tolleranza richiesta % kmax: massimo numero di iterazioni permesso % % Dati di uscita: % xv: vettore contenente le ascisse delle iterazioni % fxv: vettore contenente la funzione valutata sugli xk % k: indice dell'iterazione finale calcolata %inizializzo i vettori xv=[]; fxv=[]; % % poni "a < b" anche in caso di errore dell'utente. % if b < a % s=b; b=a; a=s; % end fa=f(a); fb=f(b); % se a o b sono zeri della funzione, esci dopo aver % assegnato i valori alle variabili di output if fa == 0 xv=a; k=0; fxv=0; return; elseif fb == 0 xv=b; k=0; fxv=0; return; end k = 0; % Inizializza le iterazioni ampiezza = 2*toll; % Inizializza res ad un valore fittizio > toll % per poter entrare nel ciclo while iterativo % Inizializzo gli estremi dell'intervallo iniziale ak = a; bk = b; % Ciclo iterativo del metodo while (ampiezza > toll) && (k < kmax) % TEST DI ARRESTO k = k+1; xk = (ak + bk)*0.5; % calcola il punto medio dell'intervallo fxk = f(xk); % Calcola il valore f(xk) xv = [xv; xk]; % aggiunge al vettore la nuova soluzione numerica fxv = [fxv; fxk]; % aggiunge al vettore il nuovo residuo % Seleziona le azioni in base a f(a)*f(xk) if fa*fxk < 0 bk = xk; elseif fa*fxk > 0 ak = xk; fa = fxk; else % caso fxk = 0 break %esci dal while; end ampiezza = abs(bk-ak); end if k==kmax warning('WARNING: Raggiunto il numero massimo di iterazioni'); end