为什么使用Simulink的Interpreted MATLAB Fcn相比M-file形式,Simulink的图形化界面可以方便改变边界条件,例如Step,TimeTable等。
Simulink中的Interpreted MATLAB Fcn模块,可以导入包含常微分方程组的function,形成黑箱。仅需要用户提供输入,即可得到输出。这样避免常规Simulink求解常微分方程组的模式,即通过搭建各种数学运算模块,确定各模块之间的运算关系,最终求解常微分方程组。
例1:求解单个常微分方程[1]
编写一个function,代码如下所示:
functiondydt=first_order(x)% Interpreted MATLAB Fcn的输入包括u,y
u=x(1);
y=x(2);
tau=5;
K=2;
dydt=(-y+K*u)/tau;
end
Simulink的框图如下所示:
要值得注意的是,Integrator模块可以求得的积分,即 。然后 反馈给Interpreted MATLAB Fcn,作为该模块的输入。
除此之外,模块Interpreted MATLAB Fcn中要填写导入function的名字,以及模块的输出数量,如下图红色框图所示:
最终Simulink的仿真结果可见下图:
例2:求解常微分方程组[2]:
其中:
,仿真时间为86400s
编写function如下:
function dTdt=demand(x)
% MATLAB Fcn的输入包括Q, Tamb,四个温度
Q=x(1);
Tamb=x(2);
T(1)=x(3);
T(2)=x(4);
T(3)=x(5);
T(4)=x(6);
Cws=1.19e5;
Cwr=5.36e6;
Cf=4.55e7;
Cb=2.25e8;
mw=0.266;
kwf=1160;
kfz=6155;
kb=260;
cw=4200;
dTdt(1)=(mw*cw*(T(2)-T(1))+Q)/Cws;
dTdt(2)=(mw*cw*(T(1)-T(2))+kwf*(T(3)-T(2)))/Cwr;
dTdt(3)=(kwf*(T(2)-T(3))+kfz*(T(4)-T(3)))/Cf;
dTdt(4)=(kfz*(T(3)-T(4))+kb*(Tamb-T(4)))/Cb;
dTdt=dTdt(:);
end
Simulink的框图如下:
对于常微分方程组,Interpreted MATLAB Fcn的四个输出经过积分后,重新反馈作为输入。
在设置中要更改Ouput dimensions,如下所示:
最终计算结果如下所示:
参考资料
[1] https://www.youtube.com/watch?v=QKhy1JsdiUo&t=595s, Solve Differential Equations in MATLAB and Simulink
[2] Clara Verhelst, Study of the optimal control problem formulation for modulating air-to-water heat pumps connected to a residential floor heating system, Energy and Buildings 45 (2012) 43–53