MATLAB的Legendre函数的Python等价物

2024-04-19 21:56:24 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在尝试用Python分析时间序列数据。作为这样做的指导方针,我将自己定位在一个MATLAB脚本上,它几乎可以完成我想做的所有事情。到目前为止,它运行得很好,但现在我遇到了这个在脚本中使用的Legendre多项式。在

我尝试了它的NumPy implementation,但是我找不到(或多或少)产生与the MATLAB function相同的结果的方法。在

基本上,这就是我想知道的。如何使Python代码得到与MATLAB代码相同的结果?在

作为一个小的示范

    k= [0 1 1;1 1 0 ;0 0 1]
    legendre(2,k)

给出:

^{pr2}$

而我的Python版本是这样的:我尝试的方式是这样的:

    legendre = np.polynomial.legendre.Legendre([0,1,2])
    legendre(k)

并产生:

   array([[-1.,  3.,  3.],
   [ 3.,  3., -1.],
   [-1., -1.,  3.]])

我看到了一些有点奇怪的东西,但不幸的是,我不知道如何测试它们,因为这是我第一次听说类似Legendre多项式的东西,无论是NumPy的文档还是Wikipedia对理解它都没有很大帮助。在


Tags: the数据代码定位numpy脚本时间function
3条回答

@user3684792感谢您的代码,但这并不是真正需要的,例如,cosdist通常是一个矩阵,因此{}将不足以满足需要(尽管很容易修复)。在

根据你的评论和this对Legrande多项式的定义,我自己试过了。我最后得到的是这个代码。我可以问问你对这件事的看法吗?在

    def P(n,x):
        if n == 0:
            return  1
        elif n==1:
            return  x
        elif n>1:
            return  (2*n-1)/n * x * P(n-1,x) - (n-1)/n * P(n-2,x)

    #some example data
    order = 4
    cosdist= np.array(((0.4,0.1),(-0.2,0.3)))
    m = 3
    dim1_cosdist, dim2_cosdist = cosdist.shape

    Gf = np.zeros((order, dim1_cosdist, dim2_cosdist))
    for n in range(1,order):
        Gf[n] = 1.0*(2*n+1) / ((n*(n+1))**m) * P(n,cosdist) 

    G = np.sum(Gf,axis = 0)

如果cosdist只是一个整数,这个脚本将给出与您相同的结果。 令我恼火的是,这些结果与从Matlab代码得到的结果仍然有些不同,也就是说,结果数组的维数甚至不同。 谢谢。 编辑:无意中,我把m和{}混淆了。现在应该是正确的

我也遇到了这个问题。以这个问题为出发点,得出以下结论。请注意:我使用的MATLAB函数如下:

legendre(10,linspace(-1,1,10))

我需要在Python中生成等价物。代码如下:

^{pr2}$

我对Python非常陌生,所以我相信上面的内容可以改进。在

好吧,我想你在用这个模块复制这些结果时会遇到麻烦,因为从名字上判断,只处理勒让德多项式(这些是勒让德方程的解,其中mu=0,或者称为0阶解)

我不知道matlab,但是看一下文档,你输入的是计算勒让德函数的结果,达到指定的阶数。在

在python中,您所做的似乎是创建一个由zeroeth一阶和二阶legendre多项式组成的组合

0*l*0+1*l*1+2*l*2

可以在指定点处计算勒让德多项式:

l0 = np.polynomial.legendre.Legendre([0,1])

你可以验证一下

^{pr2}$

我希望这是有用的-随时问更多的问题

编辑:

def coefficients(order):
    for i in range(1, order):
         base = np.zeros(order)
         base[i] = 1
         yield base

def a(n, m):
    return 1.0*(2*n+1) / ((n*(n+1))**m)

def g(const_dist, m, order):
     legendres = [np.polynomial.legendre.Legendre(n) for n in coefficients(order)]
     terms = [a(n+1,m)*legendres[n](const_dist) for n,_ in enumerate(legendres)]
     return sum(terms)


>>> g(0.4, 4, 6)
0.073845698737654328

我希望这对你有用,如果我搞砸了什么就告诉我

相关问题 更多 >