【问题标题】:I am trying to generate two values from probability distributions, but one distribution is not generating values correctly我试图从概率分布中生成两个值,但一个分布没有正确生成值
【发布时间】:2019-07-22 15:10:56
【问题描述】:

我正在从 beta 概率分布中生成一个随机值。根据该值在标准偏差方面的位置,我想从对数正态分布中选择一个随机值,该值也位于相同的标准偏差范围内。

beta 分布值不会产生问题,但对数正态值很少会产生一个值(在 300 次迭代中可能只有一次或两次)。不完全确定为什么会发生这种情况,这可能是我对 MATLAB 和一般编码的基本了解的结果。非常感谢您的帮助!

基本上,我创建了一系列 if 和 and 语句来检查随机 beta 分布值的位置,如果它在某个标准偏差范围内,那么代码会检查随机对数正态值是否在同一范围内.如果它们在同一范围内,则代码结束,否则代码重复。但是对于最终数组中的大多数(如果不是全部)对数正态值,我得到 0。

close all;
clc;


d= xlsread('Poro perm data for Clarke Lake.xlsx');                                                                               
pdPor = d(:,2);
pdPerm = d(:,5);

meanPor = mean(pdPor);
stdPor = std(pdPor);

meanPerm = mean(pdPerm);
stdPerm = std(pdPerm);

porosity_permeability = zeros(300,2); % openspace for array
temp=[];
%Perm = [1:300,1];
Perm = zeros(1,300);
for i=1:300
    porRandom = betarnd(3.1800,44.87,[1 1]);
    por(i) = porRandom;

    mu=1.0130;
    sigma = 2.574;
    permRandom =lognrnd(mu,sigma);

    if porRandom <=( meanPor + stdPor) && porRandom >= (meanPor - stdPor)                           

        if permRandom <= (meanPerm + stdPerm) && permRandom >= (meanPerm - stdPerm) 
            Perm(i) = permRandom; 
        end
    elseif porRandom < (meanPor - stdPor) && porRandom > (meanPor - stdPor*2)                 

           if permRandom < (meanPerm - stdPerm) && permRandom > (meanPerm - stdPerm*2) 

              Perm(i) = permRandom; 
           end
    elseif porRandom < (meanPor - stdPor*2)                                              


           if permRandom < (meanPerm - stdPerm*2)  
              Perm(i) = permRandom;
           end
    elseif porRandom > (meanPor + stdPor) && porRandom < (meanPor + stdpdPor*2)         

            if permRandom > (meanPerm + stdPerm) && permRandom < (meanPerm + stdPerm*2)
                Perm(i) = permRandom;
            end
    else porRandom > (meanPor + stdPor*2)                                        

            if permRandom > (meanPerm + stdPerm*2)   
                Perm(i) = permRandom;
            end
    end


end

% CONCATENATED ARRAYS
porosity_permeability=cat(1,por,Perm);

如前所述,我希望我的最终结果是一个 2x300 矩阵,第一行是 beta 值,第二行是对数正态值。 Beta 值生成得非常好,但对数正态值大部分为 0,只有少数运行产生正确的值。

【问题讨论】:

  • 您最后的else 是错误的。要么它应该是一个带有条件的elseif,要么不应该有任何条件,因为else 是“如果之前的每个条件都是错误的,那么就这样做”故障安全。每当点击此子句时,您应该会看到 ans logical 1ans = logical 0 打印到您的命令窗口。

标签: matlab if-statement probability distribution


【解决方案1】:

我相信我已经找到了您的问题。您将Perm 向量初始化为全零,并且根据循环内的逻辑块,如果内部if 语句为假,则无法更新索引i 处的“Perm”。由于您处于 for 循环中,因此您将继续进行下一次迭代,例如 i = i+1 ,因此最后一个索引处的 Perm 永远无法更新。而是使用 while 循环并将迭代器设置为仅当您的内部 if 语句为真时前进一。现在,您可以保证继续循环,直到您完成更新“Perm”向量的所有索引。她是更新的循环

i =1;
while i<=300
    porRandom = betarnd(3.1800,44.87,[1 1]);
    por(i) = porRandom;

    mu=1.0130;
    sigma = 2.574;
    permRandom =lognrnd(mu,sigma);

    if porRandom <=( meanPor + stdPor) && porRandom >= (meanPor - stdPor)                           

        if permRandom <= (meanPerm + stdPerm) && permRandom >= (meanPerm - stdPerm) 
            Perm(i) = permRandom;
            i= i+1;
        end
    elseif porRandom < (meanPor - stdPor) && porRandom > (meanPor - stdPor*2)                 

           if permRandom < (meanPerm - stdPerm) && permRandom > (meanPerm - stdPerm*2) 
              Perm(i) = permRandom;
              i= i+1;
           end
    elseif porRandom < (meanPor - stdPor*2)                                              


           if permRandom < (meanPerm - stdPerm*2)  
              Perm(i) = permRandom;
              i= i+1;
           end
    elseif porRandom > (meanPor + stdPor) && porRandom < (meanPor + stdpdPor*2)         

            if permRandom > (meanPerm + stdPerm) && permRandom < (meanPerm + stdPerm*2)
                Perm(i) = permRandom;
                i= i+1;
            end
    elseif porRandom > (meanPor + stdPor*2)                                        

            if permRandom > (meanPerm + stdPerm*2)   
                Perm(i) = permRandom;
                i= i+1;
            end
    end


end

【讨论】:

  • 您好,首先非常感谢您。对数正态值似乎正确生成。不过,似乎还是有问题。生成的每个 porRandom 介于 0.2 - 0.28 之间,这些值可能比平均值高 +2 个标准差。值范围应该更像 0.01 - 0.28(平均值为 0.07)。这是仅选择了最后一个 elseif 语句 (elseif porRandom > (meanPor + stdPor*2)) 的结果吗?如果我的术语不正确,我深表歉意,我仍在学习。谢谢!
  • 我没有关注你的问题。 porRandom 的值是从具有您指定参数的 beta 分布中提取的,beta 分布的采样输出产生的范围为 0 到 0.2。你说的是什么意思?
  • 对不起,让我换个说法。 beta 分布包含从 0.01 到 0.28 的值范围,但是,数组中 porRandom 的输出仅包含 ~ 0.2 - 0.28 的值。我应该期望最终数组中的值在 0.01 到 0.28 之间,而不仅仅是 0.2 到 0.28 之间的高值。那有意义吗? (再一次,如果我说得不对,我深表歉意)。
猜你喜欢
  • 1970-01-01
  • 2010-10-23
  • 2017-09-26
  • 2016-02-17
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2019-06-21
  • 2019-09-21
相关资源
最近更新 更多