假设我有一个功能,例如:
fun <- function(x) 2.3*exp(-x/2)
我希望在一个区间内得到这个函数的平均值,假设从2到20。
得到平均值,我想到的第一个是:
mean(fun(2:20))
就像开始为函数赋值并计算均值一样简单。
但是我想知道是否有更精确的方法来获得这个。有什么想法吗?
答案 0 :(得分: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个样本足以获得合理的准确度。