Matlab中传染病模型,对在不同时间区间中传染概率赋值,但程序一直报错,不知道什么原因,想麻烦帮看一下。
function dY= Fsisd(t,Y,b,g,m)
S=Y(1);%S为易感状态
I=Y(2);%I为感染状态
D=Y(3);%D为死亡状态
dY = zeros(3,1);
%b为传染概率,m为恢复率,g为死亡率
dY(1) = -b*S*I + m*I;
dY(2) = b*S*I - g*I-m*I;
dY(3) = g*I
end
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
%-- initial conditions
t=0:0.1:120;
b=0.21*(t<3)+0.16*(t>=3);%在时间t<3时,传染概率b为为0.21;在时间t>=3时,传染概率b为为0.16;
g=0.24*(t>=0); %死亡率的取值
m=0.06*(t>=0); % 恢复率的取值
i0=0.2; % I状态初始占比
s0=0.8; % S状态初始占比
d0=0; % R状态初始占比
T=120; % evaluation time
S0I0D0=[s0 i0 d0]; % initial condictions Vector
Tspam=[0:0.1:T]; % time interval
%-- Numerical Integration
[T,Y] = ode45(@(t,Y) Fsisd(t,Y,b,g,m),Tspam,S0I0D0);
S=Y(:,1); % Solution S
I=Y(:,2); % Solution I
D=1-S-I; % Solution D
%----- plots -----
plot(T,S,'k');
hold on;
grid on;
plot(T,I,'r--');
plot(T,D,'b-.');
axis([0 120,0,1])
title('典当行-SISD model ')
xlabel('Time')
ylabel('各状态比例')
legend('S','I','D','Location','best')
该回答引用ChatGPT GPT-4
运行结果
代码如下
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
%-- initial conditions
t=0:0.1:120;
b_func=@(t) (0.21*(t<3)+0.16*(t>=3)); %在时间t<3时,传染概率b为为0.21;在时间t>=3时,传染概率b为为0.16;
g_func=@(t) (0.24*(t>=0)); %死亡率的取值
m_func=@(t) (0.06*(t>=0)); % 恢复率的取值
i0=0.2; % I状态初始占比
s0=0.8; % S状态初始占比
d0=0; % R状态初始占比
T=120; % evaluation time
S0I0D0=[s0 i0 d0]; % initial condictions Vector
Tspam=[0:0.1:T]; % time interval
%-- Numerical Integration
[T,Y] = ode45(@(t,Y) Fsisd(t,Y,b_func,g_func,m_func),Tspam,S0I0D0);
S=Y(:,1); % Solution S
I=Y(:,2); % Solution I
D=1-S-I; % Solution D
%----- plots -----
plot(T,S,'k');
hold on;
grid on;
plot(T,I,'r--');
plot(T,D,'b-.');
axis([0 120,0,1])
title('典当行-SISD model ')
xlabel('Time')
ylabel('各状态比例')
legend('S','I','D','Location','best')
function dY= Fsisd(t,Y,b_func,g_func,m_func)
S=Y(1);%S为易感状态
I=Y(2);%I为感染状态
D=Y(3);%D为死亡状态
dY = zeros(3,1);
%b为传染概率,m为恢复率,g为死亡率
b=b_func(t);
g=g_func(t);
m=m_func(t);
dY(1) = -b*S*I + m*I;
dY(2) = b*S*I - g*I-m*I;
dY(3) = g*I;
end
请提供一下错误信息
但是函数关系不确定,就是需要自己定义函数关系,然后自己调试函数中需要的参数的值。
刚开始思路是自定义一个函数关系式,然后用pso求解最优参数,其最后输出的y的值为下图所示,输入有三个自变量,x1,x2,x3.
最后的需求是找到x1,x2,x3.与y的具体关系式子,比如
y=ax1+bx2+cx3;
y=ax1+bx2+cx3+ex1x1+fx2x2++ex3x3;等等
找到思路后,尝试了很多能想到的函数关系,当然,部分结果我感觉是还可以:从刚开始的下图效果,这个拟合结果整体趋势是有了,但是结果很不理想,然后增加了更复杂的参数模型
进补到下列效果,大概是63个值与标准y的误差在1%-2%之间,此时自定义的拟合函数变为
看到效果还不错,然是还是有很大误差。开头和结尾差距还是很大
到后来,放弃自己试了, 用ANN去算了,然后手动带内核参数生成函数,大概有37个参数,函数式一长串,但是拟合效果还是可以的,如下图所示:
但是这个效果,只有220个点误差在范围内,一共280个数据,还有60个数据误差偏大
仔细看了看发现,应该就是开头和结尾误差大
最后,最后,经过多次尝试,
278个点正确,满足1%-2%的误差,也达到最终拟合需求。
记录一下,需要数据拟合的可以私聊