两段MATLAB中自定义函数相同但输出Y有差异的原因是什么?

新手上路,请多包涵

两段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")

部分数据:
image.png

以上两个代码中只有输出Y有差异!二者图像重叠图如下:
image.png

更改过初始数据y0,图像并无明显差异
使用的数据data来自同一文件,而且散点图完全重合,不存在初始数据差异
想问为什么会这样?我不理解

阅读 678
2 个回答
  1. 时间向量定义不同:

    • 问题代码使用 1:70(从1开始)
    • 正常代码使用 0:70(从0开始)
      这个差异很关键,因为:
    • 起始时间不同会影响微分方程中指数函数的初始值
    • beta和mu的计算依赖于时间t,不同的起始时间会导致不同的系数值
  2. 数值求解器的行为:

    • ODE23是一个变步长求解器
    • 不同的时间向量会导致求解器选择不同的积分步长
    • 这会影响数值解的精度和采样点分布
  3. 解决方案:

    • 统一使用相同的时间向量(建议从0开始)
    • 明确指定求解器的容差参数
    • 确定数据比对时使用相同的时间点

建议修改:

  1. 统一使用 t = 0:70 作为时间向量
  2. 添加求解器选项来控制精度:

    options = odeset('RelTol', 1e-6, 'AbsTol', 1e-8);
    [T, Y] = ode23(@ill, t, y0, options);
[T, Y] = ode23(@ill, 0:70, y0);  % 从0开始而不是从1开始
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏