Я слышал, что одной из первоначальных мотиваций Маккарти для изобретения Лиспа было создание системы для автоматического распознавания. Несмотря на это, мой поиск в Google не дал никаких библиотек / макросов для этого. Существуют ли какие-либо библиотеки (макросы) Scheme / Common Lisp / Clojure для взятия функции F и возврата функции dF / dx, которая вычисляет производную от F?
Я бы хотел, чтобы он поддерживал F несколькими аргументами. Пользователь мог бы выбрать, по какому из них нужно различать x. В идеале дифференциатор работал бы даже для векторных F и x.
РЕДАКТИРОВАТЬ: несколько человек упомянули о символической дифференциации. Разница между символическим дифференцированием и автоматическим различием невелика, но она хорошо резюмирована в Википедии, и особенно в этом изображении. Это различие не так сильно в lisp, где символические выражения могут быть превращены в рабочие программы как есть, но остается потенциальная трудность:
Символическое дифференцирование требует, чтобы дифференцируемое выражение состояло из операций с известными производными. Например, кто-то упомянул пример макроса SICP, который перебирает простые выражения, такие как (+ y (* (x y)))
, и использует правило цепочки, наряду со знанием того, как различать +
и *
, чтобы вернуть sexp, представляющий производную. Мне это понадобится для работы с выражениями типа (* (foo x y) (bar x))
, где foo
и bar
могут, в свою очередь, вызывать другие функции, производные которых не известны во время дифференцирования.
Это было бы хорошо, если бы есть способ взять выражение типа (foo x y)
и заменить его телом функции, заменив любое упоминание аргументов на x
и y
гигиеничным способом. Есть?
Кроме того, ни одно из вышеперечисленных действий не решает проблем, возникающих при дифференцировании векторных функций по отношению к векторным аргументам ... для чего и ориентировано большинство реализаций автодифференцирования.