Почему нецелые показатели степени вызывают появление nan в Python?

Я пытаюсь численно решить уравнение Лейна-Эмдена в Python, используя scipy.integrate.ode.

По какой-то причине мой код работает с целыми значениями n (индекс политропы), такими как 3, но не работает с нецелыми значениями, такими как 2,9 и 3,1.

Я получаю предупреждение во время выполнения: «7: RuntimeWarning: недопустимое значение встречается в double_scalars», а оператор печати «print f0, f1» показывает, что несколько значений являются nan, когда n не является целым числом.

from scipy.integrate import ode
import numpy as np

def rhs(zet, u, n):
    x = u[0] # theta
    y = u[1] # phi
    f0 = -u[1]/(zet**2)
    f1 = (u[0]**(n))*(zet**2)
    print f0, f1
    return np.array([f0,f1])

r = ode(rhs).set_integrator("vode", method="adams", atol=1.e-13, rtol=1.e-13, nsteps=15000, order=12)

y0 = np.array([1.,0.])
zeta0 = 0.000001
r.set_initial_value(y0, zeta0)

n=3.1
r.set_f_params(n)

dzeta = 0.000001
zeta = [zeta0]
theta = [y0[0]]
while r.successful() and r.y[0] > 0.0:
    r.integrate(r.t + dzeta)
    zeta.append(r.t)
    theta.append(r.y[0])

Что может быть причиной этой проблемы?


person user112829    schedule 01.07.2015    source источник
comment
Являются ли числа, которые вы пытаетесь возвести в степень, отрицательными? Если да, то знаете ли вы, что возведение отрицательного числа в нецелую степень не определено (или, по крайней мере, входит в область комплексных чисел)?   -  person twalberg    schedule 01.07.2015
comment
Похоже на ошибку numpy, но я не использую numpy или scipy. См. этот ответ для некоторых, возможно, полезных советов по отладке.   -  person Two-Bit Alchemist    schedule 01.07.2015
comment
@twalberg Я только что напечатал базы, и похоже, что когда они становятся очень близкими к 0, они становятся отрицательными. Однако я не понимаю, почему это так, поскольку я проверяю, больше ли r.y[0] 0 в начале цикла while. У тебя есть идеи?   -  person user112829    schedule 01.07.2015
comment
Когда вы посмотрите на x, y, вы увидите, что, в частности, x (u[0]) действительно становится отрицательным, что неудивительно, поскольку алгоритм не знает, что он не может туда попасть. В большинстве алгоритмов ОДУ человек прыгает вперед, оглядывается назад и приспосабливается. Если он прыгнет далеко «вперед», он попытается оценить отрицательное значение u[0], и тогда все ставки будут сняты. Вам придется быть умнее в обращении с утесом, который вы построили.   -  person Jon Custer    schedule 02.07.2015