マッカーシーが Lisp を発明した当初の動機の 1 つは、自動微分のシステムを書くことだったと聞いたことがあります。それにもかかわらず、私の Google 検索では、これを行うためのライブラリ/マクロは得られませんでした。関数 F を取り、F の導関数を計算する関数 dF/dx を返すための Scheme/Common Lisp/Clojure ライブラリ (マクロ) はありますか?
複数の引数を持つ F をサポートしたいと思います。ユーザーは、これらのうちどれを x として微分するかを選択します。理想的には、微分器はベクトル値の F と x に対しても機能します。
編集:何人かの人々が象徴的な微分について言及しています。シンボリック微分と自動微分の違いは微妙ですが、ウィキペディア、特にこの図によくまとめられています。この区別は、シンボリック式をそのまま動作するプログラムに変換できる Lisp ではそれほど強力ではありませんが、潜在的な問題が残っています。
シンボリック微分では、微分される式が既知の導関数を使用した操作で構成される必要があります。たとえば、誰かが のような単純な sexp をかき回すマクロの SICP の例に言及し、微分を表す sexp を返す(+ y (* (x y)))
方法の知識とともに、チェーン ルールを使用します。、 whereおよびmay のような式で作業するには、微分時に導関数が不明な他の関数を呼び出す必要があります。+
*
(* (foo x y) (bar x))
foo
bar
(foo x y)
のような式を取り、それを関数本体に置き換えて、引数の言及を衛生的な方法で and に置き換えるx
方法があれば、これは問題ありませんy
。ある?
また、上記のいずれも、ベクトル値の引数に関してベクトル値の関数を微分するときに発生する複雑さに対処していません...これは、ほとんどの自動微分の実装が対象とされているものです。