matlab - 如何从受来自单独概率分布的另一个随机值约束的分布中生成随机值?
问题描述
我有两个概率分布,一个 beta 分布和一个对数正态分布。我想要做的是从我的 beta 分布中绘制一个随机值,并根据该值在标准偏差范围内的位置,然后我还想从我的对数正态分布中绘制一个随机值,该值也在该标准偏差范围内范围。
例如:我从我的 beta 分布中得出 0.2,它高于一个标准差,但低于比平均值大两个标准差。然后我想从我的对数正态分布中生成一个随机值,该值被限制在我的第一个标准偏差和第二个标准偏差的范围之间(比如说,一个介于 100 和 1000 之间的值)。
标准差范围如下:在1个标准差以内,大于1个标准差但比平均值高出2个标准差,大于平均值2个标准差,小于1个标准差但比平均值低2个标准差均值,并且低于均值的两个标准差。
我在 MATLAB 中尝试使用我的代码:
1) 对于每次迭代,生成一个随机的 beta 分布值和一个随机的对数正态分布值。2) 如果 beta 值在指定的标准差范围内,并且对数正态值也在指定的标准差范围内,则结束循环并打印数组中的值
我遇到的问题是随机 beta 值生成得非常好,但是对于每个对数正态值,我只剩下代码经历了哪个迭代的值。
数组看起来像:
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。
解决方案
在 for 循环之前,您定义了Perm = [1:300,1];
,因此当所有 if 条件都未命中时,您将获得原始值,即迭代的索引。这是可能的,因为你不能确保你的两个随机数放在同一个盒子里,对吧?
如果您希望重新生成直到permRandom
达到相同的时间间隔porRandom
,您应该在 for-loop 中使用另一个循环,如下所示:
...
porRandom=***;
while true
permRandom=***
if ****
Perm(i) = permRandom;
break
end
end
***your print the good result
所以只有当你把两个放在同一个盒子里时,它才会打破循环并继续打印。
与您的问题无关的事情:您在 if-end 中的每个操作都是相同的。可以合并为一个。
推荐阅读
- linux - 反转多个 SED 命令
- javascript - 使用 Javascript 修改页面上的一些 href 链接
- wpf - WPF C#如何通过代码创建派生样式
- r - 如何解决 R 代码中的单词重音问题
- eclipse-plugin - 如何获取 IProgressMonitor 的实例?
- vhdl - 为测试台生成具有比率的时钟
- django - 更改一个模型中的字段,同时在管理员中自动在另一个模型中添加条目
- javascript - 如何在 flatpickr-day 元素上添加双击事件
- c++ - 不使用 /NODEFAULTLIB 调用构造函数
- html - 如何动态地将 HTML 元素附加到 Vue.js 中的组件