Welcome to R Square

利用蒙特卡洛模拟估算阴影部分面积

楚新元 / 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