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