Я слышал, что одним из оригинальных мотивов Маккарти для изобретения 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
гигиеническим образом. Есть ли?
Кроме того, ни одно из вышеперечисленных не устраняет сложностей, возникающих при дифференцировании векторнозначных функций по отношению к векторнозначным аргументам ... что и предназначено для большинства реализаций автодифференциации.