星期日, 九月 11, 2011

R语言中的微分运算

虽然R语言的主要功能是统计计算,但它也包含了基本的数值计算函数,可用来进行数值积分与微分。本例中计算对象的函数形式为f(x, y) = sin(x^2/2 − y^2/4) cos(2x − exp(y))

先在R中进行绘图,使我们了解此二元函数的三维图形
x = seq(-1,3, length.out=100)
y = seq(0,1, length.out=30)
g = expand.grid(x = x, y =y)
g$z = sin(g$x^2/2 - g$y^2/4)*cos(2*g$x - exp(g$y))
wireframe(z ~ x * y, data = g, scales = list(arrows = FALSE),drape = TRUE, colorkey = TRUE, screen = list(z = 30, x = -60))



然后用deriv命令进行求导运算,括号内的参数分别是求导函数、自变量和两个逻辑参数。其结果存为Df,它的类型为一个函数。

Df <- deriv(z ~ sin(x^2/2 - y^2/4)*cos(2*x - exp(y)),c('x', 'y'), func=T, hessian=F)

求下列五个点处的函数值和对应的梯度向量。这五个点分别为(-1,1),(0,1),(1,1),(2,1),(3,1)
Df(c(-1:3),1)
运算结果如下,第一行为函数值,之后的为梯度向量
[1] 0.001457906 0.225566580 0.186279732 0.280503646 0.886217096
attr(,"gradient")
              x          y
[1,] -0.5005089  0.6696472
[2,] -0.2032578  0.7179512
[3,]  1.0551597 -0.8073411
[4,] -1.9879397  2.5891741
[5,]  1.0751438  0.1189299
数值积分的命令是integrate,但只能对一元函数进行运算。
integrand <- function(x) {1/((x+1)*sqrt(x))}
integrate(integrand, lower = 0, upper = Inf)

没有评论:

发表评论