Como criar uma variável aleatória riciana?
Estou tentando modelar um problema de detecção de sinal usando o Sympy e preciso de duas variáveis aleatórias. Um com uma distribuição Rayleigh para modelar o ruído, e outro com uma distribuição riciana para modelar o sinal + ruído. Sympyfornece uma distribuição Rayleigh, mas não um romeno-- ou pelo menos não um com esse nome.
Qual é a melhor maneira de criar uma? Existe sob um nome diferente? Existe uma maneira de manipular distribuições existentes em um riciano?
Seguindo o conselho do @asmeurer, implementei minha própria distribuição Rice, da seguinte maneira:
from sympy.stats.crv_types import rv
from sympy.stats.crv import SingleContinuousDistribution
class RicianDistribution(SingleContinuousDistribution):
_argnames=('nu','sigma')
@property
def set(self): return Interval(0,oo)
def pdf(self,x):
nu,sigma=self.nu, self.sigma
return (x/sigma**2)*exp(-(x**2+nu**2)/(2*sigma**2))*besseli(0,x*nu/sigma**2)
def Rician(name,nu,sigma):
return rv(name,RicianDistribution,(nu,sigma))
A distribuição parece combinar ambosWikipedia eScipy, mas, estranhamente, estou obtendo resultados diferentes do Scipy. Vou fazer essa pergunta separadamente (perguntou e respondeu)
Como observação lateral, a linha a seguir possibilita identificar a função de densidade, que inclui uma função Bessel:
printing.lambdarepr.LambdaPrinter._print_besseli=(lambda self,expr: 'i0(%s)'%expr.argument)
Não é generalizado para todas as funções de Bessel, mas funciona para o Bessel modificado de ordem zero do primeiro tipo usado na distribuição riciana.