找回密码
 注册
查看: 5651|回复: 0

R语言中一个递归式的数值积分的例子

[复制链接]
发表于 2011-1-22 21:38:25 | 显示全部楼层 |阅读模式
函数可以是递归的,可以在函数内部调用自己。但是需要注意的是,这些函数或
者变量,不会被更高层次解析框架(evaluation frame)中的函数所继承,除非它们在
搜索路径中2。
下面的例子显示了一个最简单的一维数值积分方法。被积函数在所积范围的两端
和中点的值会被计算。如果单面板梯形法则(one-panel trapezium rule)的结果和双
面板(two panel) 的非常相似,那么就以后者结果作为返回值。否则同样的过程会递归
用于各个面板。这是一个自适应的积分过程。它会集中各个远离线性曲线区域的被积
函数计算值3。但是这种方法开销有点过大, 相对其他积分算法,它的优势仅体现在被
积函数既平滑又很难求值时。
这个例子同样可以部分的作为一个R 编程的难题给出。
area <- function(f, a, b, eps = 1.0e-06, lim = 10) {
fun1 <- function(f, a, b, fa, fb, a0, eps, lim, fun) {
## 函数~`fun1'仅仅在`区域'中可见
d <- (a + b)/2
h <- (b - a)/4
fd <- f(d)
a1 <- h * (fa + fd)
a2 <- h * (fd + fb)
if(abs(a0 - a1 - a2) < eps || lim == 0)
return(a1 + a2)
else {
return(fun(f, a, d, fa, fd, a1, eps, lim - 1, fun) +
fun(f, d, b, fd, fb, a2, eps, lim - 1, fun))
}
}
fa <- f(a)
fb <- f(b)
a0 <- ((fa + fb) * (b - a))/2
fun1(f, a, b, fa, fb, a0, eps, lim, fun1)
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-22 03:35 , Processed in 0.023974 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表