我试图使用Sympy来建模信号检测问题,并且需要两个随机变量。一个用瑞利分布来模拟噪声,另一个用Rician分布来模拟信号+噪声。 Sympy provides a Rayleigh distribution,但不是Rician--或者至少不是那个名字。如何创建一个Rician随机变量?
创建一个最好的方法是什么?它是否以不同的名字存在?有没有办法将现有的发行版操作为Rician?
在从@asmeurer的建议,我已经实现了我自己的莱斯分布,像这样:
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))
分布似乎同时匹配Wikipedia和Scipy,但奇怪的是我得到不同的结果比Scipy。我会分开问这个问题(asked and answered)。
作为一个侧面说明,以下行能够lambdify密度函数,其中包括贝塞尔函数:
printing.lambdarepr.LambdaPrinter._print_besseli=(lambda self,expr: 'i0(%s)'%expr.argument)
这不是推广到所有的贝塞尔函数,而是适用于零阶修正贝塞尔在Rician分布中使用的第一种类型。
也许形式_X = ContinuousRV(x,exp( - (x - mean)** 2 /(2 * std ** 2))/(sqrt(2 * pi)* std))_更容易编写,参数化不受支持。 –