Цикл Python не возвращает комплексные числа (вместо этого возвращает nan) - PullRequest
0 голосов
/ 29 октября 2019

Я создал функцию, которая возвращает корни полинома 4-й степени (по разным причинам я не использую готовую библиотечную функцию). Функция возвращает до 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)

1 Ответ

1 голос
/ 29 октября 2019

Проблема в том, что внутри вашего for i in x_vec: цикла i находится массив NumPy (rank-0) - скаляр. У них есть определенный тип (вероятно, numpy.float64), который не будет автоматически приведен к типу с комплексной способностью (например, numpy.complex128), в отличие от того, что происходит с Python float s, который молча приводится к 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.

...