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

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

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

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

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

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

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

12
задан SuperElectric 29 December 2011 в 07:25
поделиться