R语言带依赖关系的双重积分计算方法及结果正确性咨询
最初的错误代码及原因
最初尝试的代码无法运行,核心问题是变量作用域冲突:
inner_func <- function(x) { alpha=23 beta=14 return(x^(alpha-1)*(1-t-x)^(beta-1)) } innerintegral <- Vectorize( function(t) { integrate(inner_func,0,1-t)$value } ) integrate(innerintegral,0,1)
内层函数inner_func引用了外层积分变量t,但t并未被传递到inner_func的作用域中,R无法识别该变量,导致运行报错。
改进后的代码及正确性验证
改用嵌套sapply的代码是正确的,它解决了变量作用域问题,每次计算内层积分时,都会将当前的t值明确传递给被积函数:
fun0 <- function(x,t){ alpha <- 10 beta <- 10 return(x^(alpha-1)*(1-t-x)^(beta-1)) } integrate(function(t) { sapply(t, function(t) { integrate(function(x) fun0(x,t), 0, 1-t)$value }) }, 0, 1)$value
结果准确性验证
可以通过解析解验证计算结果:
该双重积分的表达式为:
$$I = \int_{t=0}^1 \left( \int_{x=0}^{1-t} x{\alpha-1}(1-t-x){\beta-1} dx \right) dt$$
内层积分是变上限的Beta函数,根据Beta函数性质:
$$\int_{0}^{a} x{\alpha-1}(a-x){\beta-1}dx = a^{\alpha+\beta-1} \cdot \frac{\Gamma(\alpha)\Gamma(\beta)}{\Gamma(\alpha+\beta)}$$
这里$a=1-t$,因此内层积分结果为:
$$(1-t)^{\alpha+\beta-1} \cdot \frac{\Gamma(\alpha)\Gamma(\beta)}{\Gamma(\alpha+\beta)}$$外层积分转化为:
$$I = \frac{\Gamma(\alpha)\Gamma(\beta)}{\Gamma(\alpha+\beta)} \int_{0}^{1} (1-t)^{\alpha+\beta-1} dt$$
计算定积分$\int_{0}^{1} (1-t)^{\alpha+\beta-1} dt = \frac{1}{\alpha+\beta}$,因此最终解析解为:
$$I = \frac{\Gamma(\alpha)\Gamma(\beta)}{(\alpha+\beta)\Gamma(\alpha+\beta)}$$
当$\alpha=10$、$\beta=10$时:
- $\Gamma(10)=9!=362880$,$\Gamma(20)=19!=121645100408832000$
- 代入计算得:$I = \frac{362880 \times 362880}{20 \times 121645100408832000} ≈ 5.412544e-08$
这个结果和代码运行输出完全一致,说明方法和结果都是正确的。
内容的提问来源于stack exchange,提问作者Arnoneel Sinha

