如何知道区间中函数的平均值?

时间:2013-04-07 18:45:57

标签: r function mean

假设我有一个功能,例如:

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

我希望在一个区间内得到这个函数的平均值,假设从2到20。

得到平均值,我想到的第一个是:

mean(fun(2:20))

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

但是我想知道是否有更精确的方法来获得这个。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

enter image description here

因此,在获取积分后,您可以在两点评估函数并分析得到平均值。在您的情况下,这会导致-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")

enter image description here

请注意,至少需要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个样本足以获得合理的准确度。