質問

LISPを発明するマッカーシーの元の動機の1つは、自動分化のシステムを書くことであると聞いたことがあります。それにもかかわらず、私のGoogle検索では、これを行うためのライブラリ/マクロが生成されていません。関数fを取得し、fの誘導体を計算する関数df/dxを返すために、スキーム/一般的なLISP/Clojureライブラリ(マクロ)はありますか?

複数の引数でFをサポートしてほしいと思います。ユーザーは、これらのどれがXであるかを選択します。理想的には、差別化要因は、ベクトル値FとXでも機能します。

編集: :数人が象徴的な差別化に言及しています。象徴的な分化と自動分化の違いは微妙なものですが、それはよく要約されています ウィキペディア, 、、特に この絵. 。この区別は、象徴的な表現を作業プログラムに変えることができるLISPでは強力ではありませんが、潜在的な困難が残っています。

象徴的な分化では、既知の誘導体を持つ操作で構成されることを区別される式を必要とします。たとえば、誰かがSICPのマクロの例に言及し、ような単純なsexpsを介してかき混ぜます (+ y (* (x y))), 、およびチェーンルールを使用し、差別化方法の知識とともに使用します +*, 、微分を表すsexpを返す。そのような表現を使用するには、それが必要です (* (foo x y) (bar x)), 、 どこ foobar 順番に、誘導体が分化時に知られていない他の関数を呼び出すことができます。

次のような表現をとる方法があれば、これは問題ありません (foo x y) そして、それをその関数本文に置き換え、議論の言及を置き換えます xy 衛生的な方法で。ある?

また、上記のいずれも、ベクター値の引数に関してベクトル値の関数を区別するときに生じる合併症には対処されていません...これは、ほとんどの自己分化実装が準備されているものです。

役に立ちましたか?

解決

スキームの自動分化のために、他にも2つのパッケージがあります。 2番目は最初のものに基づいていますが、鶏の卵として作り直されました。これらは、フォワードモードとリバースモードの両方をサポートします。

他のヒント

Alexey Radulは次のように書いています

さて、scmutilsには自動分化システムがあります

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

(偶然にも象徴的な差別化も行われます)。他のリリースされた実装はわかりませんが、チェックするかもしれません http://autodiff.org/ .

また、古典力学の構造と解釈の付録に自分でそれを実装する方法についての素晴らしい説明もあります

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

学術文献と同様に。特にフォワードモードはそれほど難しくありませんが、摂動の混乱を避けるために注意する必要があります。 Barak PearlmutterとJeffrey Mark Siskindの出版物に相談してください。彼は、広告を組み込んで周囲の問題について公開している高性能LISPバリアントで協力しています。

http://scholar.google.com/scholar?q = barak+-pearlmutter++jeffrey+mark+siskind

あなたがシンボリックシステムを探しているなら、あなたは試すことができます マキシマ (また ここ)。多くの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

編集

わかりました、私は質問を誤解したようです。少しグーグルで、scmutilsにはこのツールがいくつかあることを示唆しています ここ, 、ダウンロード ここ, 、 ユーザーマニュアル ここ (P24以降を参照)。

それは興味深いかもしれません scmutlis 現在、Clojureに移植されています。やるべきことはもっとたくさんありますが、SICMの本の拳の章のコードは正常に実行されているようです。

差別化ルーチンとオペレーターは、私が行ったテストがほとんどないことでも問題ないように思えます。また、Scmutilsの後のバージョンに忍び込んだように見えるいくつかのバグはありません。

scmutilsは、OPの要件の再差別をカバーしていると思います。これは、既知と未知の(リテラル)関数の両方の導関数を正しく処理するためです。このページには、要件にどれだけうまく適合しているかを確認するために必要な詳細が記載されています。SICM-デリバティブ - 表記

JVMでの実行の利点の1つは、必要に応じてスタンドアロンとして実行されることです。Clojureをインストールする必要さえありません。

これは、元のスキームに非常に近く、Clojure構文のために行われた最小限の譲歩です。

ここで見ることができます:https://github.com/littleredcomputer/sicmutils#sicmutils

===

補遺:Sicmutils Clojureパッケージの自動分化の例です。これは、さまざまなインターネットサイトで流通する一般的な例であり、区別されるコードは

    function f(x)
      y = x;
      for i=1...100
        y = sin(x+y);
      return y

少し調整した後、私たちはそれを少し持っています

   > (defn inner [y] (fn[x] (sin (+ x y))))
   > (defn f100 [x] (nth (iterate (inner x) x) 100))
   ;; value of derivative at 6
   > ((D f100) 6)
    => 0.51603111348625
   ;; value of the 4th derivative at 1
   > (((expt D 4) f100) 1)
    => -1.7853200839806143

ここ 一般的なLISPでのADの実装です。

ClojureとJavaの両方の自動差別化を行うDerivaをチェックする価値があります。

Expressoにも興味があるかもしれません。これは数値的な発現操作に関するものですが、まだいくつかの差別化機能があり、おそらくほとんどの広告ユースケースに適応することができます。

「リスプシンボリック差別化」のGoogleとあなたはたくさんの例を見つけるでしょう。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top