Библиотека автоматического дифференцирования в Scheme / Common Lisp / Clojure - PullRequest
12 голосов
/ 04 февраля 2011

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

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

РЕДАКТИРОВАТЬ : Несколько человек упомянули о символической дифференциации. Разница между символической дифференциацией и автоматической дифференциацией является тонкой, но она хорошо обобщена в Википедии , и особенно в этой картине . Это различие не так сильно в lisp, где символические выражения могут быть превращены в рабочие программы как есть, но остается потенциальная трудность:

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

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

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

Ответы [ 7 ]

7 голосов
/ 04 февраля 2011

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

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

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

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

Есть также хорошее объяснение того, как реализовать это самостоятельно в приложение структуры и интерпретации классической механики

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

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

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

3 голосов
/ 04 февраля 2011

Если вы ищете символическую систему, вы можете попробовать 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 здесь здесь есть *1018*, для загрузки здесь , руководство пользователя здесь (см. Стр. 24 далее).

2 голосов
/ 24 января 2016

Может быть интересно, что 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

. После небольшой его модификации мы получаем

   > (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
2 голосов
/ 10 апреля 2013

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

1 голос
/ 04 ноября 2013

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

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

1 голос
/ 29 апреля 2011

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

0 голосов
/ 04 февраля 2011

Google для «символической дифференциации шрифта» и вы найдете множество примеров, например,

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

...