12

我聽說McCarthy發明Lisp的最初動機之一是編寫一個自動分化系統。儘管如此,我的谷歌搜索還沒有放棄任何圖書館/宏這樣做。是否有任何Scheme/Common Lisp/Clojure庫(宏)用於獲取函數F並返回計算F的導數的函數dF/dx?Scheme/Common Lisp/Clojure中的自動差異庫

我希望它支持F的多個參數。用戶將選擇哪些是x來區分相對於。理想情況下,即使對於矢量值F和x,差異函數也可以工作。

編輯:有幾個人提到了符號分化。象徵性分化與自動分化之間的區別是微妙的,但在Wikipedia,特別是this picture中有很好的概括。在lisp中,這種區別並沒有那麼強烈,其中符號表達式可以按原樣轉換爲工作程序,但是仍然存在潛在的困難:

符號區分要求將表達式區分爲由具有已知派生類型的操作組成。例如,有人提到SICP的一個宏的例子,它通過簡單的鴛鴦(如(+ y (* (x y))))攪動,並使用連鎖規則,以及如何區分+*的知識,返回代表衍生物的sexp。我需要這樣的表達式來處理像(* (foo x y) (bar x))這樣的表達式,其中foobar可以依次調用其衍生物在微分時間不知道的其他函數。

如果有拿一個表達式像(foo x y)和其函數體替換它,在衛生型的方式替代參數中的任何提及與xy某種程度上,這將是罰款。在那兒?

此外,上述任何一個都不能解決當向量值函數與矢量值參數相區分時出現的複雜情況......這是大多數自動分化實現的目標。

+2

的「數值的方法」標籤不能滿足您的問題,因爲你要求的是_symbolical_ differentiate。通過數值微分在x處尋找函數f的微分可以簡單地計算(f(x + dx)-f(x))/ dx對於一些小的dx值。 – Curd 2011-02-03 23:29:27

+3

@curd:通過添加數字方法標記,我並不是想暗示我正在尋找一種執行數值微分的方法,顯然,我不是。我的意思是這個問題涉及到與數值計算相關的功能(例如評估實現數值方法的符號表達式)。 – SuperElectric 2011-02-04 01:47:33

+2

我和你在一起。每次我提到自動分化時,人們都將它與象徵性的區分混淆起來,並且經常拒絕聽到有區別,這令人沮喪。它肯定是一種「數值方法」,它當然不是「數值分化」。 – sigfpe 2011-04-28 23:18:49

回答

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(參見第24頁)。

+0

謝謝,但符號分化的外部工具並不是我要找的。我編輯了這個問題來澄清這一點。 – SuperElectric 2011-02-04 01:52:33

7

阿列克謝拉杜爾寫道:

嗯,有自動分化系統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變體,該變體合併了AD並且已經在 上發佈了相關問題。

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

1

Here是在共同口齒不清AD的實現。

2

可能感興趣的是scmutlis現在已經移植到Clojure。 還有很多工作要做,但SICM書第一章中的代碼似乎運行良好。

差異化例程和操作符在我做了很少的測試後也看起來沒問題,它甚至沒有似乎已經悄悄進入scmutils更高版本的一些錯誤。

我認爲scmutils涵蓋了OP的要求重新分化,因爲它將正確處理已知和未知(文字)函數的衍生物。本頁提供看它如何適合要求所需的詳細信息: SICM - Derivatives - Notation

一個運行在JVM上的優勢,就是將運行如有需要一個獨立的,沒有必要甚至安裝Clojure的!

它非常接近最初的Scheme,爲Clojure語法做出了最小的讓步。

你可以在這裏看到: https://github.com/littleredcomputer/sicmutils#sicmutils

===

附錄: 這裏是在SicmUtils Clojure的PoP自動分化的一個例子。這是一個常見的例子在各種互聯網網站流傳,加以區別的代碼是

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

Clojurifying有點後,我們有

> (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