Логнормальные случайные числа в определенном диапазоне в Matlab
Я хочу разработать логнормальное распределение с диапазоном [0.42,1.19], несколько элементов которого представлены как D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42]
, Среднее должно быть 0.84
и стандартное отклонение как можно меньше. Также с учетом того, что 90% cdf (=90% зерна) лежит между 0.59 and 1.19
,
Как только я знаю все элементы этого логнормального распределения, которые включают в себя данные условия, я могу найти его pdf, который мне и нужен. Вот простые шаги, которые я попробовал:
D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42];
s=0.30; % std dev of the lognormal distribution
m=0.84; % mean of the lognormal distribution
mu=log(m^2/sqrt(s^2+m^2)); % mean of the associated normal dist.
sigma=sqrt(log((s^2/m^2)+1)); % std dev of the associated normal dist.
[r,c]=size(D);
for i=1:c
D_normal(i)=mu+(sigma.*randn(1));
w(i)=(D_normal(i)-mu)/sigma; % the probability or the wt. percentage
end
sizes=exp(D_normal);
2 ответа
Если у вас есть набор инструментов статистики и вы хотите извлечь случайные значения из логнормального распределения, вы можете просто вызвать LOGNRND. Если вы хотите узнать плотность логнормального распределения с заданным средним значением и сигмой при определенном значении, используйте LOGNPDF.
Поскольку вы рассчитываете вес, вы можете искать плотность. В вашем примере это будет:
weights = lognpdf([1.19,1.00,0.84,0.71,0.59,0.50,0.42],0.84,0.3)
weights =
0.095039 0.026385 0.005212 0.00079218 6.9197e-05 5.6697e-06 2.9244e-07
РЕДАКТИРОВАТЬ
Если вы хотите узнать, какой процент зерен попадает в диапазон от 0,59 до 1,19, используйте LOGNCDF:
100*diff(logncdf([0.59,1.19],0.84,0.3))
ans =
1.3202
Это не много. Если вы построите график распределения, вы заметите, что логнормальное распределение с вашими значениями достигает пика чуть выше 2
x = 0:0.01:10;
figure
plot(x,lognpdf(x,0.84,0.3))
Похоже, что вы ищете, чтобы генерировать усеченные логнормальные случайные числа. Если мое предположение верно, вы можете использовать выборку отклонения или выборку с обратным преобразованием для генерации необходимых выборок. Предостережение: выборка отклонения очень неэффективна, если ваши границы очень далеки от среднего.
Отбор проб
Если x ~ LogNormal(mu,sigma) I(lb Затем сгенерируйте x ~ LogNormal (mu, sigma) и примите ничью, если lb Выборка обратного преобразования Если x ~ LogNormal(mu,sigma) I(lb CDF(x) = фи ((log(x) - му)/ сигма) /(фи ((log(ub) - му)/ сигма) - фи ((log (фунт) - му)/ сигма)) Генерация, U ~ Uniform(0,1). Установите CDF(x) = u и инвертируйте для x. Другими словами, x = exp (mu + сигма * phi_inverse( u * (фи ((log(ub) - му)/ сигма) - phi((log(lb) - му)/ сигма))))