vuoi
o PayPal
tutte le volte che vuoi
%funzione obiettivo che mi serve per graficare le linee di livello
function [phi]=f_ob (X,Y)
phi=X.^2+Y.^2;
%generica funzione obiettivo su cui opero il metodo di Newton
function[phi]=funzione(x)
phi=x(1)^2+x(2)^2;
%gradiente della generica funzione obiettivo su cui opero
function [g] = grad_f(x)
g(1)=2*x(1);
g(2)=2*x(2);
%hessiana della generica funzione obiettivo su cui opero
function[A]=hessiana(x)
A(1,1)=2;
A(1,2)=0;
A(2,1)=0;
a(2,2)=2;
%metodo di Newton con ricerca unidirezionale esatta di Newton
clear;
%criteri di himmelblau inizializzati
a=1;
b=1;
c=1;
%dati di imput e di arresto
it=1;
epsilon1=10^-8;
epsilon2=10^-8;
epsilon3=10^-8;
epsilon=10^-8;
X0=[5 6]'; %scrivo il dato iniziale come un vettore colonna,cioè lo
traspongo
x=X0;
k=0; %è il contatore iniziale
Xit=x'; %è una matrice (x,y)in cui ho le x sulla prima colonna e le y
sulla seconda
while(a>epsilon1 && b>epsilon2 && c>epsilon3) %condizione di arresto del
ciclo
k=k+1; %aggiorno il contatore
B=hessiana(x);
gradF=grad_f(x)'; %scrivo il gradiente relativo al punto iniziale
come un vettore colonna
if(det(B)~=0) %condizione affinchè esista l'inversa di una matrice
C=inv(B);
dn=-C*gradF; %definizione della direzione di Newton,ottengo un
vettore colonna
if(gradF'*dn<0) %condizione affinchè una direzione sia di discesa
d=dn/norm(dn); %accetto la direzione di Newton come mia direzione di
ricerca
end
end
if(det(B)==0 && gradF'*dn>0)
d=-gradF/norm(gradF); %accetto come direzione di ricerca quella
dell'antigradiente,sempre vettore colonna
end