假设我有一个功能,是这样的:我如何知道一个区间内函数的平均值?
fun <- function(x) 2.3*exp(-x/2)
,我想相处的时间间隔该功能的平均值,从2假设至20
得到的平均值,第一我想到的是这样的:
mean(fun(2:20))
就像开始给函数赋值并计算平均值一样简单。
但是,我想知道是否有任何其他更精确的方式来获得这一点。任何想法?
假设我有一个功能,是这样的:我如何知道一个区间内函数的平均值?
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个样本足以获得合理的准确度。
什么意思是精确的? “mean”会加起一串数字并除以“长度”。它似乎并不像你会放松任何精度,所以它有点让我困惑,你问什么? – 2013-04-07 18:53:15
是否有一个原因,你不只是分析函数的平均值? – 2013-04-07 19:16:05
我想平均值的准确性将取决于我按照区间抽样值的频率。我对吗?如果我每0.5次采样一次,那么我将得到一个不太准确的均值,如果我每0.005次采样。如果我错了,请纠正我。 – user18441 2013-04-07 19:35:17