Python循环不返回复数(而是返回nan)

时间:2019-10-28 22:34:38

标签: python loops complex-numbers

我创建了一个函数,该函数返回4阶多项式的根(出于各种原因,我没有使用现成的库函数)。该函数最多返回4个参数,其中一些参数可以是实数,而某些参数则可以是复杂数。在循环外使用该函数时,其功能完全符合预期。但是,循环执行会使复杂的参数返回为'nan'。

我也尝试过将函数代码直接放入循环中,但是我仍然得到'nan'。

这是函数和循环。将参数设置为mu = 0.5x >= -0.22 & x <= 0.22

时,仅应返回复数
def poly4(a, b, c, d, e):
    disc_0 = c**2 - 3*b*d + 12*a*e
    disc_1 = 2*c**3 - 9*b*c*d + 27*(b**2)*e + 27*a*d**2 - 72*a*c*e
    p = (8*a*c - 3*b**2) / (8*a**2)
    q = (b**3 - 4*a*b*c + 8*(a**2)*d) / (8*a**3)
    Q = ((disc_1 + (disc_1**2 - 4*disc_0**3)**0.5) / 2)**(1/3)
    S = 0.5 * (-(2/3)*p + (3*a)**(-1) * (Q + disc_0 / Q))**0.5

    x1 = -b/(4*a) - S + 0.5 * (-4*S**2 - 2*p + q/S)**0.5
    x2 = -b/(4*a) - S - 0.5 * (-4*S**2 - 2*p + q/S)**0.5
    x3 = -b/(4*a) + S + 0.5 * (-4*S**2 - 2*p - q/S)**0.5
    x4 = -b/(4*a) + S - 0.5 * (-4*S**2 - 2*p - q/S)**0.5
    return x1, x2, x3, x4
x = 0.1
mu = 0.5

a = 1
b = -2*x
c = x**2+mu**2-1
d = 2*x
e = -x**2

print(poly4(a, b, c, d, e))
x_vec = np.linspace(-0.2, 0.2, 5)
mu = 0.5

for i in x_vec:
    x = i
    a = 1
    b = -2*x
    c = x**2+mu**2-1
    d = 2*x
    e = -x**2
    result = poly4(a, b, c, d, e)
    print(result)

1 个答案:

答案 0 :(得分:1)

问题在于,在for i in x_vec:循环中,i是一个NumPy(rank-0)数组-标量。 它们具有特定的类型(可能为numpy.float64),不会自动转换为具有复杂功能的类型(例如,numpy.complex128),这与Python float被无声转换的情况相反转到complex

一个简单的解决方法是,如果您需要x = ix = i.astype(complex)来替换x_vec = np.linspace(-0.2, 0.2, 5).astype(complex)或其他类似的强制类型转换(例如i),成为NumPy数组。

或者,您可能希望将x_vec转换为Python x_vec(例如list),这将确保x_vec = np.linspace(-0.2, 0.2, 5).tolist() / i回退到Python自动转换。