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