Подтвердить что ты не робот

Библиотека автоматической дифференциации в схеме/общем Lisp/Clojure

Я слышал, что одним из основополагающих мотивов Маккарти для изобретения Lisp было написать систему автоматической дифференциации. Несмотря на это, мои поисковые запросы Google не дали никаких библиотек/макросов для этого. Существуют ли какие-либо библиотеки Scheme/Common Lisp/Clojure (макросы) для принятия функции F и возвращения функции dF/dx, которая вычисляет производную от F?

Я бы хотел, чтобы он поддерживал F несколькими аргументами. Пользователь будет выбирать, какой из них является х, чтобы дифференцировать по отношению к. В идеале дифференциатор работал бы даже для векторных значений F и x.

EDIT. Несколько человек упомянули о символической дифференциации. Разница между символической дифференциацией и автоматической дифференциацией является тонкой, но она хорошо суммируется в Wikipedia, и особенно в это изображение. Это различие не столь сильное в lisp, где символические выражения могут быть превращены в рабочие программы как есть, но остается потенциальная трудность:

Символическое дифференцирование требует дифференцирования выражения, состоящего из операций с известными производными. Например, кто-то упомянул пример SICP макроса, который извергается через простые sexps, такие как (+ y (* (x y))), и использует правило цепи, а также знание того, как отличать + и *, чтобы вернуть sexp, представляющий производную. Мне нужно было бы работать с выражениями типа (* (foo x y) (bar x)), где foo и bar могут, в свою очередь, вызывать другие функции, производные которых не известны во время дифференциации.

Это было бы замечательно, если бы можно было взять выражение типа (foo x y) и заменить его своим телом функции, заменив любое упоминание аргументов x и y гигенным способом. Есть?

Кроме того, ни один из вышеперечисленных адресов не вызывает осложнений, возникающих при дифференцировании векторнозначных функций по отношению к векторнозначным аргументам... для чего предназначены большинство реализаций автодифференцировки.

4b9b3361

Ответ 1

Есть два других пакета, как для автоматической дифференциации в Схеме. Второй основан на первом, но переработан как куриное яйцо. Они поддерживают как прямой, так и обратный режим.

Ответ 2

Алексей Радул пишет:

Ну, там система автоматической дифференциации в Scmutils

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

(что по совпадению также символическое дифференцирование). Я не знаю других выпущенных версий, хотя вы можете проверьте http://autodiff.org/.

Там также хорошее объяснение того, как реализовать его самостоятельно в Приложение "Структура и интерпретация классической механики"

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

а также в академической литературе. В частности, режим прямой не так сложно, хотя вам нужно быть осторожным, чтобы избежать возмущения спутанность сознания. Вы можете обратиться к публикациям Barak Pearlmutter и Джеффри Марк Siskind, которые сотрудничают на высокой производительности Lisp, который включает AD и публикуется на окружающие проблемы.

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

Ответ 3

Если вы ищете символическую систему, вы можете попробовать maxima (или здесь). Он работает с несколькими комбинациями платформы 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 и далее).

Ответ 4

Может показаться, что scmutlis теперь перенесен на Clojure. Существует еще много работы, но код в первых главах книги SICM выглядит нормально.

Подпрограммы дифференциации и операторы также кажутся хорошо с тем, что небольшое тестирование я сделал, и он даже свободен от некоторых ошибок, которые, похоже, закрались в более поздние версии scmutils.

Я думаю, что scmutils охватывает дифференциацию требований OP, поскольку он будет правильно обрабатывать производные как известных, так и неизвестных (буквальных) функций. На этой странице дается подробная информация о том, насколько она соответствует требованиям: SICM - Производные - Обозначение

Одним из преимуществ работы на JVM является то, что будет работать как автономное, если это необходимо, не нужно даже устанавливать 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

После 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

Ответ 5

Здесь - реализация AD в общем lisp.

Ответ 6

Стоит проверить Deriva, который выполняет автоматическое дифференцирование как для Clojure, так и для Java:

Вы также можете быть заинтересованы в expresso, который больше связан с манипуляцией численным выражением, но все еще имеет некоторые отличительные особенности и, вероятно, может быть адаптирован к большинству случаев использования AD: