Как я могу сгенерировать случайное значение из распределения, которое ограничено другим случайным значением из отдельного распределения вероятности? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть два распределения вероятностей: бета-распределение и логнормальное распределение.Я хочу нарисовать случайное значение из моего бета-распределения и исходя из того, где это значение находится в диапазоне стандартного отклонения, тогда я также хочу извлечь случайное значение из моего логнормального распределения, которое также находится в пределах этого стандартного отклоненияспектр.

Например: я беру 0,2 из моего бета-распределения, которое выше одного стандартного отклонения, но ниже двух стандартных отклонений больше среднего.Затем я хочу сгенерировать случайное значение из моего логнормального распределения, которое ограничено диапазоном моего первого стандартного отклонения и второго стандартного отклонения (скажем, значение между 100 и 1000).

Диапазоны стандартного отклоненияследующим образом: в пределах одного стандартного отклонения более одного стандартного отклонения, но менее двух стандартных отклонений выше среднего, более двух стандартных отклонений выше среднего, менее одного стандартного отклонения, но более двух стандартных отклонений ниже среднего и менеедва стандартных отклонения ниже среднего.

То, что я пытался с моим кодом в MATLAB:

1) Для каждой итерации генерируйте случайное значение бета-распределения и случайное логнормальное значение распределения.2) Если бета-значение находится в указанном диапазоне стандартного отклонения, а логнормальное значение также находится в указанном диапазоне стандартного отклонения, завершите цикл и напечатайте значения в массиве

Проблема, с которой я сталкиваюсь, заключается вчто случайное бета-значение генерируется совершенно нормально, но для каждого логнормального значения мне остается значение, по которому итерация кода прошла.

массив выглядит так:

0.1    1
0.12   2
0.05   3
0.07   4
.......

Вот мой код:

close all;
clc;


d= xlsread('Poro perm data for Clarke Lake.xlsx');                                                                               
pdPor = d(:,2);
pdPerm = d(:,8);
porosity_permeability = []; % openspace for array
temp=[];
Perm = [1:300,1];
for i=1:300
    porRandom = betarnd(3.1800,44.87,[1 1]);
    mu=1.0130;
    sigma = 2.574;

    permRandom =lognrnd(mu,sigma);

    if porRandom <=(mean(pdPor) + std(pdPor)) && porRandom >= (mean(pdPor) - std(pdPor))                           

        if permRandom <=(mean(pdPerm) + std(pdPerm)) && permRandom >= (mean(pdPer) - std(pdPer)) 
            Perm(i) = permRandom; 
        end
    elseif porRandom < (mean(pdPor) - (std(pdPor))) && porRandom > (mean(pdPor) - ((std(pdPor))*2))                 

           if permRandom < (mean(pdPerm) - (std(pdPerm))) && permRandom > (mean(pdPerm) - ((std(pdPerm))*2)) 

              Perm(i) = permRandom; 
           end
    elseif porRandom < (mean(pdPor) - (((std(pdPor))*2)))                                              


           if permRandom < (mean(pdPerm) - (((std(pdPerm))*2)))  
              Perm(i) = PermRandom;
           end
    elseif porRandom > (mean(pdPor) + (std(pdPor))) && porRandom < (mean(pdPor) + ((std(pdPor))*2))         

            if permRandom > (mean(pdPerm) + (std(pdPerm))) && permRandom < (mean(pdPerm) + ((std(pdPerm))*2))
                Perm(i) = permRandom;
            end
    else porRandom > ((mean(pdPor)) + (((std(pdPor))*2)))                                        

            if permRandom > ((mean(pdPerm)) + (((std(pdPerm))*2)))   
                Perm(i) = permRandom;
            end
    end

    temp=[porRandom, Perm(i)]; % temporary space
    porosity_permeability=[porosity_permeability;temp]; 

end

Спасибо за внимание к моей проблеме!Я прошу прощения, если мое объяснение и терминология неубедительны.Я только учусь кодированию и MATLAB.

1 Ответ

0 голосов
/ 07 мая 2019

Перед циклом for вы определили Perm = [1:300,1];, поэтому, когда все условия if пропущены, вы получите исходное значение, то есть индекс вашей итерации. Это возможно, потому что вы не можете гарантировать, что ваши два случайных числа выпадут в одном поле, верно?

Если вы ожидаете регенерацию до тех пор, пока permRandom не достигнет того же интервала porRandom, вы должны использовать другой цикл внутри цикла for, например:

...
porRandom=***;
while true
  permRandom=***
  if ****
    Perm(i) = permRandom;
    break
  end
end
***your print the good result

Таким образом, только если вы получите два в одном поле, он разорвёт цикл и продолжит печатать.


Что-то не в вашем вопросе: все ваши операции внутри if-end одинаковы. Можно объединить в одну.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...