Ordine di convergenza

di il
5 risposte

Ordine di convergenza

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(|x^(k+1)-a|)/log(|x^k-a|), con a 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;
    nit= nit +1;
%     m = a;
%     p(nit+1) = log(abs(z-m))/(log(abs(x-m)));
%     disp(p);
    x = z;
end

5 Risposte

  • Re: Ordine di convergenza

    Nella parte commentata del codice, cosa è "a"?
    Non è definito come viene calcolata.

    Se non pubblichi il codice completo, come si può aiutarti?
  • Re: Ordine di convergenza

    “a” è la stima iniziale della radice, che dipende dalla funzione f che ho. Sì, dovrei metterla in input.
    Ho messo la parte commentata solo per dire che quella è la formula che mi ha dato l’insegnante.
  • Re: Ordine di convergenza

    La formula che hai inserito nel codice

    p=log(|x^(k+1)-a|)/log(|x^k-a|)

    è diversa da quella che hai scritto nella domanda:

    p(nit+1) = log(abs(z-m))/(log(abs(x-m)))

    Tra l'altro in MatLab la funzione "log" ritorna il Logaritmo naturale, mentre nella formula che dovresti usare non è chiaro se si tratti del logaritmo in base 10 o quello naturale.

    Se vuoi ottenere una risposta adeguata devi inserire tutte le informazioni, i dati di input ed il codice completo.
  • Re: Ordine di convergenza

    Nella formula p=log(|x^(k+1)-a|)/log(|x^k-a|), con a stima iniziale della radice, per x^(k+1) intendo l’approssimazione della radice al passo k+1 mentre con x^(k) intendo l’approssimazione della radice al passo k, che nel codice sono rispettivamente indicati con z e x.
    Riporto il codice per intero...
    function [z, nit] = newton (f, g, x, eps, nmax, a)
    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;
        nit= nit +1;
        p = log(abs(z-a))/(log(abs(x-a)));
        disp(p);
        x = z;
    end
  • Re: Ordine di convergenza

    Sinceramente faccio fatica a capire:

    [*] nella prima domanda fai riferimento ad un codice che, apparentemente, non funziona
    [*] nell'ultima risposta viene fuori che il codice che avevi pubblicato nella domanda iniziale non è quello sul quale stai lavorando e, finalmente, lo pubblichi quello "guisto": non potevi pubblicarlo prima?
    [*] nell'ultima risposta dici che x^(k+1) è z e che x^k è x, ma nel calcolo di z e x non effettui l'elevamento a potenza rispetto al valore dell'iterazione: o c'è un errore nell'implementazione o mi sfugge qualche passaggio intermedio (entrambe le cose, possibili, soprattutto l'ultima)

    Nella risposta che ti è stata data ti è stato chiesto:
    [*] se nella formula, con log, si intendesse il logaritmo in base 10 od il logaritmo naturale
    [*] di pubblicare i dati di input

    Nessuna di queste domande ha avuto una risposta.

    f e g sembrerebbero delle "anonymous functions": è così? Se sì, quali funzioni hai usato per testare il codice? Se no, cosa sono?

    Se, come hai scritto, a è la stima iniziale della radice, cosa rappresenta x in input?

    Come pensi che si possa cercare il possibile errore se non fornisci il codice completo (nella domanda iniziale) ed i valori di input (nè nella domanda iniziale nè nelle repliche successive)?

    Forse ti aspetti che chi voglia provare ad aiutarti:

    [*] si "inventi" una funzione
    [*] ne calcoli la derivata
    [*] plotti la la funzione per stimare il valore iniziale della radice
    [*] decida quale può essere un valore ragionevole di tolleranza
    [*] capisca (in base a cosa?) che differenza ci sia tra i parametri in input x e a

    Per chiudere, hai provato a debuggare il codice?
Devi accedere o registrarti per scrivere nel forum
5 risposte