Ho sentito che una delle motivazioni originali di McCarthy per l'invenzione di Lisp era scrivere un sistema per la differenziazione automatica. Nonostante questo, le mie ricerche su Google non hanno prodotto librerie/macro per fare ciò. Ci sono delle librerie Scheme/Common Lisp/Clojure (macro) là fuori per prendere una funzione F e restituire una funzione dF/dx che calcola la derivata di F?Libreria di differenziazione automatica in Schema/Common Lisp/Clojure
Vorrei che supporti F con più argomenti. L'utente dovrebbe scegliere quale di questi è la x da differenziare rispetto a. Idealmente, il differenziatore funzionerebbe anche per F e x di valore vettoriale.
EDIT: Diverse persone hanno menzionato la differenziazione simbolica. La differenza tra differenziazione simbolica e differenziazione automatica è sottile, ma è sintetizzata bene in Wikipedia e in particolare in this picture. Questa distinzione non è così forte in lisp, dove le espressioni simboliche possono essere trasformate in programmi di lavoro così come sono, ma rimane una potenziale difficoltà:
La differenziazione simbolica richiede che l'espressione sia differenziata per essere composta di operazioni con derivate note. Ad esempio, qualcuno ha citato l'esempio di SICP di una macro che agisce attraverso semplici sexps come (+ y (* (x y)))
, e usa la regola della catena, insieme alla conoscenza di come differenziare +
e *
, per restituire un sexp che rappresenta la derivata. Avrei bisogno di questo per lavorare con espressioni come (* (foo x y) (bar x))
, dove foo
e bar
possono a loro volta chiamare altre funzioni i cui derivati non sono noti al momento della differenziazione.
Questo sarebbe bene se c'è un modo per prendere un'espressione come (foo x y)
e sostituirlo con il suo corpo funzione, sostituendo qualsiasi menzione degli argomenti con x
e y
in modo igienico. È lì?
Inoltre, nessuno dei problemi di cui sopra riguarda le complicazioni che si verificano quando si differenziano le funzioni con valori vettoriali rispetto agli argomenti con valori vettoriali ... che è ciò per cui sono implementate la maggior parte delle implementazioni di autodifferenziazione.
Il tag "numeriche-metodi" non è adeguata per la tua domanda , perché ciò che stai chiedendo è la differenziazione simbolica. Trovare la derivata di una funzione f in x per differenziazione numerica sarebbe semplicemente un calcolo di (f (x + dx) -f (x))/dx per qualche piccolo valore di dx. – Curd
@ curd: aggiungendo il tag numerical-methods, non intendevo implicare che stavo cercando un modo per eseguire la differenziazione numerica, che, chiaramente, non lo sono. Volevo solo dire che la domanda riguarda le funzioni relative al calcolo numerico (ad esempio, valutare le espressioni simboliche che implementano metodi numerici). – SuperElectric
Sono con te. È frustrante il modo in cui ogni volta che accenno alla differenziazione automatica le persone lo confondono con la differenziazione simbolica e spesso si rifiutano di sentire che c'è una differenza. È sicuramente un "metodo numerico", e certamente non è una "differenziazione numerica". – sigfpe