龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

simulink与vc++6.0接口(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
参数说明: modelname 运行的模型名(不包含扩展名),必须在MATLAB的搜索路径上。 timespan 指定仿真的时间区间,可以采取以下几种格式: (1)[] 空,利用

参数说明:

'modelname' 运行的模型名(不包含扩展名),必须在MATLAB的搜索路径上。

timespan 指定仿真的时间区间,可以采取以下几种格式:

(1)[] 空,利用模型对话框设置时间;

(2)T_final 标量,制定终止仿真时间;

(3)[T_start T_final] 二元向量,指定仿真时间区间;

(4)outputTimes 任何指定输出时间记录点的向量。

options MATLAB特定的一种数据结构,具有最高优先权,可以覆盖模型参数对话框中的设置。

ut 赋给仿真对象数入口模块的量,具有最高优先设置,它是形为[t,u1,u2...]的数值矩阵,每个为时间序列或输入序列。

Simulink与VC++6.0接口中的几点问题

根据自己在将Simulink与VC++6.0相结合过程中的经验,在实际运作过程中,需要注意以下几点问题:

Solver的选择

仿真要涉及常微分方程组的数值积分,为适应计算的多样性,Simulink提供了多种求解器。因此在解决具体的问题时,应当选择合适的求解器,并且设定合适的参数,以得到精确且迅速的仿真结果。比如:

ode45 即Nonstiff微分方程式,应用Runge-Kutta解法的中阶解法;应用最广的ode23 即Nonstiff微分方程式,应用Runge-Kutta解法之较低阶的求解方式,误差会比ode45多一点,但执行的效率快 ;ode113 即Nonstiff微分方程式,应用Adams-Bashforth-Moulton解法; ode15s 即stiff微分方程式之变阶数求解方式,是一种数值差分法;ode23s 即stiff微分方程式之低阶数求解方式,应用修正的Rosenbrock二阶解法;ode23t 即stiff微分方程式与dae三角形法整合求解方式 ode23tb 即stiff微分方程式之低阶数求解方式。
对于ode45,通常适用于连续状态模型,而对于刚性(stiff)系统,则需要采用如ode23s的刚性求解器。对于我们的可控整流电路故障模型,由于采用短路器模拟开路现象,系统为刚性系统,所以在solver选择时需要选择刚性求解算法。

通过VC++编写的应用程序采用引擎方式通过命令行仿真设置Solver只是改变了当前仿真的Solver,默认设定为Simulink中的仿真参数设定。比如对于可控整流电路故障诊断系统这一刚性系统,即便程序中选用了ode15s而默认为ode45,则本次仿真确实使用ode15s求解,但仍然会报警说应该用刚性解法。不过对于刚性系统,ode45可不好用,因此从仿真效果(如耗时)上可以认定程序中设定的刚性解法奏效了。

VC数据类型与MATLAB数据类型之间的转换

使用VC++6.0与MATLAB通过引擎方式混合编程,不可避免地要在VC数据类型与MATLAB数据类型之间进行转换。一般来说,可以使用memcpy进行转换。即通过mxGetPr()获取MATLAB数据类型的指针,再调用memcpy,比如在命令行方式下设置仿真时间时可以如下处理:

//设定仿真时间VC数据类型àMATLAB数据类型

double timespan[2];
timespan[0] = (double) m_fStartTime;
timespan[1] = (double) m_fStopTime;
T = mxCreateDoubleMatrix(1, 2, mxREAL);
memcpy((char *) mxGetPr(T), (char *) timespan, 2*sizeof(double));
engPutVariable(ep, "T", T);
// MATLAB数据类型àVC数据类型
double test[2];

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接