# Marja de eroare pentru comparatii pe numere reale. EPSILON <- 10e-9 CONST_DISP <- 5 # De cate ori verificam sa fie PDF pe fiecare interval al functiei date. TESTS <- 500 equalToOne <- function (x) { return (x < 1 + EPSILON & x > 1 - EPSILON) } calcIntegralSum <- function (myFunc, domain) { sum <- 0 for (i in domain) sum <- sum + integrate (Vectorize (myFunc), i[1], i[2])$value return (sum) } # Ca o functie sa fie densitate de probabilitate trebuie sa fie pozitiva, iar integrala ei pe R sa fie 1. checkDensProb <- function (myFunc, domain = list (c (-Inf, Inf)), constNorm = 1) { tryCatch ( { # Calculam suma integralelor, similar cu cerinta 1. integralSum <- calcIntegralSum (myFunc, domain) # Comparam cu 1 folosindu-ne de EPSILON. if (equalToOne (integralSum / constNorm)) { # Pentru fiecare interval al functiei, verificam daca este PDF. for (i in domain) { # Verificam intervalul [st, dr]. st <- max(i[1], -2e9) dr <- min(i[2], 2e9) length <- dr / CONST_DISP - st / CONST_DISP nrs <- runif (TESTS, st, dr-length) # Testam TESTS subintervale de lungime egala. for (mn in nrs) { mx = mn + length # Daca integrala este negativa, functia nu este PDF. if (integrate (Vectorize (myFunc), mn, mx)$value < 0) return (FALSE) } } return (TRUE) } return (FALSE) }, error = function (e) { # Daca integrarea a esuat, returnam false. return (FALSE) }) }