3

したがって、n == n で 1 の k 乗根を返すアルゴリズム croot(k, n) を作成しようとしています。私はほとんど正しい答えを得ていますが、特定の数値では間違っているように見える本当に奇妙な表現を与えています。ここに例があります。

import cmath

def croot(k, n):
    if n<=0:
        return None
    return cmath.exp((2 * cmath.pi * 1j * k) / n)


for k in range(8):
    print croot(k, 8)

出力は次のとおりです。

(1+0j)
(0.70710...+0.70710...j)
(6.12323399574e-17+1j)

おっおっおっ。したがって、k = 2 および n = 8 のときのルートは間違っています。1j、j、または 1.00000j などのように表される i である必要があるためです。これは、FFT アルゴリズムを作成しようとしているからです。私は複素数と Python の経験があまりないので、単純な間違いを犯している可能性があります。

ありがとう、

追加情報が必要な場合は、お尋ねください。

4

3 に答える 3

7

使用例として、1の立方根と4番目の根を示します。入力配列は、多項式係数として解釈する必要があります。

>>> import numpy as np
>>> np.roots([1, 0, 0, -1])
array([-0.5+0.8660254j, -0.5-0.8660254j,  1.0+0.j       ])
>>> np.roots([1, 0, 0, 0, -1])
array([ -1.00000000e+00+0.j,   5.55111512e-17+1.j,   5.55111512e-17-1.j,
         1.00000000e+00+0.j])

編集: 多項式係数は、次の順序でpnp.roots(p)

p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n]

したがって、たとえば、n方程式の解である1の冪根を返すには1 * x**n - 1 == 0、のような入力を使用しますp = [1] + [0] * (n - 1) + [-1]

于 2013-03-15T04:07:38.567 に答える
6

この数字を見て

(6.12303176911e-17+1j)

6.12303176911e-17=0.0000000000000000612303176911これは非常に小さい (ゼロに近い)。表示されているのは、浮動小数点数の表現が制限されているため、丸め誤差です

この誤差は、太陽までの距離を 10 ミクロン程度で測定することに相当します。実世界のデータに対して FFT を実行している場合、通常、測定誤差はこれよりもはるかに大きくなります。

于 2013-03-15T04:01:39.637 に答える