2

現在、Pythonで時系列データを分析しようとしています。そのためのガイドラインとして、やりたいことのほとんどすべてを実行する MATLAB スクリプトを使用することにしました。ここまでは問題なく動作していましたが、そのスクリプトで使用されているルジャンドル多項式に出くわしました。

NumPy の実装を試してみましたが、(多かれ少なかれ) MATLAB functionと同じ結果が得られる方法を見つけることができませんでした。

基本的に、これは私が知りたいことです。Python コードで MATLAB コードと同じ結果を得るにはどうすればよいですか?

ちょっとしたデモンストレーションとして、

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

与えます:

ans(:,:,1) =

-0.5000    1.0000   -0.5000
0         0         0
3.0000         0    3.0000


ans(:,:,2) =

1.0000    1.0000   -0.5000
     0         0         0
     0         0    3.0000


ans(:,:,3) =

1.0000   -0.5000    1.0000
     0         0         0
     0    3.0000         0

私のPythonバージョンは次のようになりますが、私が試した方法は次のようになります:

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

そして得られます:

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

少し奇妙なことがいくつかありますが、残念ながら、ルジャンドル多項式のようなものについて聞いたのはこれが初めてであり、NumPy のドキュメントもウィキペディアも理解に大きな助けにはならないため、それらをテストする方法についての手がかりがありません。それ。

4

6 に答える 6

2

SciPyには、関連するルジャンドル多項式があります。これは MATLAB バージョンと同じではありませんが、必要なもののほとんどを提供するはずです。

于 2015-03-14T06:24:32.697 に答える
2

@ user3684792 コードをありがとうございcosdistますsum(terms)

あなたのコメントとルグランデ多項式のこの定義に基づいて、私はそれを自分で試しました。私が最終的に得たのはこのコードです。それについてあなたの意見を聞かせてもらえますか?

    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しましorderた。今は正しいはずです

于 2014-11-25T22:34:46.570 に答える