均值不变时的指数
Index when mean is constant
我对 matlab 比较陌生。我找到了一组具有均值和标准差的 1E6 个随机数的连续均值。最初计算出的平均值波动,然后收敛到某个值。
我想知道均值收敛的索引(即第 100 个位置)。我不知道该怎么做。
我尝试使用逻辑运算符,但我必须通过 1e6 个数据点。即便如此,我仍然找不到索引。
Y_c= sigma_c * randn(n_r, 1) + mu_c; %Random number creation
Y_f=sigma_f * randn(n_r, 1) + mu_f;%Random number creation
P_u=gamma*(B*B)/2.*N_gamma+q*B.*N_q + Y_c*B.*N_c; %Calculation of Ultimate load
prog_mu=cumsum(P_u)./cumsum(ones(size(P_u))); %Progressive Cumulative Mean of system response
logical(diff(prog_mu==0)); %Find index
我怀疑问题在于均值永远不会真正保持不变,而是会围绕 "true mean" 波动。因此,您很可能永远不会遇到累积平均值的两个连续值相同的情况。您应该做的是确定一些阈值,低于该阈值您认为平均值的波动近似为零,并将累积平均值的差异与该值进行比较。例如:
epsilon = 0.01;
const_ind = find(abs(diff(prog_mu))<epsilon,1,'first');
其中 epsilon 将是您选择的阈值。 find
命令将 return 累积平均值的变化首次低于该阈值的索引。
编辑:正如所指出的,如果生成前几个随机数使得它们之间的差异小于 epsilon 值,则此方法可能会失败,但是尚未收敛。那么我想建议一个不同的方法。
我们像以前一样计算累积均值,如下所示:
prog_mu=cumsum(P_u)./cumsum(ones(size(P_u)));
我们也像以前一样计算这些累积平均值的差异:
df_prog_mu = diff(prog_mu);
现在,为确保已实现转换,我们找到累积均值低于阈值的第一个索引 epsilon
和 所有后续均值也低于阈值。换句话说,我们想要找到数组中 last 位置之后的索引,其中累积平均值 高于 阈值:
conv_index = find(~df_prog_mu,1,'last')+1;
这样做,我们保证索引处的值以及所有后续值都收敛到您预定的阈值以下。
我无法想象平均值会突然在单个索引处变得恒定。它不会渐近地接近一个常数值吗?我会推荐一个 for 循环来计算平均值(听起来你可能已经完成了这一部分?)像这样:
avg = [];
for k=1:length(x)
avg(k) = mean(x(1:k));
end
然后绘制连续平均值:
plot(avg)
hold on % this will allow us to plot more data on the same figure later
如果您试图找到连续均值落在真实均值一定范围内的点,试试这个:
Tavg = 5; % or whatever your true mean is
err = 0.01; % the range you want the consecutive mean to reach before we say that it "became constant"
inRange = avg>(Tavg-err) & avg<(Tavg+err); % gives you a binary logical array telling you which values fell within the range
q = 1000; % set this as high as you can while still getting a value for consIndex
constIndex = [];
for k=1:length(inRange)
if(inRange(k) == sum(inRange(k:k+q))/(q-1);)
constIndex = k;
end
end
下面的答案采用了类似的方法,但做了一个不安全的假设,即第一个落入该范围内的值是函数开始收敛的值。任何值都可能随机落在该范围内。我们需要确保以下值也落在该范围内。在上面的代码中,您可以编辑 "q" 和 "err" 来优化您的结果。我建议通过绘图仔细检查它。
plot(avg(constIndex), '*')
我对 matlab 比较陌生。我找到了一组具有均值和标准差的 1E6 个随机数的连续均值。最初计算出的平均值波动,然后收敛到某个值。 我想知道均值收敛的索引(即第 100 个位置)。我不知道该怎么做。
我尝试使用逻辑运算符,但我必须通过 1e6 个数据点。即便如此,我仍然找不到索引。
Y_c= sigma_c * randn(n_r, 1) + mu_c; %Random number creation
Y_f=sigma_f * randn(n_r, 1) + mu_f;%Random number creation
P_u=gamma*(B*B)/2.*N_gamma+q*B.*N_q + Y_c*B.*N_c; %Calculation of Ultimate load
prog_mu=cumsum(P_u)./cumsum(ones(size(P_u))); %Progressive Cumulative Mean of system response
logical(diff(prog_mu==0)); %Find index
我怀疑问题在于均值永远不会真正保持不变,而是会围绕 "true mean" 波动。因此,您很可能永远不会遇到累积平均值的两个连续值相同的情况。您应该做的是确定一些阈值,低于该阈值您认为平均值的波动近似为零,并将累积平均值的差异与该值进行比较。例如:
epsilon = 0.01;
const_ind = find(abs(diff(prog_mu))<epsilon,1,'first');
其中 epsilon 将是您选择的阈值。 find
命令将 return 累积平均值的变化首次低于该阈值的索引。
编辑:正如所指出的,如果生成前几个随机数使得它们之间的差异小于 epsilon 值,则此方法可能会失败,但是尚未收敛。那么我想建议一个不同的方法。
我们像以前一样计算累积均值,如下所示:
prog_mu=cumsum(P_u)./cumsum(ones(size(P_u)));
我们也像以前一样计算这些累积平均值的差异:
df_prog_mu = diff(prog_mu);
现在,为确保已实现转换,我们找到累积均值低于阈值的第一个索引 epsilon
和 所有后续均值也低于阈值。换句话说,我们想要找到数组中 last 位置之后的索引,其中累积平均值 高于 阈值:
conv_index = find(~df_prog_mu,1,'last')+1;
这样做,我们保证索引处的值以及所有后续值都收敛到您预定的阈值以下。
我无法想象平均值会突然在单个索引处变得恒定。它不会渐近地接近一个常数值吗?我会推荐一个 for 循环来计算平均值(听起来你可能已经完成了这一部分?)像这样:
avg = [];
for k=1:length(x)
avg(k) = mean(x(1:k));
end
然后绘制连续平均值:
plot(avg)
hold on % this will allow us to plot more data on the same figure later
如果您试图找到连续均值落在真实均值一定范围内的点,试试这个:
Tavg = 5; % or whatever your true mean is
err = 0.01; % the range you want the consecutive mean to reach before we say that it "became constant"
inRange = avg>(Tavg-err) & avg<(Tavg+err); % gives you a binary logical array telling you which values fell within the range
q = 1000; % set this as high as you can while still getting a value for consIndex
constIndex = [];
for k=1:length(inRange)
if(inRange(k) == sum(inRange(k:k+q))/(q-1);)
constIndex = k;
end
end
下面的答案采用了类似的方法,但做了一个不安全的假设,即第一个落入该范围内的值是函数开始收敛的值。任何值都可能随机落在该范围内。我们需要确保以下值也落在该范围内。在上面的代码中,您可以编辑 "q" 和 "err" 来优化您的结果。我建议通过绘图仔细检查它。
plot(avg(constIndex), '*')