【问题标题】:How to display Matlab's ode45 results in real time?如何实时显示Matlab的ode45结果?
【发布时间】:2017-03-02 10:25:28
【问题描述】:

假设我们有一个一阶 ODE 系统的以下求解器:

   % func.m
   function dydt = func(t,y)
   dydt = [y(2); (1-y(1)^2)*y(2)-y(1)];

及主要代码:

% solver.m
tspan=0:1:10;
[t,y] = ode45(@func,tspan,[2; 0]);

如何实时显示 ode45 生成的每个时间步 t (t=0,1,2,...,10) 的结果 y1(t) 和 y2(t),无需等待完成整个代码?

【问题讨论】:

    标签: matlab real-time ode


    【解决方案1】:

    应该使用OutputFcn ode 求解器选项。例如,要绘制解与时间的关系,可以使用内置的输出函数odeplot

    options= odeset('OutputFcn',@odeplot);
    [t,y] = ode45(@func,[0 200],[2; 0],options);
    

    您可以使用自己的输出函数。这是一个例子:

    myOutputFcn= @(t,y,flag)fprintf('t= %s y=  %s\n',mat2str(t),mat2str(y))*0;
    options= odeset('OutputFcn',myOutputFcn);
    [t,y] = ode45(@f,0:1:10,[2; 0],options);
    

    【讨论】:

    • 我把代码改成这样:tspan=0:1:10; [t,y] = ode45(@func,tspan,[2; 0],options);对于 t=0,1,2,...,10,如何打印 t 和 y1(t)、y2(t)?您的代码对 t 和 y 给出了一些奇怪的结果。这里 y 有两列。
    • @Andyk 抱歉,使用fprintf 时出现了一些错误。我已经更正了答案
    • 为什么将 fprintf 乘以 0?
    • 输出函数应该返回0继续,1停止; fprintf 返回写入的字节数(不等于 0)。在我们的例子中(从匿名函数)返回零的最简单方法就是将此数字乘以 0
    猜你喜欢
    • 2021-01-17
    • 2014-11-03
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多