Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 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)
- })
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement