我听说麦卡锡发明Lisp的最初动机之一是编写一个自动区分系统。尽管如此,我的Google搜索并没有产生任何库/宏来做这件事。是否有用于获取函数F和返回计算F的导数的函数dF/dx的Scheme/Common /Clojure库(宏)?
我希望它支持F有多个参数。用户将选择其中哪个是相对于x的区分。理想情况下,即使是向量值F和x,微分器也能工作.
编辑:有几个人提到了象征性的区别。符号分化和自动分化的区别是微妙的,但在维基百科,特别是这幅画中有很好的概括。这种区别在lisp中没有那么强,因为符号表达式可以像以前一样转化为工作程序,但仍然存在一个潜在的困难:
符号微分要求被区分的表达式由具有已知导数的运算组成。例如,有人提到了SICP的宏示例,该宏通过简单的性别(如(+ y (* (x y))) ),并使用链规则,以及如何区分+和*的知识,返回表示导数的性别p。我需要它来处理像(* (foo x y) (bar x))这样的表达式,在这里,foo和bar可以调用那些导数在微分时不为人所知的函数。
如果有一种方法将像(foo x y)这样的表达式替换为它的函数体,那么这就很好了,用x和y替换任何参数都可以。在那里吗?
此外,上述任何一项都不涉及区分向量值函数与向量值参数有关的复杂问题.这是大多数自动区分实现所针对的。
发布于 2013-04-10 12:35:26
还有另外两个包,它们都是用来自动区分方案的。第二种是基于第一种,但重新加工成一只鸡蛋。这些支持正向和反向模式。
发布于 2011-02-04 20:30:49
Alexey Radul写道:
嗯,在Scmutils中有一个自动区分系统
http://groups.csail.mit.edu/mac/users/gjs/6946/linux-install.htm
(巧合的是,这也是象征性的区别)。我不知道其他发布的实现,尽管您可能会检查http://autodiff.org/。
在经典力学的结构和解释附录中,也有一个很好的解释,说明了如何自己实现它
http://mitpress.mit.edu/sicm/
以及学术文献。特别是前向模式并不难,尽管你必须小心避免扰动混乱。您可以参考Barak和Jeffrey的出版物,他们正在合作开发一种高性能的Lisp变体,它包含了AD,并且一直在发布相关的问题。
http://scholar.google.com/scholar?q=Barak+Pearlmutter+and+Jeffrey+Mark+Siskind
发布于 2016-01-24 04:55:51
scmutlis现在已经移植到Clojure上,这可能会引起人们的兴趣。还有许多工作要做,但SICM书前几章的代码似乎运行良好。
区分例程和操作符似乎也可以接受我所做的一些小测试,甚至没有一些bug,这些bug似乎已经渗透到了scmutils的后期版本中。
我认为scmutils涵盖了OP的需求重新区分,因为它将正确地处理已知和未知(字面)函数的导数。本页面提供了需要的详细信息,以查看它是否适合需求:衍生物.表示法
在JVM上运行的优点之一是,如果需要的话,它将作为独立运行,甚至不需要安装Clojure!
它非常接近最初的Scheme,对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.7853200839806143https://stackoverflow.com/questions/4892822
复制相似问题