cerca
Matlab - Metodo di Newton
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Matlab - Metodo di Newton

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