Errore codice newton Raphson

di il
3 risposte

Errore codice newton Raphson

Salve a tutti, sto implementando il metodo di Netwon Raphson su matlab e mi da un errore che non ne comprendo la natura, il mio codice è questo
scarti0=1.0e5;
x(1)=x0;
fxk=feval(fname,x0);
f1xk=feval(f1name,x0);
k=0;
scarto=2*toll;
while (scarto>=toll && k<maxi)

k=k+1;
x(k+1)=x(k)-fxk/f1xk;
scarti(k)=abs(fxk/f1xk);
rapp(k)=scarti(k)/scarti0^2;
fxk=feval(fname,x(k+1));
f1xk=feval(f1name,x(k+1));
scarto=abs(x(k+1)-x(k));
if abs(f1xk)<toll*abs(fxk);
error('Laderivataf''(x(%d))e''nulla',k);
end
scarti0=scarti(k);
end

xs=x(k+1);
f1xk=feval(f1name,xs);
f2xk=feval(f2name,xs);
M=0.5*abs(f2xk/f1xk);
L'errore è Error in ==> newton at 3
fxk=feval(fname,x0);

3 Risposte

  • Re: Errore codice newton Raphson

    Il messaggio di errore dovrebbe essere più esplicito, hai riportato tutto il testo del messaggio di errore?

    La funzione "feval" riceve in input, come primo parametro, l'handle di una funzione o il nome di una funzione, definito come stringa.

    Dalla porzione di codice che hai pubblicato, non si capisce se fname è l'handle od il nome di una funzione.

    Prova a verificare la definizione di "fname" oppure, nel caso tu non abbia pubblicato tutto il messaggio di errore, pubblicalo tutto, da esso si potrebbe / dovrebbe capire come correggere l'errore.

    Tipici messaggi di errore legati all'uso improprio di feval possono essere:
    >> y=feval('sin','stringa')
    Error using feval
    Undefined function 'sin' for input arguments of type 'char'.
    
    
    >> y=feval('si',[0:.1:2*pi])
    Error using feval
    Undefined function 'si' for input arguments of type 'double'.
    
    >> y=feval(fname,'stringa')
    Undefined function or variable 'fname'.
    
    Hope this helps.
  • Re: Errore codice newton Raphson

    ??? Undefined function or variable 'fname'.

    Error in ==> newton at 3
    fxk=feval(fname,x0);


    Questo è l'errore completo, purtroppo sono novello di matlab ed ho solo basi di java, infatti, mi trovo un pò confuso sulla sintassi che sto apprendendo; mi serve tale funzione per richiamarla poi in un altro metodo.

    Perdona l'ignoranza, mi spiegheresti cos'è l'handle?
  • Re: Errore codice newton Raphson

    Il messaggio di errore "dice" che "fname" non è nè una variabile nè una funzione; in pratica, "non esiste".

    L'errore consiste dunque nel passare ad una funzione (feval) come parametro una variabile "non definita".

    Come detto nella risposta precedente, la funzione feval richiede come primo parametro o l'handle di una funzione od una stringa contenente il nome di una funzione.

    La funzione "feval" semplicemente esegue la funzione che le viene passata come primo parametro passando a questa gli altri parametri.

    Tralasciamo per un momento gli handles; un modo corretto per utilizzare la funzione "feval" passandogli come primo argomento una stringa è, per esempio:
    
    a=0:0.1:2*pi;
    y=sin(a);
    
    Queste due linee di codice sono equivalenti alle seguenti:
    
    a=0:0.1:2*pi;
    y=feval('sin',a);
    
    in entrambi i casi viene invocata la funzione "sin" (seno) e ad essa viene fornito in input il vettore "a" che contiene una serie di valori (angoli in radianti).

    Nel primo caso la funzione "sin" viene invocata direttamente (come si fa "normalmente" con le funzioni), nel secondo caso è la funzione "feval" che si prende carico di invocare la funzione "sin" e di fornirgli in input il vettore "a".

    Nel tuo caso, "fname", essendo il primo parametro fornito alla funzione "feval" deve essere una stringa (abbiamo, per il momento, tralasciato gli handles) contenente il nome di una funzione.
    In questo senso, il secondo dei due esempi precedenti poteva essere scritto così:
    
    a=0:0.1:2*pi;
    fname='sin';
    y=feval(fname,a);
    
    Per quanto riguarda gli handle, la spiegazione migliore la puoi trovare qui:

    http://it.mathworks.com/help/matlab/ref/function_handle.html
    http://it.mathworks.com/help/matlab/matlab_prog/overview-1.html
    http://it.mathworks.com/help/matlab/matlab_prog/applications-of-function-handles.html

    L'esempio precedente può essere quindi riscritto, utilizzando l'handle della funzione "sin" così:
    
    a=0:0.1:2*pi;
    fname=@sin;
    y=feval(fname,a);
    
    "fname" non è più, in questo caso, una stringa, ma, appunto l'handle della funzione "sin".

    Quello che devi fare, per eliminare l'errore nel tuo script, è verificare "fname" e scoprire perchè non risulta definito.

    Da "qualche parte" nel tuo codice deve esserci una di queste due istruzioni:

    fname='nome_di_una_funzione'
    fname=@nome_di_una_funzione

    dove "nome_di_una_funzione" può essere, una funzione di MatLab (come la funzione "sin" degli esempi) od una funzione che hai scritto tu, in un file ".m".

    Nel caso il codice che hai pubblicato sia a sua volta parte di una funzione ci sono almeno tre possibilità:

    la variabile "fname" deve essere passata a questa funzione come parametro a questa funzione
    la variabile "fname" deve essere dichiarata come variabile "globale"
    la variabile "fname" deve essere inizializzata all'interno della funzione prima che venga passata come parametro alla funzione "feval".

    In tutti e tre i casi, "fname" deve essere o l'handle di una funzione od una stringa contenente il nome di una funzione.

    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
3 risposte