example脚本

这段代码是一个基于 MATLAB 的动态模型示例,用于模拟温室中的植物生长和温度控制。代码的主要目的是展示如何使用 DynamicModel 类来创建、配置和求解动态模型,并比较不同控制策略的效果。以下是代码的详细解释:

1. 创建动态模型对象

matlab
复制
m = DynamicModel();

创建一个新的 DynamicModel 对象 m,用于表示温室系统的动态模型。

2. 定义时间范围

matlab
复制
setTime(m, '01/01/2001 00:00:00', [0 48]);

设置模型的时间范围为 0 到 48 小时,时间标签为 '01/01/2001 00:00:00'

3. 定义参数

matlab
复制
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. 定义输入

matlab
复制
addInput(m, 'rad');
addInput(m, 'tempOut');

添加模型的输入变量,如辐射 (rad) 和外部温度 (tempOut)。

5. 定义状态变量和控制变量

matlab
复制
addState(m, 'dryWeight');
addState(m, 'tempIn');
addControl(m, 'heating');

添加模型的状态变量(如植物干重 dryWeight 和温室内部温度 tempIn)和控制变量(如加热功率 heating)。

6. 定义辅助变量

matlab
复制
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. 设置微分方程

matlab
复制
setOde(m, 'dryWeight', m.a.phot); 
setOde(m, 'tempIn', m.a.heatOut + m.a.heatIn);

设置状态变量的微分方程。植物干重的变化率由光合作用速率决定,温室内部温度的变化率由热损失和加热系统提供的热量决定。

8. 设置控制变量和输入变量的值

matlab
复制
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 和输入变量 radtempOut 的值。radtempOut 是随时间变化的正弦函数。

9. 设置初始状态

matlab
复制
setVal(m.x.dryWeight, 1); % kg m^{-2} 
setVal(m.x.tempIn, 10); % degC

设置状态变量的初始值,植物干重为 1 kg/m²,温室内部温度为 10°C。

10. 绘制图形

matlab
复制
figure; plot(m.d.rad);
figure; plot(m.d.tempOut);
figure; plot(m.u.heating);
plot(m);

绘制输入变量、控制变量和状态变量的图形。

11. 显示模型信息

matlab
复制
show(m, 'x');
show(m, 'a');
show(m, 'p');

在控制台中显示状态变量、辅助变量和参数的信息。

12. 模拟模型

matlab
复制
mEuler = DynamicModel(m);
solveEuler(mEuler,1);

使用欧拉法 (Euler) 对模型进行数值求解。

13. 比较不同控制策略

  • Bang-Bang 控制:当温度低于 15°C 时,加热功率为最大值;否则为最小值。

  • 高分辨率 Bang-Bang 控制:与 Bang-Bang 控制类似,但时间步长更小。

  • 比例控制:根据温度与目标温度的偏差,按比例调整加热功率。

  • 最优控制:使用 Tomlab 求解器进行最优控制,最大化利润。

14. 计算利润

matlab
复制
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. 绘制结果

matlab
复制
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. 调整图形

matlab
复制
axis([0 50 0 100]);

调整图形的坐标轴范围。

总结

这段代码展示了如何使用 DynamicModel 类来构建和模拟温室系统的动态模型,并比较了不同控制策略(如 Bang-Bang 控制、比例控制和最优控制)的效果。通过计算利润,可以评估不同控制策略的经济效益。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇