Genera numeri casuali dalla "distribuzione uniforme inclinata" dalla teoria matematica


9

Per qualche motivo, ho bisogno di generare numeri casuali (dati) dalla distribuzione "uniforme inclinata". La "pendenza" di questa distribuzione può variare in un intervallo ragionevole, e quindi la mia distribuzione dovrebbe cambiare da uniforme a triangolare in base alla pendenza. Ecco la mia derivazione:

inserisci qui la descrizione dell'immagine

Rendiamolo semplice e generiamo i dati da a B (blu, rosso è distribuzione uniforme). Per ottenere la funzione di densità di probabilità della linea blu ho bisogno solo dell'equazione di quella linea. Così:0B

f(x)=tg(φ)x+Y(0)

e poiché (immagine):

tg(φ)=1/BY(0)B/2Y(0)=1Btg(φ)B2

Abbiamo quello:

f(x)=tg(φ)x+(1Btg(φ)B2)

f(x)

F(x)=tg(φ)x22+x(1Btg(φ)B2)

φ,Bx(0,1)φ,Bti(0,1)xix

tg(φ)xi22+xi(1Btg(φ)B2)ti=0

Da questa teoria ho creato il codice in Python che assomiglia a:

import numpy as np
import math
import random
def tan_choice():
    x = random.uniform(-math.pi/3, math.pi/3)
    tan = math.tan(x)
    return tan

def rand_shape_unif(N, B, tg_fi):
    res = []
    n = 0
    while N > n:
        c = random.uniform(0,1)
        a = tg_fi/2
        b = 1/B - (tg_fi*B)/2
        quadratic = np.poly1d([a,b,-c])
        rots = quadratic.roots
        rot = rots[(rots.imag == 0) & (rots.real >= 0) & (rots.real <= B)].real
        rot = float(rot)
        res.append(rot)
        n += 1
    return res

def rand_numb(N_, B_):
    tan_ = tan_choice()
    res = rand_shape_unif(N_, B_, tan_)
    return res

Ma i numeri generati da rand_numbsono molto vicini a zero o a B (che ho impostato come 25). Non vi è alcuna variazione, quando generi 100 numeri, tutti sono vicini a 25 o tutti vicini a zero. In una volta:

num = rand_numb(100, 25)
numb
Out[140]: 
[0.1063241766836174,
 0.011086243095907753,
 0.05690217839063588,
 0.08551031241199764,
 0.03411227661295121,
 0.10927087752739746,
 0.1173334720516189,
 0.14160616846114774,
 0.020124543145515768,
 0.10794924067959207]

Quindi ci deve essere qualcosa di molto sbagliato nel mio codice. Qualcuno può aiutarmi con la mia derivazione o codice? Sono pazzo di questo ora, non vedo alcun errore. Suppongo che il codice R mi darà risultati simili.


2
ϕxBxBtheta11nRx<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)

Risposte:


9

(0,B)

B2tanϕ<2.
B=25ϕ±tan12625

Bx

F(x)=t
F(x)=12tanϕx2+(1BB2tanϕ)x.
F(0)=0F(B)=1F(0,B)

tanϕ>0

x=1tanϕ(B2tanϕ1B+(B2tanϕ1B)2+2tanϕt.)
tanϕ<0tanϕ+Δ

Ecco un po 'di codice R.

phi <- pi/8; B <- 2
f <- function(t) (-(1/B - 0.5*B*tan(phi)) + 
       sqrt( (1/B - 0.5*B*tan(phi))**2 + 2 * tan(phi) * t))/tan(phi)
hist(f(runif(1e6)))

istogramma 1

ϕ<0

phi <- -pi/8
hist(f(runif(1e6)))

inserisci qui la descrizione dell'immagine


1
F(x)

ϕB
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.