Логнормальные случайные числа в определенном диапазоне в 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) - му)/ сигма))))

Другие вопросы по тегам