Metodo di Newton con Matlab

One2
Devo creare una funzione che dati in ingresso (in ordine):funzione,derivata della funzione,punto iniziale,tolleranza 'e numero massimodi iterazioni;mi trovi le eventuali radici utilizzando il metodo di Newton.
In rete ho trovato in buon esempio e,capito come funzionava,ho provato a lanciarlo sul mio PC....
function [zero, fz, iter, xk, fk]= Newton(f,fd,x0,toll,niter);
g = inline(f);
gd=inline(fd);
iter=1; %passo iniziale
xk(iter)=x0; %fai esplicitamente la prima iterazione
y=feval(g,x0);
dy=feval(gd,x0);
fk(iter)=feval(g, x0); %g valutata in x0
for iter=2:niter
xk(iter)= xk(iter-1) - y/dy;
fk(iter)=feval(g,xk(iter));
if abs(xk(iter)-xk(iter-1)) < toll %test di arresto
break
end
y=feval(g,xk(iter)); %preparazione al passo successivo
dy=feval(gd,xk(iter));
end
zero=xk(iter);
fz=feval(g,zero); %valore della f in zero
display(zero)
display(fz)
display(xk)

per passare le funzioni $f$ e $fd$ funzione ho adoperato inline e questo mi provoca l'errore [b]imput must be a string ,qualche idea su come possa risolverlo?

Risposte
Lory314
Evidentemente non devi passare le funzioni come inline ma come stringhe. Infatti, se noti, le prime righe del codice servono proprio a convertire le stringhe che rappresentano la funzione e la sua derivata in funzioni inline. Passare direttamente funzioni inline provoca questo errore.

Supponiamo che vuoi cercare gli zeri di $-x^2+5x+2$. Un codice funzionante dovrebbe essere (non l'ho testato):

clear all, close all
f = '-x^2+5*x+2';
fd = '-2*x+5';
x0 = 0;
toll = 1e-6;
niter = 100;
[zero, fz, iter, xk, fk]= Newton(f,fd,x0,toll,niter)

One2
Seguendo il tuo consiglio ho modificato la funzione così:
function [zero, fz, iter, xk, fk]= Newton(f,fd,x0,toll,niter);
iter=1; %passo iniziale
xk(iter)=x0; %fai esplicitamente la prima iterazione
y=feval(f,x0);
dy=feval(fd,x0);
fk(iter)=feval(f, x0); %g valutata in x0
for iter=2:niter
xk(iter)= xk(iter-1) - y/dy;
fk(iter)=feval(f,xk(iter));
if abs(xk(iter)-xk(iter-1)) < toll %test di arresto
break
end
y=feval(f,xk(iter)); %preparazione al passo successivo
dy=feval(fd,xk(iter));
end
zero=xk(iter);
fz=feval(f,zero); %valore della f in zero
display(zero)
display(fz)
display(xk)

Ora però mi da il seguente errore Invalid function name '-x^2+5*x+2'. e y=feval(f,x0);
Quindi secondo me non si rende conto che $f$ e $fd$ sono funzioni.Inoltre non so perchè mi da errore sulla funzione feval()

Lory314
Probabilmente non mi sono spiegato bene. La function che hai riportato nel primo post è corretta. Quello che tu sbagliavi era come utilizzarla: quella function vuole come input una funzione e la sua derivata come stringhe, cioè scritte tra apici (' '), e ci pensa lei a trasformarle in inline function con le due istruzioni
g = inline(f);
gd=inline(fd);
.
Se togli queste due istruzioni e gli passi la funzione e la sua derivata come stringhe è normale che feval non funzioni in quanto non vuole come input una stringa, ma, se non ricordo male, vuole una inline function.
Anche la seconda function che hai postato è corretta, però in questo caso devi passare la funzione e la sua derivata come inline, dato che hai tolto le due istruzioni che ti hi scritto sopra.
Riassumendo, hai due possibilità
- Lasciare la funzione così come l'hai trovata e quando la usi nel main passare la funzioni e la sua derivata come stringhe
- Utilizzare la funzione che hai modificata passando la funzione e la sua derivata come inline function

Spero di essere stato chiaro ora e che sia giusto quanto ti dico perchè non sto testando i codici.

Raptorista1
Sposto nella sezione giusta.

One2
Ho un po di problemi con il test di arresto di tale metodo (metodo che ho utilizzato con successo come test di arresto del metodo della "regula falsi").Il test utilizzato da me è il seguente $|x(n+1) − x(n) | < epsilon $ e $f(xn) Vorrei sapere se le condizioni di arresto vanno bene e se sono valide per entrambi i metodi.


PS:Non riesco a mettere i pedici alle formule :?

Raptorista1
Per mettere i pedici usa l'underscore _

Le condizioni vanno bene, a parte mettere il modulo anche su \(f(x_n)\).
Ogni condizione è comunque più indicata in alcuni casi piuttosto che in altri.

Ti consiglio di aggiungere anche un controllo sul numero di iterazioni.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.