Tôi đang triển khai mô hình Nhạy cảm-Bị nhiễm-Phục hồi rất đơn giản với dân số ổn định cho một dự án bên nhàn rỗi - thường là một nhiệm vụ khá tầm thường. Nhưng tôi đang chạy vào lỗi giải quyết bằng cách sử dụng hoặc PysCeS hoặc SciPy, cả hai đều sử dụng lsoda như là người giải quyết cơ bản của họ. Điều này chỉ xảy ra đối với các giá trị cụ thể của một tham số và tôi được cho là lý do tại sao. Mã Tôi đang sử dụng như sau:Odd SciPy Lỗi tích hợp ODE
import numpy as np
from pylab import *
import scipy.integrate as spi
#Parameter Values
S0 = 99.
I0 = 1.
R0 = 0.
PopIn= (S0, I0, R0)
beta= 0.50
gamma=1/10.
mu = 1/25550.
t_end = 15000.
t_start = 1.
t_step = 1.
t_interval = np.arange(t_start, t_end, t_step)
#Solving the differential equation. Solves over t for initial conditions PopIn
def eq_system(PopIn,t):
'''Defining SIR System of Equations'''
#Creating an array of equations
Eqs= np.zeros((3))
Eqs[0]= -beta * (PopIn[0]*PopIn[1]/(PopIn[0]+PopIn[1]+PopIn[2])) - mu*PopIn[0] + mu*(PopIn[0]+PopIn[1]+PopIn[2])
Eqs[1]= (beta * (PopIn[0]*PopIn[1]/(PopIn[0]+PopIn[1]+PopIn[2])) - gamma*PopIn[1] - mu*PopIn[1])
Eqs[2]= gamma*PopIn[1] - mu*PopIn[2]
return Eqs
SIR = spi.odeint(eq_system, PopIn, t_interval)
này tạo ra các lỗi sau:
lsoda-- at current t (=r1), mxstep (=i1) steps
taken on this call before reaching tout
In above message, I1 = 500
In above message, R1 = 0.7818108252072E+04
Excess work done on this call (perhaps wrong Dfun type).
Run with full_output = 1 to get quantitative information.
Thông thường khi tôi gặp phải một vấn đề như thế, có điều gì đó ở giai đoạn cuối xảy ra với hệ thống phương trình tôi thiết lập , nhưng cả hai tôi không thể nhìn thấy bất cứ điều gì sai trái với nó. Thật kỳ lạ, nó cũng hoạt động nếu bạn thay đổi mu thành một cái gì đó như 1/15550
. Trong trường hợp đó là một cái gì đó xảy ra với hệ thống này, tôi cũng thực hiện các mô hình trong R như sau:
require(deSolve)
sir.model <- function (t, x, params) {
S <- x[1]
I <- x[2]
R <- x[3]
with (
as.list(params),
{
dS <- -beta*S*I/(S+I+R) - mu*S + mu*(S+I+R)
dI <- beta*S*I/(S+I+R) - gamma*I - mu*I
dR <- gamma*I - mu*R
res <- c(dS,dI,dR)
list(res)
}
)
}
times <- seq(0,15000,by=1)
params <- c(
beta <- 0.50,
gamma <- 1/10,
mu <- 1/25550
)
xstart <- c(S = 99, I = 1, R= 0)
out <- as.data.frame(lsoda(xstart,times,sir.model,params))
này cũng sử dụng lsoda, nhưng có vẻ là đi ra mà không có một xô. Bất cứ ai có thể thấy những gì đang xảy ra sai trong mã Python?
Mọi thứ ở đây được bao bọc dưới dạng run() để dễ gọi hơn hay vì lý do cơ học? – Fomite
Không, chỉ để thuận tiện! –
@ Fomite viết các tệp python dưới dạng mô-đun trái ngược với tập lệnh thường là một ý tưởng hay vì nó cho phép sử dụng lại mã và khuyến khích cấu trúc mã tốt hơn. – DanielSank