Per motivi di notazione, supponiamo che (ovvero, è una funzione con valori vettoriali che accetta un vettore come input e genera un vettore delle stesse dimensioni). Ci sono due preoccupazioni: costo computazionale e precisione numerica.f: Rn→ Rn
Calcolare la derivata (la matrice giacobina, J ( x ) o ( ∇ f ( x ) ) T , o qualunque cosa tu preferisca) usando differenze finite richiederà n valutazioni di funzione. Se è possibile calcolare la derivata utilizzando l'aritmetica in virgola mobile direttamente dalla definizione, è necessario calcolare il quoziente di differenzaD f( x )J( x )( ∇ f( x ) )Tn
D f( x ) eio= limε → 0f( x + ε eio) - f( x )ε
per ogni , supponendo che tu non faccia alcun tipo di "differenziazione finita intelligente" (come Curtis-Powell-Reid) perché conosci (o riesci a rilevare) il modello di scarsità di D f . Se n è grande, potrebbero essere molte le valutazioni delle funzioni. Se hai un'espressione analitica per D f , calcolarla potrebbe essere più economico. In alcuni casi è anche possibile utilizzare metodi di differenziazione automatici (anche noti come algoritmi) per calcolare D f approssimativamente da 3 a 5 volte il costo di una valutazione della funzione.i = 1 , … , nD fnD fD f
Ci sono anche preoccupazioni numeriche. Ovviamente, su un computer, non possiamo prendere il limite di uno scalare in quanto va a zero, quindi quando approssimiamo , stiamo davvero scegliendo ε per essere "piccolo" e calcolandoD fε
D f( x ) eio≈ f( x + ε eio) - f( x )ε,
dove significa che è un'approssimazione e speriamo che sia un'approssimazione davvero buona. Calcolare questa approssimazione nell'aritmetica in virgola mobile è difficile perché se si seleziona ε troppo grande, l'approssimazione potrebbe essere errata, ma se si seleziona ε troppo piccolo, si potrebbe verificare un errore di arrotondamento significativo. Questi effetti sono trattati nell'articolo di Wikipedia sulla differenziazione numerica in dettaglio superficiale; riferimenti più dettagliati sono disponibili all'interno dell'articolo.≈εε
Se l'errore nella matrice Jacobiana non è troppo grande, le iterazioni di Newton-Raphson convergeranno. Per un'analisi teorica dettagliata, vedere il capitolo 25 di Precisione e stabilità degli algoritmi numerici di Nick Higham o l'articolo di Françoise Tisseur su cui si basa.D f
Le biblioteche generalmente si prendono cura di questi dettagli algoritmici per te, e di solito, le implementazioni delle librerie dell'algoritmo Newton-Raphson (o sue varianti) convergeranno abbastanza bene, ma ogni tanto ci sarà un problema che causa qualche problema a causa degli svantaggi sopra. Nel caso scalare , userei il metodo di Brent , grazie alla sua robustezza e al buon tasso di convergenza nella pratica.( n = 1 )