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