Само да допуним горњу причицу једним примером, да не буде да лупам у празну шерпу.
Пробаћу да набодем шта ти је потребно, мада то није тако добро дефинисано.
Претпостављам да је густина расподеле g(x) на интервалу (f,t) (from->to) таква да је
g(t) = n * g(f), што је отприлике оно што си рекао горе. Једино је фактор мало другачији јер је инверз мултипликативан а не адитиван као у твом случају. Тојест, обрнути случај од n = 3 добио би се са n' = 1/3, а не са n = -3. Али то ваљда није неки проблем.
Претпоставићу да је интерполација између крајњих тачака линеарна. Овај део ниси навео у поставци, тако да провери да ли ти одговара. Тада је:
g(x) = { 0, x < f; ax + b, x E [f, t]; 0, x > t
Треба нам да одредимо a и b у функцији од n да бисмо добили g(x). Онда ћемо да инвертујемо g(x) и то је оно што нам треба.
Линеарном интерполацијом се добија да је:
a = (n-1) / (t-f) * q
b = (t - nf) / (t-f) * q
што су вредности које добијете ако протурите праву ax+b кроз тачке: (f, q) и (t, nq). Овде нам је n параметар кога задаје корисник, а q мора да се одреди из интегралног услова за расподелу.
Пошто g(x) мора да задовољи интегрални услов за расподелу да је \int_{-\infty}^{+\infty} = 1, интеграљењем функције g(x) по целом домену добије се:
q = 2/[(n+1)(t-f)]
(паде ми напамет мало касније па да допуним: вредност за q добио сам формално интеграљењем, али може да се добије и на бржи начин тако што се уочи да је средња вредност функције тачно на средини интервала. Штос је сличан ономе ког је Гаус искористио да срачуна брзо збир свих бројева од 1 до 100)
Сада треба да пређемо на функцију расподеле G(x). По дефиницији,
G(x) = \int_{\infty}^x g(x) dx
а интеграљењем део по део у овом случају добија се:
G(x) = { 0, x< f; a/2(x^2-f^2) + b(x-f), x \in [f, t]; 1, x > t
Налажењем инверза G^{-1}(x) добија се, за интервал [0,1] ово:
G^{-1}(y) = H(y) = 1/a * ( -b + \sqrt{ b^2 + 2a(a/2 f^2 + bf)})
где су нам све величине или познате од пре, или зависе од параметра n.
H(y) је у ствари функција и од параметра n, па ћу да забележим: H(y; n).
И сад је лако.
Ако имаш функцију rand() која генерише реални број од 0 до 1 са униформном расподелом, радиш следеће:
u = rand();
y = H(u; n)
И број y је извучен тачно из расподеле коју си хтео.
ф
__________________
Рад је створио човека. Рад ће га и уништити.
Poslednja izmena od filmil : 26. 04. 2007. u 02:43.
|