Я пытаюсь решить уравнение Лейн-Эмдена для произвольных значений n (политропный индекс). Чтобы использовать SciPy, я представил ODE второго порядка как набор из двух связанных ODE первого порядка. У меня есть следующий код:Решение ODE с помощью SciPy дает недопустимое значение, обнаруженное в ошибке double_scalars
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
def poly(y,xi,n):
theta, phi = y
dydt = [phi/(xi**2), -(xi**2)*theta**n]
return dydt
Здесь я определил Фи = тета»
y0 = [1.,0.]
xi = np.linspace(0., 16., 201)
for n in range(0,11):
sol = odeint(poly, y0, xi, args=(n/2.,))
plt.plot(xi, sol[:, 0], label=str(n/2.))
plt.legend(loc='best')
plt.xlabel('xi')
plt.grid()
plt.show()
Однако выполнение этого кода приводит к следующей ошибке:
RuntimeWarning: invalid value encountered in double_scalars
app.launch_new_instance()
На первый, я что это было связано с особенностью уравнения при xi = 0, поэтому я изменил интервал интеграции:
xi = np.linspace(1e-10, 16., 201)
Это устраняет проблему при n = 0., но не при других значениях n. Графики, которые я получаю, не имеют никакого смысла и просто ошибаются.
Зачем мне это сообщение об ошибке и как я могу исправить свой код?
Спасибо, что ответили! Это здорово, мой код работает сейчас! У вас есть идея, почему он работает только для целочисленных значений n? –
Я думаю, что это не нравится, когда 'theta' меньше или равно нулю. Если вы посмотрите на выход решения, он остановится на 'theta = 0'. –
Это имеет смысл, потому что это приведет к сложным решениям. Есть ли способ использовать ODEint до момента, когда theta <0? –