【发布时间】: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 1或ans = logical 0打印到您的命令窗口。
标签: matlab if-statement probability distribution