Buongiorno, ho un problema con uno script di Matlab che svolge il Metodo di Newton-Raphson "normale" e "modificato", in pratica quando clicco su esegui il programma mi disegna la funzione che ho scritto, ma poi non mi esegue ciò che sta dopo il comando del grafico. Chiedo se qualcuno è in grado di darmi una mano a risolvere questo problema, metto il file per eventuali chiarimenti.
%---Definizione della funzione e la sua derivata prima---
f=@(x) sin(x)-x+((x.^-4)/24);
df=@(x) (-1/(6*x.^5)+cos(x)-1);
%---Disegna la funzione f(x) e l'asse x nella stessa figura---
a=-1;b=1;
figure(1)
ezplot(f,[a b]);hold on; plot([a b],[0 0],'k-');hold off;
%---Assegnazione parametri metodo Newton-Raphson e Newton-Raphson Modificato---
itmax=100;
x0=1;
tol=10^-6;
r=1;
maxiter=100;
%----------------------------------------------------------------
% NEWTON: calcola una radice della funzione f definita
% usando il metodo iterativo di Newton-Raphson
% Test di arresto sullo scarto (dif)
%----------------------------------------------------------------
% [x,iter,scarti]=newton(f,df,x0,tol,itmax)
%----------------------------------------------------------------
% parametri di input:
% f: funzione della quale si cerca una radice
% d: derivata prima di f
% x0 = approssimazione iniziale
% toll: tolleranza
% itmax: numero massimo di iterazioni
% parametri di output:
% x: vettore delle approssimazione della radice
% iter: numero di iterazioni effettuate
% scarti: vettore degli scarti successivi
%----------------------------------------------------------------
function[x,iter,scarti]=newton(f,df,x0,tol,itmax)
xold=x0;
x=[x0];
scarti=[];
dif=tol+1;
iter=0;
while (abs(dif) > tol) & (iter < itmax)
fx=feval(f,xold);
if fx == 0 return; end
dfx=feval(df,xold);
if dfx == 0
disp('ERRORE: derivata nulla.'); return;
end
iter=iter+1;
dif=-fx/dfx;
xnew=xold+dif;
scarti=[scarti;dif];
x=[x; xnew];
xold=xnew;
end
if (iter >=itmax)
disp('raggiunto il numero massimo di iterazioni')
end
%----------Newton-raphson modificato----------------------------------------
% newtonmod----Esegue il metodo di Newton modificato per la risoluzione di
% f(x)=0 anche in presenza di radici multiple, nota la loro
% molteplicità
%
% [x,i,tolf]=NEWTONMOLT(x0,r,f,df,tolx,nmax)
% [xmod,itermod,scartimod]= newtonmod(f,df,x0,tol,maxiter,r);
% I parametri della funzione sono:
% x0 -> il punto iniziale
% r -> molteplicità della radice cercata
% f -> funzione di cui valutare uno zero
% df -> la derivata della funzione f
% tol -> tolleranza per la radice
% maxiter -> limite superiore al numero di iterazioni
%
% I valori di ritorno sono:
% xmod -> la soluzione trovata
% itermod -> il numero di iterazioni impiegate per ottenere la soluzione
% tolf -> la tolleranza sulla funzione
function[xmod,itermod,tolf]=newtonmod(f,df,x0,tol,maxiter,r)
itermod=0;
dif=tol+1;
xmod=x0;
while(itermod<maxiter & dif>tol)
fx=feval(f,xmod);
dfx=feval(df,xmod);
tolf=tol*abs(dfx);
if abs(fx)<=tolf
break
end
x1=xmod-r*(fx/dfx);
dif=abs(x1-xmod);
xmod=x1;
itermod=itermod+1;
end