Индекс, когда среднее постоянное - PullRequest
0 голосов
/ 22 сентября 2019

Я относительно новичок в Matlab.Я нашел последовательное среднее из набора случайных чисел 1E6, которое имеет среднее значение и стандартное отклонение.Первоначально рассчитанное среднее колеблется, а затем сходится к определенному значению.Я хотел бы знать индекс (то есть сотую позицию), в котором сходится среднее.Я понятия не имею, как это сделать.

Я пытался использовать логический оператор, но мне нужно пройти через 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

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Я подозреваю, что проблема заключается в том, что среднее значение никогда не будет постоянным, а скорее будет колебаться вокруг «истинного среднего».Таким образом, вы, скорее всего, никогда не столкнетесь с ситуацией, когда два последовательных значения совокупного среднего значения идентичны.Что вы должны сделать, это определить некоторое пороговое значение, ниже которого вы считаете, что флуктуации среднего значения примерно равны нулю, и сравнить разницу кумулятивного среднего с этим значением.Например:

epsilon = 0.01;
const_ind = find(abs(diff(prog_mu))<epsilon,1,'first');

где epsilon будет пороговым значением, которое вы выберете.Команда find возвратит индекс, при котором изменение совокупного среднего значения сначала падает ниже этого порогового значения.

EDIT : как было указано, этот метод может потенциально завершиться неудачей, еслиПервые несколько случайных чисел генерируются таким образом, что разница между ними меньше значения эпсилона, но еще не сходятся.Тогда я хотел бы предложить другой подход.

Мы рассчитываем совокупные средние, как и раньше, примерно так:

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;

Inтем самым мы гарантируем, что значение индекса и все последующие значения сошлись ниже заданного вами порогового значения.

0 голосов
/ 22 сентября 2019

Я бы не подумал, что среднее значение вдруг станет постоянным по одному индексу.Разве это не асимптотически приближается к постоянному значению?Я бы рекомендовал цикл 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), '*')
...