Библиотека автоматического дифференцирования в схеме / Common Lisp / Clojure
Я хотел бы, чтобы он поддерживал F с несколькими аргументами. Пользователь будет выбирать, какой из них является ли x дифференцировать по отношению к. В идеале дифференциатор будет работать даже для векторных значений F и X.
редактировать: несколько человек упомянули символическую дифференциацию. Разница между символической дифференциацией и автоматической дифференциацией является тонкой, но она хорошо суммируется в Википедия и особенно эта картинка. Это различие не так сильно в lisp, где символические выражения могут быть превратились в рабочие программы как есть, но остается потенциальная сложность:
символическое дифференцирование требует, чтобы дифференцируемое выражение состояло из операций с известными производными. Например, кто-то упомянул пример SICP макроса, который сбивается через простые sexps, такие как (+ y (* (x y)))
, и использует правило цепи, наряду со знанием того, как дифференцировать +
и *
, чтобы вернуть sexp, представляющий производную. Мне нужно это, чтобы работать с выражения типа (* (foo x y) (bar x))
, где foo
и bar
может в свою очередь вызывать другие функции, производные которых не известны во время дифференцирования.
это было бы хорошо, если есть способ взять такое выражение, как (foo x y)
и замените его на его функциональное тело, заменив любое упоминание аргументов x
и y
в hygenic пути. Есть?
кроме того, ни один из вышеприведенных адресов осложнений, которые возникают при дифференцировании векторных функций в отношении векторных аргументов... для чего предназначены большинство реализаций autodifferentiation.
7 ответов
есть два других пакета, оба для автоматического дифференцирования в схеме. Второй основан на первом, но переработан как куриное яйцо. Они поддерживают как прямой, так и обратный режим.
Алексей Радул пишет:
Ну, есть автоматическая система дифференцирования в Scmutils
http://groups.csail.mit.edu/mac/users/gjs/6946/linux-install.htm
(что по совпадению также делает символическое дифференцирование). Я не знаю никаких других выпущенных реализаций, хотя вы могли бы проверить http://autodiff.org/ .
есть также хорошее объяснение того, как реализовать его самостоятельно в добавление Структура и интерпретация классической механики
а также в научной литературе. Особенно прямой режим не так сложно, хотя вам нужно быть осторожным, чтобы избежать возмущения путаница. Вы можете ознакомиться с публикациями Barak Pearlmutter и Джеффри Марк Сискинд, который сотрудничает на высокопроизводительном Вариант Lisp, который включает объявление и публикуется на окружающий проблемы.
http://scholar.google.com/scholar?q=Barak+Pearlmutter+and+Jeffrey+Mark+Siskind
Если вы ищете символическую систему, вы можете попробовать 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 здесь скачать здесь, руководство пользователя здесь (см. П24 года).
может быть интересно, что 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
стоит проверить Deriva, которая делает автоматическую дифференциацию как для Clojure, так и для Java:
вы также можете быть заинтересованы в expresso, который больше о манипуляции числовым выражением, но все еще имеет некоторые особенности дифференциации и, вероятно, может быть адаптирован к большинству случаев использования рекламы:
Google для "символической дифференциации lisp" и вы найдете множество примеров, например
http://mitpress.mit.edu/sicp/full-text/sicp/book/node39.html