[Matlab] Aitken

Messaggioda Xemitron » 20/10/2021, 10:50

Salve, avrei implementato il metodo di accelerazione di aitken con il seguente codice:

Codice:
function[x,i] = aitken(x0,f,df,tol,max)
   
    f0=feval(f,x0);
    d=feval(df,x0);
    x1=x0-(f0/d);
    f1=feval(f,x1);   
    d=feval(df,x1);
    x2=x1-(f1/d);
   
    for i=1:max
        x0=(x1*x1-x0*x2)/(2*x1-x2-x0);
        if abs(x0-x2)<=tol*(1+abs(x2))
            break
        end
        f0=feval(f,x0);
        d=feval(df,x0);
        x1=x0-(f0/d);
        f1=feval(f,x1);   
        d=feval(df,x1);
        x2=x1-(f1/d);
    end
    x=x2;


Nell'eseguirla sulla funzione \((x-1)^2 e^{x-1}\) con criterio d'arresto \( |x_{i+1} − x_i | ≤ tol · (1 + |x_i|)\) e con tolleranze 1e-3, 1e-6, 1e-9 ottengo rispettivamente come numero di iterazioni richieste 4,5,5. Tuttavia con una tolleranza 1e-12 non ottengo nessun risultato, fermandosi al limite massimo di iterazioni. Qualcuno potrebbe aiutarmi a capire il perché? Grazie delle eventuali risposte.
Xemitron
Starting Member
Starting Member
 
Messaggio: 14 di 30
Iscritto il: 15/01/2018, 16:20

Re: [Matlab] Aitken

Messaggioda Quinzio » 20/10/2021, 20:13

Oltre a fare il copia-incolla del codice Matlab, vuoi essere cosi' gentile da spiegarci qual e' la sequenza che vorresti trattare, cosa cosa sono "f" e "df" che si vedono nel codice, fare un esempio numerico in modo che rispondere sia un po' piu' facile ? Grazie
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 4649 di 10588
Iscritto il: 24/08/2010, 06:50

Re: [Matlab] Aitken

Messaggioda feddy » 20/10/2021, 20:22

@Quinzio

Codice:
f
è la funzione di cui vuoi trovare lo zero, mentre
Codice:
df
la sua derivata.

@Xemitron Non ho tempo per fare debugging ora, ma sono certo che potrai trovare in rete dei file MatLab che implementano Aitken
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2870 di 5941
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: [Matlab] Aitken

Messaggioda Xemitron » 20/10/2021, 22:32

Quinzio ha scritto:Oltre a fare il copia-incolla del codice Matlab, vuoi essere cosi' gentile da spiegarci qual e' la sequenza che vorresti trattare, cosa cosa sono "f" e "df" che si vedono nel codice, fare un esempio numerico in modo che rispondere sia un po' piu' facile ? Grazie


Allora si, come detto già da feddy f e df sono rispettivamente funzione e derivata della funzione, x0 il punto iniziale, tol è la tolleranza da utilizzare e max il numero massimo di iterazioni, e la funzione implementa il metodo di accelerazione di aitken. L'ho testato sulla funzione che ho scritto nel primo post in questo modo:

Codice:
f =

     Inline function:
     f(x) = ((x-1)^3)*exp(x-1)

>> df=fcnchk('exp(x-1)*(3*((x-1)^2)+(x-1)^3)')

df =

     Inline function:
     df(x) = exp(x-1)*(3*((x-1)^2)+(x-1)^3)

>> [x,i]=aitken(0,f,df,1e-3,100)

x =

     1.0000


i =

     4

>> [x,i]=aitken(0,f,df,1e-6,100)

x =

     1


i =

     5

>> [x,i]=aitken(0,f,df,1e-9,100)

x =

    1


i =

     5

>> [x,i]=aitken(0,f,df,1e-12,100)

x =

   NaN


i =

   100


Ecco, con i primi tre valori di tolleranza mi torna ma con l'ultimo no.

feddy ha scritto:@Quinzio

Codice:
f
è la funzione di cui vuoi trovare lo zero, mentre
Codice:
df
la sua derivata.

@Xemitron Non ho tempo per fare debugging ora, ma sono certo che potrai trovare in rete dei file MatLab che implementano Aitken


Ho provato ad usare versione trovate in rete ma il risultato è lo stesso. C'è un errore nel criterio d'arresto, dal momento che è l'unica cosa che cambia?
Xemitron
Starting Member
Starting Member
 
Messaggio: 15 di 30
Iscritto il: 15/01/2018, 16:20

Re: [Matlab] Aitken

Messaggioda feddy » 20/10/2021, 22:59

Quel NaN è il risultato di una division per $0$, che proviene dalla valutazione dello jacobiano in un punto in cui la funzione è piatta. Se guardi il grafico della funzione, ti rendi conto che vicino a $x=1$, cioè il tuo zero, la funzione è piatta. In pratica, lì si annulla anche lo jacobiano. Alla 5 iterazione, hai già che $x_0=1$ (esattamente), mentre
Codice:
d
è $0$. Il tuo zero l'hai trovato, eccome, ma quando poi il programma arriva alla riga successiva alla valutazione dello jacobiano, cioè alla riga
Codice:
x1=x0-(f0/d);
, **divide per 0**, da cui il primo NaN. Il resto ovviamente è da buttare.

Quindi, in sostanza, non hai prestato attenzione all'eventualità che avvenga una divisione per $0$.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2871 di 5941
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: [Matlab] Aitken

Messaggioda feddy » 20/10/2021, 23:01

Ho notato che ho scritto jacobiano, avevo in mente il caso di un sistema di equazioni. In questo caso intendo la classica derivata ovviamente.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2872 di 5941
Iscritto il: 26/06/2016, 00:25
Località: SISSA


Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite