如何计算R中的偏导数积分?

时间:2019-04-18 19:26:35

标签: r integral

第一次尝试使用Deriv软件包。我试图以一个非常简单的偏导数积分作为起点:

image

这是我的尝试:

junk <- function (m) {
  -m*eval(deriv(~((exp(0.1*(100-94.5)^2))/(exp(0.1*(100-94.5)^2)+exp(0.1* 
(m-95)^2)+exp(0.1*(m-96)^2))),"m"))
}
integrate(junk, lower = 100, upper = 100.5)

这给了我错误的答案-24.30757,而不是12.383。任何人都可以阐明如何解决此问题吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这里的问题是deriv()不返回表达式。对于单变量推导,请使用D()

junk <- function (m) {
  -m*eval(D(expression((exp(0.1*(100-94.5)^2))/(exp(0.1*(100-94.5)^2)+exp(0.1*(m-95)^2)+exp(0.1*(m-96)^2))),"m")
}
integrate(junk, lower = 100, upper = 100.5)
  

12.38271,绝对错误<1.4e-13

为进行比较:

返回deriv()-致电

deriv(expression((exp(0.1*(100-94.5)^2))/(exp(0.1*(100-94.5)^2)+exp(0.1* 
                                                                        (m-95)^2)+exp(0.1*(m-96)^2))),"m"))
 expression({
     .expr4 <- exp(0.1 * (100 - 94.5)^2)
     .expr5 <- m - 95
     .expr8 <- exp(0.1 * .expr5^2)
     .expr10 <- m - 96
     .expr13 <- exp(0.1 * .expr10^2)
     .expr14 <- .expr4 + .expr8 + .expr13
     .value <- .expr4/.expr14
     .grad <- array(0, c(length(.value), 1L), list(NULL, c("m")))
     .grad[, "m"] <- -(.expr4 * (.expr8 * (0.1 * (2 * .expr5)) + 
         .expr13 * (0.1 * (2 * .expr10)))/.expr14^2)
     attr(.value, "gradient") <- .grad
     .value })

返回D()-表达式

D(expression((exp(0.1*(100-94.5)^2))/(exp(0.1*(100-94.5)^2)+exp(0.1*(m-95)^2)+exp(0.1*(m-96)^2))),"m")
 -((exp(0.1 * (100 - 94.5)^2)) * (exp(0.1 * (m - 95)^2) * (0.1 * 
     (2 * (m - 95))) + exp(0.1 * (m - 96)^2) * (0.1 * (2 * (m - 
     96))))/(exp(0.1 * (100 - 94.5)^2) + exp(0.1 * (m - 95)^2) + 
     exp(0.1 * (m - 96)^2))^2)

因此,根据您的语法和eval(),您需要D()提供的另一个表达式。或者,您可以使用call对象,这两种方法都是可行的。