Я пытаюсь решить систему из трех связанных ODE, которые содержат несколько параметров, которые меняются со временем (в Python).Я прочитал другие ответы по обмену стека на это и попытался тщательно следовать им (используя ODEint), но я все еще получаю вывод, который скачет повсюду.
Просто интересно, есть ли решатель ODEв Python предназначен для работы с параметрами, которые меняются со временем.Последняя система, которую мне нужно решить, - это шесть уравнений с примерно 15 параметрами в каждом (скорость реакции ... моделирование нуклеосинтеза Большого взрыва).Любая помощь будет потрясающей.Спасибо!
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri May 3 12:42:24 2019
"""
import scipy.integrate as integ
import numpy as np
import matplotlib.pyplot as plt
#Initate time array
n=200
t0=0.1
tf=100
time_vec = np.linspace(t0,tf,n)
#Initiate Nuclide Abundances
X_n0 = 0.5
X_p0 = 0.5
X_D0 = 0.0
X0_vec = (X_n0, X_p0, X_D0)
#define functions of changing parameters
def a(t):
return np.sqrt(t)
def rho_b(t, a):
return 1 / (a(t) ** 3)
#define functions of changing reaction rates
def brac_pn(t, rho_b):
return 2.5E4 * rho_b(t, a)
#Define function to plug into ODEint
def EvolveDensity(X, t, a, rho_b, brac_pn):
dX_n_dt = (X[0] * X[1]) + (brac_pn(t, rho_b) * X[2] )
dX_p_dt = (X[0] * X[1]) + (brac_pn(t, rho_b) * X[2] )
dX_D_dt = - (X[0] * X[1]) + (brac_pn(t, rho_b) * X[2] )
return [dX_n_dt, dX_p_dt, dX_D_dt]
#Solve Ode through time
Densities = integ.odeint(EvolveDensity, X0_vec, time_vec, args=(a, rho_b, brac_pn))
plt.plot(time_vec,Densities[:,0])
plt.plot(time_vec,Densities[:,1])
plt.plot(time_vec,Densities[:,2])