Metodo di Newton con Matlab
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....
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?
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
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):
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)
Seguendo il tuo consiglio ho modificato la funzione così:
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()
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()
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
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.
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.
Sposto nella sezione giusta.
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
PS:Non riesco a mettere i pedici alle formule

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.
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.