这段代码是一个基于 MATLAB 的动态模型示例,用于模拟温室中的植物生长和温度控制。代码的主要目的是展示如何使用 DynamicModel
类来创建、配置和求解动态模型,并比较不同控制策略的效果。以下是代码的详细解释:
1. 创建动态模型对象
m = DynamicModel();
创建一个新的 DynamicModel
对象 m
,用于表示温室系统的动态模型。
2. 定义时间范围
setTime(m, '01/01/2001 00:00:00', [0 48]);
设置模型的时间范围为 0 到 48 小时,时间标签为 '01/01/2001 00:00:00'
。
3. 定义参数
addParam(m, 'lue', 7.5e-8); addParam(m, 'heatLoss', 1); addParam(m, 'heatEff', 0.1); addParam(m, 'gasPrice', 4.55e-4); addParam(m, 'lettucePrice', 136.4); addParam(m, 'heatMin', 0); addParam(m, 'heatMax', 100);
添加模型的参数,如光利用效率 (lue
)、热损失系数 (heatLoss
)、加热效率 (heatEff
)、燃气价格 (gasPrice
)、生菜价格 (lettucePrice
)、最小和最大加热功率 (heatMin
, heatMax
)。
4. 定义输入
addInput(m, 'rad'); addInput(m, 'tempOut');
添加模型的输入变量,如辐射 (rad
) 和外部温度 (tempOut
)。
5. 定义状态变量和控制变量
addState(m, 'dryWeight'); addState(m, 'tempIn'); addControl(m, 'heating');
添加模型的状态变量(如植物干重 dryWeight
和温室内部温度 tempIn
)和控制变量(如加热功率 heating
)。
6. 定义辅助变量
addAux(m, 'phot', m.p.lue.*m.d.rad.*m.x.tempIn.*m.x.dryWeight); addAux(m, 'heatOut', m.p.heatLoss.*(m.d.tempOut - m.x.tempIn)); addAux(m, 'heatIn', m.p.heatEff.*m.u.heating);
定义辅助变量,如光合作用速率 (phot
)、温室热损失 (heatOut
) 和加热系统提供的热量 (heatIn
)。
7. 设置微分方程
setOde(m, 'dryWeight', m.a.phot); setOde(m, 'tempIn', m.a.heatOut + m.a.heatIn);
设置状态变量的微分方程。植物干重的变化率由光合作用速率决定,温室内部温度的变化率由热损失和加热系统提供的热量决定。
8. 设置控制变量和输入变量的值
time = (0:48)'; setVal(m.u.heating, [time zeros(size(time))]); setVal(m.d.rad, [time max(0, 800*sin(4*pi*time/48-0.65*pi))]); setVal(m.d.tempOut, [time 15+10*sin(4*pi*time/48-0.65*pi)]);
设置控制变量 heating
和输入变量 rad
、tempOut
的值。rad
和 tempOut
是随时间变化的正弦函数。
9. 设置初始状态
setVal(m.x.dryWeight, 1); % kg m^{-2} setVal(m.x.tempIn, 10); % degC
设置状态变量的初始值,植物干重为 1 kg/m²,温室内部温度为 10°C。
10. 绘制图形
figure; plot(m.d.rad); figure; plot(m.d.tempOut); figure; plot(m.u.heating); plot(m);
绘制输入变量、控制变量和状态变量的图形。
11. 显示模型信息
show(m, 'x'); show(m, 'a'); show(m, 'p');
在控制台中显示状态变量、辅助变量和参数的信息。
12. 模拟模型
mEuler = DynamicModel(m); solveEuler(mEuler,1);
使用欧拉法 (Euler
) 对模型进行数值求解。
13. 比较不同控制策略
-
Bang-Bang 控制:当温度低于 15°C 时,加热功率为最大值;否则为最小值。
-
高分辨率 Bang-Bang 控制:与 Bang-Bang 控制类似,但时间步长更小。
-
比例控制:根据温度与目标温度的偏差,按比例调整加热功率。
-
最优控制:使用 Tomlab 求解器进行最优控制,最大化利润。
14. 计算利润
mProfit = mEuler.p.lettucePrice.val*mEuler.x.dryWeight.val(end,2)-mEuler.p.gasPrice.val*trapz(mEuler.u.heating); rbProfit = ruleBased.p.lettucePrice.val*ruleBased.x.dryWeight.val(end,2)-ruleBased.p.gasPrice.val*trapz(ruleBased.u.heating);
计算不同控制策略下的利润,利润由生菜销售收入减去燃气成本决定。
15. 绘制结果
figure; subplot(2,1,1); plot(mEuler.x.tempIn); grid; hold on; plot(ruleBased.x.tempIn); legend('tempIn no heating','tempIn bang bang heating');
绘制不同控制策略下的温室内部温度变化。
16. 调整图形
axis([0 50 0 100]);
调整图形的坐标轴范围。
总结
这段代码展示了如何使用 DynamicModel
类来构建和模拟温室系统的动态模型,并比较了不同控制策略(如 Bang-Bang 控制、比例控制和最优控制)的效果。通过计算利润,可以评估不同控制策略的经济效益。