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