0

假设我有一个函数,例如:

fun <- function(x) 2.3*exp(-x/2)

我想沿着一个区间得到这个函数的平均值,假设从 2 到 20。

为了得到平均值,我首先想到的是:

mean(fun(2:20))

就像开始给函数赋值并计算平均值一样简单。

但是我想知道是否有其他更精确的方法来获得这个。任何的想法?

4

1 回答 1

2

从分析上讲,您可以使用以下方法确定区间 [a,b] 上的函数的平均值:

在此处输入图像描述

因此,在取积分后,您可以在两点评估函数并解析得到平均值。在您的情况下,这会导致 的积分-4.6 * exp(0.5 * x)和 的平均值1/(20-2) * (-4.6 * exp(-0.5 * 20) + 4.6 * exp(-0.5 * 2)) = 0.09400203


现在我现在专注于沿区间采样,并计算如下平均值:

get_sample_mean_from_function = function(func, interval, n = 1000) {
   interval_samples = seq(interval[1], interval[2], length = n)
   function_values = sapply(interval_samples, func)
   return(mean(function_values))
}

fun <- function(x) 2.3*exp(-x/2)
get_sample_mean_from_function(fun, interval = c(2,20))

通过增加数量n(采集的样本数量),您可以提高答案的精度。这就是平均值随着样本量的增加而变化的方式:

n_list = c(1,4,10,15,25,50,100,500,1000,10e3,100e3,100e4,100e5)
mean_list = sapply(n_list, 
                   function(x) get_sample_mean_from_function(fun, 
                                    interval = c(2,20), n = x))
library(ggplot2)
qplot(n_list, mean_list, geom = "point", log = "x")

在此处输入图像描述

请注意,至少需要 1000 个样本才能获得任何收敛。如果我们将此数值解与解析值进行比较:

mean_list - real_value
 [1] 7.521207e-01 1.286106e-01 3.984653e-02 2.494165e-02 1.421951e-02
 [6] 6.841070e-03 3.355199e-03 6.607662e-04 3.297467e-04 3.291750e-05
[11] 3.291179e-06 3.291122e-07 3.291116e-08

我们看到,即使对于100e5样本,与双浮点精度相比,解析解和数值解之间的差异仍然很大。

如果您迫切需要非常高的精度,我会尝试寻求分析解决方案。然而,在实践中,5000 个样本足以获得合理的准确度。

于 2013-04-07T19:32:46.530 回答