[MATLAB] Ordine di convergenza

alfiere15
Buon pomeriggio.
Sto implementando il metodo di Newton, di cui vi invio il codice.
Il professore mi ha detto di stimare, ad ogni passo del metodo, l'ordine di convergenza del metodo con la formula:
$ p = log(abs(x^(k+1) - alpha))/log(abs(x^(k) -alpha))$, con $alpha$ stima iniziale della radice.
L'ho inserita nel codice matlab ma qualsiasi funzione io metta, mi restituisce ordine di convergenza 1, mentre dovrebbe essere 2.
Dov'è l'errore?
function [z, nit] = newton (f, g, x, eps, nmax)
nit = 0;
t = eps+1;
while (abs(t)>eps && nit<nmax)
    d = g(x);
    if d == 0
        disp ('error derivata');
    end
    t = - f(x)/d;
    z = x + t;
    p = log(abs(z-2))/log(abs(x-2));
    disp(p);
    nit= nit +1;
    x = z;
end

Risposte
feddy
Prova a calcolare lo zero di una funzione nota con il tuo metodo e poi calcola $p$ con la stima sopra trovata (dove $\alpha$ darà quindi lo zero conosciuto a priori): se ti viene ancora ordine uno, allora il tuo codice è sbagliato. Occhio a non usare funzione con zeri multipli: in questi casi Newton è mal condizionato e, cosa diversa, il suo ordine di convergenza diminuisce. Basta guardare l'iterazione funzionale di punto fisso in Newton per capirlo: se ci sono zeri multipli allora $g= x- \frac{f'(x)}{f(x)}$ sarà tale che $g'(0)= 1 - 1/m$, da cui segue una convergenza sempre più lenta.

Sinceramente non trovo molto sensato mettere quella stima dentro il ciclo. Se proprio uno vuole vedere se l'ordine è due potrebbe anche fare un grafico logaritmico dell'errore relativo e notare se la retta ha pendenza pari all'ordine cambiato di segno.

Oltretutto, non credo che sia corretto il fatto che $alpha$ sia un stima iniziale della radice: da quello che so dovrebbe essere un'approssimazione $x_m$ con $m>k +1$.

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