13

マッカーシーが 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))foobar

(foo x y)のような式を取り、それを関数本体に置き換えて、引数の言及を衛生的な方法で and に置き換えるx方法があれば、これは問題ありませんy。ある?

また、上記のいずれも、ベクトル値の引数に関してベクトル値の関数を微分するときに発生する複雑さに対処していません...これは、ほとんどの自動微分の実装が対象とされているものです。

4

7 に答える 7

8

アレクセイ・ラドゥルは次のように書いています。

さて、Scmutils には自動微分システムがあります。

http://groups.csail.mit.edu/mac/users/gjs/6946/linux-install.htm

(偶然にも記号微分も行います)。http://autodiff.org/をチェックするかもしれませんが、他のリリースされた実装については知りません。

また、Structure and Interpretation of Classical Mechanics の付録に、自分で実装する方法の優れた説明もあります。

http://mitpress.mit.edu/sicm/

学術文献と同様に。特に順方向モードはそれほど難しくありませんが、摂動による混乱を避けるために注意する必要があります。Barak Pearlmutter と Jeffrey Mark Siskind の出版物を参考にしてください。彼らは AD を組み込んだ高性能な Lisp バリアントで共同作業を行っており、関連する問題について出版しています。

http://scholar.google.com/scholar?q=Barak+Pearlmutter+and+Jeffrey+Mark+Siskind

于 2011-02-04T20:30:49.627 に答える
4

他に 2 つのパッケージがあり、どちらも Scheme での自動微分用です。2 番目は 1 番目に基づいていますが、鶏の卵として作り直されています。これらは、順方向モードと逆方向モードの両方をサポートしています。

于 2013-04-10T12:35:26.870 に答える
3

シンボリック システムを探している場合は、maxima (またはhere ) を試すことができます。多くの Common-Lisp/OS プラットフォームの組み合わせで動作しますが、ライブラリというよりは完全なシステムです。

コンソール出力は問題ありませんが、 texmacsと組み合わせると非常に見栄えの良い出力を生成できます。

Maxima 5.23.2 http://maxima.sourceforge.net
using Lisp GNU Common Lisp (GCL) GCL 2.6.8 (a.k.a. GCL)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1) diff(sin(1/x),x);
                                        1
                                     cos(-)
                                         x
(%o1)                              - ------
                                        2
                                       x

編集

OK、質問を誤解したようです。少しグーグルで検索すると、SCMUTILS here、ダウンロードhere、ユーザーマニュアルhere (p24 以降を参照) に、このためのツールがいくつかあることがわかります。

于 2011-02-03T23:19:45.687 に答える
1

これがCommonLispでのADの実装です。

于 2011-04-28T23:25:54.700 に答える
-1

グーグルは「Lispシンボリック微分」のためにあり、あなたはたくさんの例を見つけるでしょう、例えば

http://mitpress.mit.edu/sicp/full-text/sicp/book/node39.html

于 2011-02-03T23:34:18.303 に答える