两段matlab代码中自定义函数和输入相同,拟合结果却不同。
问题代码:
function dy=ill(t,y)
beta=0.324*exp(-0.1258*t);
mu=0.0015*exp(0.0829*t);
dy=zeros(2,1);
dy(1)=beta*y(1)-mu*y(1);
dy(2)=mu*y(1);
end
% 求解微分方程
y0 = [200, 51];
[T, Y] = ode23(@ill, 1:70, y0);
data = xlsread('数据文件5-1sas传播.xlsx');
R=data(:,3)+data(:,4);
I=data(:,1)-R;
% 绘图
hold on
plot(1:length(data), I, '.', 'DisplayName', '现有感染者');
plot(1:length(data), R, '.', 'DisplayName', '累计移出者');
plot(T, Y(:,1), '-', 'DisplayName', '模拟感染者 (I)');
plot(T, Y(:,2), '-', 'DisplayName', '模拟移出者 (R)');
xlabel('时间');
ylabel('人数');
legend show;
正常代码:
function dy=ill(t,y)
beta=0.324*exp(-0.1258*t);
mu=0.0015*exp(0.0829*t);
dy=zeros(2,1);
dy(1)=beta*y(1)-mu*y(1);
dy(2)=mu*y(1);
end
ti=0:70;
y0=[200,51];
[T,Y]=ode23(@ill,ti,y0);
plot(T,Y(:,1),'b')
hold on,plot(T,Y(:,2),'k')
xlabel=('t');ylabel=('I');title('SARS模型:患者数量、移出者与时间的关系')
xlsx=xlsread('数据文件5-1sas传播.xlsx');
t=1:1:65;
hold on;plot(t',xlsx(:,1)-xlsx(:,3)-xlsx(:,4),"r.");
plot(t',xlsx(:,3)+xlsx(:,4),".")
legend("数值解I","数值解R","实际I","实际R")
部分数据:
以上两个代码中只有输出Y有差异!二者图像重叠图如下:
image.png
更改过初始数据y0,图像并无明显差异
使用的数据data来自同一文件,而且散点图完全重合,不存在初始数据差异
想问为什么会这样?我不理解
时间向量定义不同:
1:70
(从1开始)0:70
(从0开始)这个差异很关键,因为:
数值求解器的行为:
解决方案:
建议修改:
t = 0:70
作为时间向量添加求解器选项来控制精度: