Torna alla pagina di Analisi Numerica
:: Matlab - Metodo di Newton ::
% Metodo di Newton
% ----------------
% restituisce la soluzione calcolata x ed il numero
% di iterazioni effettuate it
% richiede come parametri di ingresso la funzione, la sua
% derivata prima, il dato iniziale x0, l'errore tollerato
% epsilon ed il numero massimo di iterazioni consentite
function [x,it]=newton(f,f1,x0,epsilon,nmax);
% assegno il dato iniziale a x(1)
x(1) = x0;
% inizializzo le variabili it per il conteggio delle iterazioni
% e test per effettuare il test di arresto
it = 1; test = epsilon + 1;
% assegno alle variabili fx e dfx rispettivamente la funzione
% e la sua derivata (che ho passato come parametri)
fx = f(x); dfx = f1(x);
% entro nel ciclo in cui avviene il calcolo delle soluzioni
% esco dal ciclo solo quando la differenza tra due iterate
% successive è minore della tolleranza epsilon (1), o quando
% oltrepasso il massimo numero di iterazioni consentite (2)
% (1) (2)
% -------------- ----------
while test > epsilon & it <= nmax
% incremento di 1 il numero di iterazioni
it = it + 1;
% calcolo il rapporto tra la funzione e la sua derivata
rapporto = - (fx / dfx);
% calcolo la x_i con il metodo di Newton
x(it) = x(it-1) + rapporto;
% assegno il valore assoluto della variabile rapporto
% alla variabile test che uso per controllare se ho
% superato o no il test di arresto del metodo
test = abs(rapporto);
% assegno alla fx la nuova funzione...
fx = f(x(it));
% ...e faccio la stessa cosa con la dfx
dfx = f1(x(it));
end
% esempio di utilizzo:
%
% % definisco la x0
% x0 = 3.5;
% % definisco l'errore epsilon tollerato
% epsilon = 1e-4;
% % definisco il numero massimo di iterazioni
% nmax = 100;
% % utilizzo il comando fcnchk così da definire una variabile effe
% % da trattare come funzione a tutti gli effetti
% effe = fcnchk('x.^2-6');
% % e assegno con lo stesso metodo la sua derivata
% effe1 = fcnchk('2*x');
% % invoco la funzione newton per calcolare la soluzione
% % notare che mi viene restituito anche il numero it di iterazioni
% [x,it] = newton(effe,effe1,x0,epsilon,nmax);
% % calcolo la soluzione reale così da poter calcolare l'errore esatto
% x_reale = sqrt(6);
% % trovo l'errore. NOTA: x(it-1) permette di trovare l'errore di x(it)
% errore = abs(x(1:it-1) - x_reale);
% % trovo l'errore stimato
% errore_st = abs(x(2:it) - x(1:it-1));
% mostriamo come cambiano le soluzioni all'aumentare del numero
% % di iterazioni. Notiamo che migliorano sempre
% for i=1:it-1
% fprintf('it=%2d x=%16.13f stima=%12.6e vero=%12.6e \n',...
% i,x(i),errore_stima(i),errore_vero(i));
% end
Torna alla pagina di Analisi Numerica