Явная формула против символьных производных в R

Я хотел бы оценить производные более высокого порядка некоторой функции f в R. У меня есть две возможности.

  1. Либо я определяю общее выражение для f(k), k-й производной от f (которую я может сделать в моем конкретном случае), а затем я оцениваю это;
  2. Или я использую возможности R для выполнения символьной производной (функция D()).

В чем преимущество 1 перед 2? Предположим, что f(k) не является рекурсивной формулой. Что если f(k) является рекурсивным?

Любой намек будет оценен.


person Marco    schedule 08.01.2012    source источник
comment
Что ты пытаешься сделать? Ваши вопросы неясны. Да, Ryacas и другие алгебраические компьютерные языки могут вычислять аналитические (не символические производные (не производные), и да, вы можете заставить R вычислять значения различных функций, представляющих производные. Но почему и для какого набора функций f?   -  person Carl Witthoft    schedule 08.01.2012
comment
Я говорю о символьных производных в R (попробуйте help(D)). Почему будет слишком долго и неуместно объяснять. Для какого множества функций f... ну, скажем, для любой функции, для которой можно вычислить производные... Я хотел бы знать, какие преимущества вы могли бы указать, например, с точки зрения времени вычисления, памяти, скорости. ..   -  person Marco    schedule 08.01.2012
comment
@Г. Гротендик: Большое спасибо за ваши комментарии.   -  person Marco    schedule 08.01.2012
comment
@ G.Grothendieck - Спасибо, что откликнулись. Не могли бы вы сделать свои комментарии ответом и / или упомянуть, есть ли какое-либо другое преимущество Ryacas над D () w.r.t. символическая дифференциация? На странице справки для D() перечислено несколько функций с одной переменной, которые он распознает. Узнает ли Рьякас еще кучу?   -  person Josh O'Brien    schedule 08.01.2012
comment
хорошо, я удалил свои комментарии и перенес их в ответ.   -  person G. Grothendieck    schedule 09.01.2012


Ответы (1)


Символьное дифференцирование менее подвержено ошибкам, чем ручное.

Для низких порядков я не думаю, что символическое дифференцирование потребует много компьютерного времени, но вы можете легко рассчитать свою конкретную ситуацию, чтобы определить, что она использует proc.time, system.time или rbenchmark пакет. См. также эти примеры.

Возможно, вы захотите попробовать как символическую, так и ручную дифференциацию в качестве проверки.

Что касается deriv R (и связанных функций например D) по сравнению с пакетом Ryacas, последний имеет возможность повторять дифференцирование, не требуя от пользователя итерации сами (третий аргумент deriv указывает порядок), и у него есть функция Simplify, для которой нет аналога в R, хотя Ryacas следует тщательно проверять, так как yacas иногда могут немного глючить.

Вот пример:

> library(Ryacas)
> x <- Sym("x")
> y <- (x^2+x)^2
> dy <- deriv(y, x, 2) # 2nd deriv
> dy
expression(2 * (2 * x + 1)^2 + 4 * (x^2 + x))
> Simplify(dy)
expression(2 * (6 * x^2 + 6 * x + 1))

РЕДАКТИРОВАТЬ: добавлено в пример:

> Eval(dy, list(x = 3))
[1] 146
> Eval(Simplify(dy), list(x = 3))
[1] 146
>
> f <- function(x) {}
> body(f) <- yacas(Simplify(dy))[[1]]
> f
function (x) 
2 * (6 * x^2 + 6 * x + 1)
> f(3)
[1] 146
>
> # double check
> w <- 3
> eval(D( D(expression((w^2+w)^2), "w"), "w"))
[1] 146

Также попробуйте demo("Ryacas-Function") .

РЕДАКТИРОВАТЬ 2: исправлена ​​ошибка и добавлено больше примеров.

person Community    schedule 08.01.2012