Привет, я изучаю анализ чувствительности для динамической системы, которая состоит из 3 ODE путем вычисления максимального значения x, y1 и y2 для каждого набора входных факторов (параметров и начальных условий). Однако я получаю следующая ошибка для некоторых значений параметров и, возможно, для некоторого начального условия, и я не уверен, будет ли полезно использовать результаты с присутствующим предупреждением.
Сообщение об ошибке:
Anaconda3\lib\site-packages\scipy\integrate\odepack.py:248: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.
warnings.warn(warning_msg, ODEintWarning)
Выполняется с full_output = 1:
sol= odeint(dynamical_model_bacteria, X0,t,full_output = 1)
Я получаю еще одно сообщение об ошибке:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-38-b7b71352db49> in <module>
18
19 sol= odeint(dynamical_model_bacteria, X0,t,full_output = 1);
---> 20 x_Sol.append(np.amax(sol[:,0]))
21 y1_Sol.append(np.amax(sol[:,1]))
22 y2_Sol.append(np.amax(sol[:,2]))
TypeError: tuple indices must be integers or slices, not tuple
Как обойти эти две проблемы. Я читал о других подобных проблемах, и проблемы, кажется, деление на ноль, но не знаю, как его обнаружить и избежать.
Полный код:
import numpy as np
from numpy import *
from cmath import*
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy as scp
from scipy.integrate import solve_ivp, odeint
import SALib
from SALib.sample import saltelli,morris,latin
from SALib.sample import morris
from SALib.analyze import sobol,dgsm
from SALib.analyze import morris
from SALib.plotting.bar import plot as barplot
from SALib.plotting.morris import *
# Define the model inputs
num_par=18
problem = {
'num_vars': 18,
'names': ['N','eta','r','f1','f2','beta1', 'beta2', 'epsilon1','epsilon2','g12','gamma12','omega11','omega12','omega21','omega22','x0','y10','y20'],
'bounds': [ [1,100]
,[0.1,5]
, [0.1,1]
, [0.1,5]
, [0.1,5]
, [0.1,1]
, [0.1,1]
, [0.1,1]
, [0.1,1]
, [0.1,5]
, [0.1,1]
, [0.1,1]
, [0.1,1]
, [0.1,5]
, [0.1,1],
[0,60],
[0,60],
[0,60]
]
}
# Generate samples
param_values = saltelli.sample(problem, 1000)
# Run model
Y = np.zeros([param_values.shape[0]])
x_sol=[]
y1_sol=[]
y2_sol=[]
for i in np.arange(len(Y)):
N,eta,r,f1,f2,beta1, beta2, epsilon1,epsilon2,g12,gamma12,omega11,omega12,omega21,omega22,x0,y10,y20=param_values[i]
s=0
X0=np.array( [x0,y10 , y20 ])
def dynamical_model_bacteria(X,t):
x, y1, y2 = X
dxdt=x*(r*(1-(eta*x)/N)-f1*y1-f2*y2)+s
dy1dt=y1*(-epsilon1*(1+(omega11*y1+omega12*y2)/epsilon1)-g12*y2+beta1*f1*x)
dy2dt=y2*(-epsilon2*(1+(omega21*y1+omega22*y2)/epsilon2)+gamma12*g12*y1+beta2*f2*x)
return [dxdt,dy1dt,dy2dt]
#print( dynamical_model_bacteria(x0,0))
t=np.linspace(0,60,8000)
sol= odeint(dynamical_model_bacteria, X0,t);
x_sol.append(np.amax(sol[:,0]))
y1_sol.append(np.amax(sol[:,1]))
y2_sol.append(np.amax(sol[:,2]))
x_Max=np.stack(x_sol)
y1_Max=np.stack(y1_sol)
y2_Max=np.stack(y2_sol)