更多精彩内容参见专业MATLAB技术交流平台——MATLAB技术论坛http://www.matlabsky.com

1.变步长(Variable—Step)求解器

可以选择的变步长求解器有:ode45,ode23,ode113,odel5s,ode23s和discret.缺省情况下,具有状态的系统用的是ode45;没有状态的系统用的是discrete.

1)ode45基于显式Runge—Kutta(4,5)公式,Dormand—Prince对.它是—个单步求解器(solver)。也就是说它在计算y(tn)时,仅仅利用前一步的计算结果y(tn-1).对于大多数问题.在第一次仿真时、可用ode45试一下.

2)ode23是基于显式Runge—Kutta(2,3).Bogackt和Shampine对.对于宽误差容限和存在轻微刚性的系统、它比ode45更有效一些.ode23也是单步求解器.

3)odell3是变阶Adams-Bashforth—Moulton

PECE求解器.在误差容限比较严时,它比ode45更有效.odell3是一个多步求解器,即为了计算当前的结果y(tn),不仅要知道前一步结果y(tn-1),还要知道前几步的结果y(tn-2),y(tn-3),…;

4)odel5s是基于数值微分公式(NDFs)的变阶求解器.它与后向微分公式BDFs(也叫Gear方法)有联系.但比它更有效.ode15s是一个多步求解器,如果认为一个问题是刚性的,或者在用ode45s时仿真失败或不够有效时,可以试试odel5s。

odel5s是基于一到五阶的NDF公式的求解器.尽管公式的阶数越高结果越精确,但稳定性会差一些.如果模型是刚性的,并且要求有比较好的稳定性,应将最大的阶数减小到2.选择odel5s求解器时,对话框中会显示这一参数.

可以用ode23求解器代替。del5s,ode23是定步长、低阶求解器.

5)ode23s是基于一个2阶改进的Rosenbrock公式.因为它是一个单步求解器,所以对于宽误差容限,它比odel5s更有效.对于一些用odel5s不是很有效的刚性问题,可以用它解决.

6)ode23t是使用“自由”内插式梯形规则来实现的.如果问题是适度刚性,而且需要没有数字阻尼的结果,可采用该求解器.

7)ode23tb是使用TR—BDF2来实现的,即基于隐式Runge—Kutta公式,其第一级是梯形规则步长和第二级是二阶反向微分公式.两级计算使用相同的迭代矩阵.与ode23s相似,对于宽误差容限,它比odtl5s更有效.

8)discrete(变步长)是simulink在检测到模型中没有连续状态时所选择的一种求解器.

=========================================================================================

2.定步长(Flxed—Step)求解器

可以选择的定步长求解器有:ode5,ode4,ode3,ode2,ode1和discrete.

1)ode5是ode45的一个定步长版本,基于Dormand—Prince公式.

2)ode4是RK4,基于四阶Runge—Kutta公式.

3) ode3是ode23的定步长版本,基于Bogacki-Sbampine公式.

4) ode2是Heun方法,也叫作改进Euler公式.

5) odel是Euler方法.

6) discrete(定步长)是不执行积分的定步长求解器.它适用于没有状态的模型,以及对

过零点检测和误差控制不重要的模型.

=========================================================================================

3.诊断页(Diagnostics)

可以通过选择Simulation

Parameters对话框的Diagnostics标签来指明在仿真期间遇到一些事件或者条件时希望执行的动作.

对于每一事件类型,可以选择是否需要提示消息,是警告消息还是错误消息.警告消息不会终止仿真,而错误消息则会中止仿真的运行.

(1)一致性检查

一致性检查是一个调试工具.用它可以验证Simulink的0DE求解器所做的某些假设.它的主要用途是确保s函数遵循Simulink内建模块所遵循的规则.因为一致性检查会导致性能的大幅度下阵(高达40%),所以一般应将它设为关的状态.使用一致性检查可以验证s函数,并有助于确定导致意外仿真结果的原因.

为了执行高效的积分运算,Simulink保存一些时间步的结果,并提供给下一时间步使用.例如,某一时间步结束的导数通常可以放下一时间步开始时再使用.求解器利用这一点可以防止多余的导数运算.

一致性检查的另一个目的是保证当模块被以一个给定的t(时间)值调用时.它产生一常量输出.这对于刚性求解器(ode23s和odel5s)非常重要,因为当计算Jacobi行列式时.模块的输出函数可能会被以相同的t值调用多次.

如果选择了一致性检查,Simulink置新计算某些值,并将它们与保存在内存中的值进行比较,如果这些值有不相同的,将会产生一致性错误.Simulink比较下列量的计算值:

1)输出;

2)过零点

3)导数;

4)状态.

(2)关闭过零点检测

可以关闭一个仿真的过零点检测.对于一个有过零点的模型,关闭过零点检测会加快仿真的速度,但是可能影响仿真结果的精度.这一选项关闭那些本来就有过零点检测的模块的过零点检测.它不能关闭Hir

crossing模块的过零点检测.

(3)关闭优化I/O存储

选择该选项,将导致Simulink为每个模块约I/()值分配单独的缓存,而不是重新利用援存.这样可以充分增加大模型仿真所需内存的数量.只有需要调试模型时才选择该选

项.在下列情况下,应当关闭缓存再利用;

1)调试一个C-MEX S-函数;

2)使用浮点scope或display模块来察看调试模型中的信号.

如果缓存再利用打开,并且试图使用浮点scope或display模块来显示缓存已被再利用的信号,将会打开一个错误对话框.

(4) 放松逻辑类型检验

选择该选项,可使要求逻辑类型输入的模块接受双精度类型输入.这样可保证与Simulink

3版本之前的模型的兼容性.

=========================================================================================

4.提高仿真性能和精度

仿值性能相精度由多种因素决定,包括模型的设计和仿真参数的选择.求解器使用它们的缺省参数值可以使大多数模型的仿真比较精确有效,然而,对于一些模型如果调整求解器相仿真参数将会产生更好的结果.而且,如果对模型的性能比较熟悉,并且将这些信息提供给求解器,得到的仿真效果将会提高。

(1)加快仿真速度

仿真速度慢的原因有多种.下面列举其中的一些:

1)模型中包含有MATLAB的Fcn模块.当模型包含有MATLAB的Fcn模块时,在仿真的每一时间步都会调用MATLAB的解释器,这将大大地减慢仿真的速度.因此应尽可能地使用内建的Fcn模块或者E1ementary

Math模块.

2)模型中包含有M文件形式的S函数.M文件形式的S函数也将导致在每一时间步调用MATLAB的解释器.可以考虑将s函数转换为子系统或者c-MEx文件形式的s函数.

3)模型中包含有Memory模块.使用Memory模块使得变阶求解器(odel5s和odell3)在每一时间步将阶数设为1阶.

4)最大的步长太小.如果改变了最大步长.可以试试重新使用缺省值(auto)运行仿真。

5)对精度要求太高.缺省的相对容差(0.1%)通常已经足够了.对于状态值趋于0的模型.如果绝对容差设得太小.仿真时状态值在零点附近会花去太多的时间步.

6)时间尺度可能太长.减小时间间隔;

7)问题可能是刚性的.而使用的是非刚性求解器.这时可用odel5s试一下;

8)模型使用的采样时间相互之间不成倍数关系.相互之间不成倍数的混合采样时间会导致求解器采用足够小的步长,以保证采样时间符合所有的采样时间要求.

9)模型包含有代数循环.在每一时间步都会反复计算代数循环,因此这会大大地降低仿真的性能.

10)模型中将Random

Number模块的输出传给了Intergrator模块.对于连续系统,在Sources库中使用Bond—limited

Noise模块.

(2)改进仿真精度

要检查仿真的精度.仿真运行一段时间以后,减小相对容差到1e-4或者减小绝对容差,并重新运行它.比较两次仿真的结果.如果它们之间没有很大的差别,可以确信结果收敛.

如果经过一段时间后,仿真结果变得不稳定,可能是如下原因:

1)系统可能不稳定.

2)如果使用的是odel5s,可能需要将最大的阶数限制在2阶(求解器稳定的最大阶数),或者试试用ode23s求解器.

如果仿真结果看起来不是很精确,可能是:

1)对于一个拥有趋于零的状态值的模型,如果绝对容差设得太大,仿真在零状态值附近花的步数太少.减小绝对容差的大小或者在Integrator对话框中为每—个状态分别调整绝对容差的设定.

2)如果减小绝对容差不能有效地提高精度,减少相对容差的大小,减小步长,增加步数.

=========================================================================================

5.处理复数信号

在缺省状态下,simulink信号值是实数.尽管如此,模型可以产生相处理具有复数值的信号.可以采取以下任何一种方法在模型中引入复数值信号.

1)由顶层瑞口从MATLAB工作空间向模型中装入复数值信号数据.

2)在模型中产生一个常数模块,并设置其值为复数.

3)产生实数信号分别对应于复数信号的实部和虚部.然后用实-虚复数转换(Real-Imag to Complex

Conversion)模块将各部连成复数信号.

可以用接受复数的模块来处理复数信号,大多数simulink模块接受复数信导作为输入。

matlab中solver函数_Simulink求解器(Solver)相关知识相关推荐

  1. 极大似然函数求解_关于极大似然估计的学习(附Matlab中mle函数的求解)

    冒泡~是新的一周辣~温故而知新一下极大似然估计(真是很不容易了) 极大似然估计的基本思想 什么是极大似然?官方上的较清楚的解释是:利用已知的样本的结果,在使用某个模型的基础上,反推最有可能导致这样结果 ...

  2. 初步解读mfix中的stiff chemistry solver(刚性化学求解器)

    在mfix中添加化学反应时,有一个可以勾选的选项叫做stiff chemistry solver. 一般来说我都是勾选的,但是一直以来不太清楚到底能不能勾选?为什么要勾选?它代表着什么意义? mfix ...

  3. matlab pdepe函数边界,科学网-使用MATLAB中pdepe函数求解一维偏微分方程-邓浩鑫的博文...

    由于自己科研水平较低,记录的各种体会更多的是给自己做个小结,错误之处,欢迎大家指正. 使用MATLAB求解偏微分方程或者方程组,大致有三类方法.第一种是使用MATLAB中的PDE Toolbox,PD ...

  4. C++内点法求解大规模线性规划问题——对标MATLAB中linprog函数

    C++内点法求解大规模线性规划问题--对标MATLAB中linprog函数 文章目录 C++内点法求解大规模线性规划问题--对标MATLAB中linprog函数 1. 项目场景 2. 约束的规范化 3 ...

  5. matlab指令vpa(j10),matlab中vpa函数

    Matlab中矩阵函数_IT/计算机_专业资料.Matlab中矩阵函数 矩阵转置... Matlab 中 solve 函数主要是用来求解线性方程组的解析解或者精确解.对于得 出的结果是符号变量,可以通 ...

  6. MPC模型预测控制及在Matlab中实现函数定义

    基于b站DR_CAN老师的MPC控制视频[MPC模型预测控制器]4_数学建模推导--Matlab代码详解_哔哩哔哩_bilibili的学习分享如下: 一.研究目的 在约束条件(物理限制)下达到最优的系 ...

  7. matlab中simple函数怎么用,matlab里simple函数

    值 realmin:系统所能表示的最小数值 nargin: 函数的输出引数个数 ---MATLAB 中基本绘图函数有: plot: x 轴和 y 轴均为线性刻度 数刻度 semilogx: x 轴为对 ...

  8. 关于MATLAB中S函数中mdlDerivatives(状态变量微分)的使用

    1.MATLAB中S函数为: function [sys,x0,str,ts]=chap_plant(t,x,u,flag) switch flag case 0[sys,x0,str,ts]=mdl ...

  9. Matlab中intlinprog函数的用法总结

    Matlab中 intlinprog函数用法简介 1.简介 intlinprog是matlab中用于求解混合整数线性规划(Mixed-integer linear programming)的一个函数, ...

最新文章

  1. 专题 4 通用函数库之调试功能封装
  2. 【Network Security!】Linux中apt-get update和apt-get upgrade命令的区别
  3. Windows 下的 7 种 DLL 劫持技术
  4. 全国计算机等级考试题库二级C操作题100套(第38套)
  5. UC浏览器APP如何卸载插件
  6. 坑:jmeter部署AWS云服务器时出现连接超时Non HTTP response code: org.apache.http.conn.HttpHostConnectException...
  7. mysql組合主鍵_MySQL(二)
  8. 2020-06-05 原始套接字/AF_PACKET链路层访问
  9. 【笔记】《编写高质量代码:改善c#程序的157个建议》-第1章 基本语言要素(SamWang)...
  10. 迅雷7核心技术Bolt界面引擎正式开放
  11. 软件测试验收报告知识点
  12. 数据库注入提权总结(一)
  13. 立创EDA学习笔记(3)——创建元件封装
  14. GCN在交通流预测方面的相关文章
  15. python3 词频统计计数分析+可视化词云 jieba+wordcloud 数据分析
  16. DAPLink-Firmware
  17. mysql insert on duplicate_一条Insert on duplicate引发的血案
  18. mybatis/mybatis-plus 子查询实现 涉及到in、exist操作
  19. 摘录整理:日本文化常识之历史篇
  20. 棱镜为什么能把阳光分成七色呢?

热门文章

  1. c++ linux 获取毫秒_Linux c++获取本地毫秒级精确时间
  2. pcb设计等长线误差_“背锅”盲区,光时域反射仪延长线实际使用测评
  3. intellij idea jdk language level
  4. Android Day05-网络编程之文件下载之多线程断点续传技术
  5. 【spring源码学习】spring的aop目标对象中进行自我调用,且需要实施相应的事务定义的解决方案...
  6. 汉诺塔(三) 判断操作是否合法 + 栈(stack)数组
  7. 页面每次添加都显示最后一次访问记录spring scope=prototype 学习笔记
  8. slackware_Slackware年满25岁,Perl告白,PowerShell调整,Linux网络,Emacs等
  9. 我是如何在都柏林的一次中转中无意中写了维基百科页面的
  10. web字体设置成平方字体_探索免费和开放的Web字体