Python 循环不 return 复数(相反,returns nan)
Python loop doesn't return complex numbers (instead, returns nan)
我创建了一个函数 returns 4 次多项式的根(出于各种原因我没有使用现成的库函数)。函数 returns 最多有 4 个参数,一些可以是实数,一些可以是复数。当在循环外使用该函数时,它完全按预期工作。但是,循环它会导致复杂参数返回为 'nan'.
我也试过把函数代码直接放在循环里面,但是还是得到了'nan'。
这是函数和循环。当我们将参数设置为 mu = 0.5
和 x >= -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)
问题是在您的 for i in x_vec:
循环中,i
是一个 NumPy(等级 0)数组——一个标量。
它们具有特定类型(可能 numpy.float64
),不会自动转换为具有复杂能力的类型(例如 numpy.complex128
),这与 Python float
的情况相反根据需要静默转换为 complex
。
一个简单的解决方法就是将 x = i
替换为 x = i.astype(complex)
或其他类似的转换(例如 x_vec = np.linspace(-0.2, 0.2, 5).astype(complex)
),如果您需要 i
或 x_vec
成为 NumPy 数组。
或者,您可能希望将 x_vec
转换为 Python list
(例如 x_vec = np.linspace(-0.2, 0.2, 5).tolist()
),这将确保 i
/x
回退到 Python 自动投射。
我创建了一个函数 returns 4 次多项式的根(出于各种原因我没有使用现成的库函数)。函数 returns 最多有 4 个参数,一些可以是实数,一些可以是复数。当在循环外使用该函数时,它完全按预期工作。但是,循环它会导致复杂参数返回为 'nan'.
我也试过把函数代码直接放在循环里面,但是还是得到了'nan'。
这是函数和循环。当我们将参数设置为 mu = 0.5
和 x >= -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)
问题是在您的 for i in x_vec:
循环中,i
是一个 NumPy(等级 0)数组——一个标量。
它们具有特定类型(可能 numpy.float64
),不会自动转换为具有复杂能力的类型(例如 numpy.complex128
),这与 Python float
的情况相反根据需要静默转换为 complex
。
一个简单的解决方法就是将 x = i
替换为 x = i.astype(complex)
或其他类似的转换(例如 x_vec = np.linspace(-0.2, 0.2, 5).astype(complex)
),如果您需要 i
或 x_vec
成为 NumPy 数组。
或者,您可能希望将 x_vec
转换为 Python list
(例如 x_vec = np.linspace(-0.2, 0.2, 5).tolist()
),这将确保 i
/x
回退到 Python 自动投射。