首页/文章/ 详情

matlab运行时如何实时输出求解结果(下)

6月前浏览10861

首先先回顾一下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文件的好处至少有两点:

  • 如果你的程序意外终止了,你不用担心前面的运行白费了(因为你当前求解的结果全部已经写入txt文件了);
  • 利用机组运行程序的时候,不用再等程序全部运行完才能查看结果,也不用担心你的任务被kill后没有任何数据,你随时终止运行都可以,文件夹下面会有一个存储之前运行所得的所有解的txt数据文件。




来源:现代石油人
断裂非线性化学电子油气MATLAB岩土UM裂纹理论材料控制曲面Origin
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-05-01
最近编辑:6月前
现代石油人
博士 签名征集中
获赞 25粉丝 62文章 806课程 1
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈