2013-04-07 133 views
0

假设我有一个功能,是这样的:我如何知道一个区间内函数的平均值?

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

,我想相处的时间间隔该功能的平均值,从2假设至20

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

mean(fun(2:20)) 

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

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

+0

什么意思是精确的? “mean”会加起一串数字并除以“长度”。它似乎并不像你会放松任何精度,所以它有点让我困惑,你问什么? – 2013-04-07 18:53:15

+0

是否有一个原因,你不只是分析函数的平均值? – 2013-04-07 19:16:05

+0

我想平均值的准确性将取决于我按照区间抽样值的频率。我对吗?如果我每0.5次采样一次,那么我将得到一个不太准确的均值,如果我每0.005次采样。如果我错了,请纠正我。 – user18441 2013-04-07 19:35:17

回答

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个样本足以获得合理的准确度。

+0

非常感谢Paul! – user18441 2013-04-07 19:38:11

+0

还添加了解析解,并将其与数值进行比较。 – 2013-04-07 19:57:17

+0

可爱!再次感谢你。 – user18441 2013-04-07 21:05:05

相关问题