首先先回顾一下matlab运行时如何实时输出求解结果(上)中讲了一个什么问题。
我们在用ode45、ode15s等微分方程求解器解方程的时候,默认都是程序运行完成才能查看求解结果与数据。但如果你方程比较复杂,求解时间很长,你不想因为中途退出程序而导致前面的辛苦运行没有得到任何结果。因此你需要程序运行时能实时出结果。
一个基本解决办法是matlab运行时如何实时输出求解结果(上),里面提供了OutputFcn参数,可以实现“实时出结果”的目的。同时,OutputSel参数可以指定我们要实时显示哪几个解。
比如设置
options = odeset('OutputFcn',@odeplot,'OutputSel',1:3))
意思就是:我想在ode求解过程中实时plot前3个解(1:3)👇
再比如设置
options = odeset('OutputFcn',@odeprint,'OutputSel',1:3))
意思就是:我想在ode求解过程中在屏幕实时print前3个解(1:3)👇
如果上面两种结果输出的方式都没法满足要求,比如你在机组提交程序,没有运行界面,你用plot或者print就没有意义了,因此如果能做到把运行结果实时写入文件那就好了。
下面介绍下我们如何定义自己的函数,来真正实现运行结果实时存储!
这样的输出函数该如何定义呢?想一下上面说的、系统自带的两个函数odeplot和odeprint函数,我们可以模仿一下来进行自定义。
比如,在命令行输入edit odeprint.m
,可以打开系统自带的odeprint函数:
代码很简单,见27、28行,其实就是把此时的t数据和y数据不加分号(即屏幕输出)。
仿照这个文件,我们是不是可以作一些改进,把此时的t数据和y数据进行一些操作,比如写入文件?
将数据写入文件是用fprintf
函数,因此可以把上面的odeprint函数复 制一下,把函数名改为你自己的(比如我改为odesavedata)并把27、28行变成写入文件操作,其他不要变,得到自定义函数:
其中,我们用fopen
来先打开文件再写入。具体打开文件后提供哪些操作手段,可以网上查一下:
我们是要把每一次计算的数据都记入文件,因此用a
模式,即每次追加数据到文件末尾。
自定义函数写好之后,保存到当前文件夹,再在你程序中设置options:
options = odeset('OutputFcn',@odesavedata);
[tt,Psi]=ode15s(dpsi,tspan,psi_0,options); % DAE方程
发现了没,此时OutputFcn我没有用系统自带的@odeplot和@odeprint,而是换成了我自己定义的函数@odesavedata。
程序运行后,你可以在文件夹看到一个txt文件,实时存储求解的数据(随着时间推进这个文件会变大),如下面这个txt文件就是我求解过程中生成的txt数据文件。
对于得到的txt数据文件,要查看也很简单。
在matlab界面,主页、导入数据,选择这个txt文件:
再选择直接导入为列向量或者数值矩阵等,或者导出为脚本文件:
ode求解过程中如果时间很长,实时存储求解结果将会很有用。
利用本文介绍的方法,我们可以自定义函数来进行求解结果的实时输出。
这样实时存储解的数据并得到txt文件的好处至少有两点: