假设我有一个函数,例如:
fun <- function(x) 2.3*exp(-x/2)
我想沿着一个区间得到这个函数的平均值,假设从 2 到 20。
为了得到平均值,我首先想到的是:
mean(fun(2:20))
就像开始给函数赋值并计算平均值一样简单。
但是我想知道是否有其他更精确的方法来获得这个。任何的想法?
从分析上讲,您可以使用以下方法确定区间 [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 个样本足以获得合理的准确度。