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.

questionAnswers(2)

yourAnswerToTheQuestion