用Python计算Unity的第n个根

rob*_*s35 2 python fft complex-numbers dft

所以,我正在尝试编写一个算法croot(k,n),它返回n的第k个根,n == 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)
Run Code Online (Sandbox Code Playgroud)

输出是:

(1+0j)
(0.70710...+0.70710...j)
(6.12323399574e-17+1j)
Run Code Online (Sandbox Code Playgroud)

哇哇哇哇 所以k = 2和n = 8时的根是错误的,因为它应该是i,它将表示为1j,或j,或1.00000j等.有人可以帮助我吗?我这样做是因为我正在尝试编写FFT算法.我对复杂的数字和Python不是很有经验,所以我很可能犯了一个简单的错误.

谢谢,

如果你们需要任何其他信息,请询问.

Joh*_*ooy 5

看看这个号码

(6.12303176911e-17+1j)
Run Code Online (Sandbox Code Playgroud)

6.12303176911e-17= 0.0000000000000000612303176911这真的很小(接近于零).您所看到的是由于浮点数的有限表示而导致舍入错误

该误差相当于测量到太阳的距离在10微米左右.如果您对来自现实世界的数据运行FFT,则测量误差通常远大于此.

  • 尝试在交互式口译员中输入"1e-3"和"1e-4",你就会得到这个想法;) (2认同)

wim*_*wim 5

这是立方体的统一根源和第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])
Run Code Online (Sandbox Code Playgroud)

编辑: 多项式系数被输入阵列中的给定pnp.roots(p)中的顺序如下:

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

因此,例如,要返回n统一的根,这是方程的解1 * x**n - 1 == 0,你可以使用像这样的输入p = [1] + [0] * (n - 1) + [-1].