ODEintWarning: избыточная работа по этому вызову - PullRequest
0 голосов
/ 16 марта 2020

Привет, я изучаю анализ чувствительности для динамической системы, которая состоит из 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...