2012-02-11 3 views
1

Я попытался создать треугольное распределение вероятности в Matlab, но не был успешным. Я использовал формулу по адресу http://en.wikipedia.org/wiki/Triangular_distribution.Создание треугольного распределения в Matlab

n = 10000000; 

a = 0.2; 
b = 0.7; 
c = 0.5; 

u = sqrt(rand(n, 1)); 

x = zeros(n, 1); 
for i = 1:n 
    U = u(i); 
    if U < (c-a)/(b-a) 
     X = a + sqrt(U*(b-a)*(c-a)); 
    else 
     X = b - sqrt((1-U)*(b-a)*(b-c));   
    end 
    x(i) = X; 
end 

hist(x, 100); 

Гистограмма выглядит так:

enter image description here

Не выглядит как большая часть треугольника ко мне. В чем проблема? Я злоупотребляю rand(n)?

ответ

5

Вы можете добавить два равномерных распределения, графы распределения свернутся, и вы получите треугольное распределение.

простой для понимания пример: прокатки две кости, каждое действие имеет равномерное распределение, чтобы привести к ряду из 1-6, комбинированное действие имеет треугольное распределение, чтобы привести к ряду 2-12

редактирования: минимальный рабочий пример:

a=randint(10000,1,10); 
b=randint(10000,1,10); 

c=a+b; 

hist(c,max(c)-min(c)+1) 

edit2: снова посмотрел ваш сценарий. Это работает, но вы сделали одну ошибку:

u = sqrt(rand(n, 1)); 

должен быть

u = rand(n, 1); 

Edit3: оптимизированный код

n = 10000000; 

a = 0.2; 
b = 0.7; 
c = 0.5; 

u = rand(n, 1); 
x = zeros(n, 1); 

idx = find(u < (c-a)/(b-a)); 
x(idx) = a + sqrt(u(idx)*(b-a)*(c-a)); 
idx =setdiff(1:n,idx); 
x(idx) = b - sqrt((1-u(idx))*(b-a)*(b-c)); 
hist(x, 100); 

+0

Ну, это было глупо от меня. Благодаря! – Superbest

+1

Сумма двух мундиров - самый простой способ сделать это. Однако вы также можете инвертировать CDF, для чего требуется только один вызов rand, но немного больше математики. –

+1

Да, сумма двух мундиров проще всего, но это полезно только для симметричного треугольного распределения. Код в topicstart допускает любую треугольную форму. Кстати, я считаю, что вы все еще можете оптимизировать этот код, используя логическую индексацию, чтобы удалить цикл. –

1

Изменить

u = sqrt(rand(n, 1)); 

в

u = rand(n, 1); 

Хорошая вещь об этой формуле является то, что вы можете распространять выборку из общего распределения треугольника с одной случайной выборки.

Смежные вопросы