利用蒙特卡洛模拟估算阴影部分面积
楚新元 / 2026-06-10
来自知乎上的一个问题,具体描述如下:
曲线
$y = x^2$、直线$y = 12 - x$与$x$轴在第一象限围成一个曲边三角形。设计一个随机实验,求该图形面积的近似值。
阴影部分面积示意图
library(ggplot2)
ggplot() +
stat_function(
fun = \(x) x^2,
xlim = c(0, sqrt(12)),
aes(color = "y = x²"),
linewidth = 1.2
) +
stat_function(
fun = \(x) x^2,
xlim = c(0, 3),
geom = "area",
fill = "#E6EDF2",
alpha = 0.7
) +
stat_function(
fun = \(x) 12 - x,
xlim = c(0, 12),
aes(color = "y = 12 - x"),
linewidth = 1.2
) +
stat_function(
fun = \(x) 12 - x,
xlim = c(3, 12),
geom = "area",
fill = "#DCE4E9",
alpha = 0.7
) +
geom_rect(
aes(xmin = 0, xmax = 12, ymin = 0, ymax = 9),
fill = NA,
linetype = 2,
colour = "#444444"
) +
geom_segment(
aes(x = 3, xend = 3, y = 0, yend = 9),
linetype = 2,
colour = "#444444"
) +
scale_colour_manual(values = c("#1F4E79", "#8C3130")) +
scale_x_continuous(breaks = 0:12) +
scale_y_continuous(breaks = 0:12) +
theme_classic() +
theme(
legend.title = element_blank(),
legend.position = c(0.8, 0.8),
legend.text = element_text(size = 12),
axis.title = element_blank(),
axis.text = element_text(size = 12, color = "#333333")
)

估算阴影部分面积
利用积分法很容计算出阴影部分面积为 49.5。下面的代码让你不需要懂微积分也可以估算出阴影部分面积,本质上是一种随机试验法,所以误差是难免的,因此这里称之为估算。
set.seed(1234)
s_hat = \(n) {
x = runif(n, min = 0, max = 12)
y = runif(n, min = 0, max = 9)
p1 = mean(x <= 3 & y <= x^2)
p2 = mean(x > 3 & y <= 12 - x)
(p1 + p2) * 12 * 9
}
n = 10^(1:7)
names(n) = format(n, scientific = FALSE)
sapply(n, s_hat)
#> 10 100 1000 10000 100000 1000000 10000000
#> 43.20000 44.28000 49.24800 48.97800 49.42296 49.58453 49.48443
