这段代码的主要目的是评估在LED补光条件下GreenLight模型的能源使用情况。代码通过加载2010年在荷兰Bleiswijk进行的试验数据,模拟温室中的加热需求,并将模拟结果与试验中计算的加热数据进行比较。以下是代码的详细解释:
1. 代码背景
- 研究背景:代码基于Katzin等人的研究(2020),该研究评估了在LED和HPS(高压钠灯)补光条件下温室的加热需求。
- 数据来源:代码需要从外部数据文件(
dataLED.mat
和dataHPS.mat
)加载试验数据,这些数据可以通过DOI链接访问。 - 模型用途:GreenLight模型是一个开源的温室模型,用于模拟温室环境中的能量流动、作物生长等。
2. 代码结构
(1) 初始化
tic;
- 启动计时器,用于记录代码运行时间。
(2) 设置模型参数
setPointAdd = 0.5; % Addition to the set point to make sure the proportional controller really achieves the desired temperature simType = 'led'; seasonLength = 112; % season length in days (data length is 112 days) firstDay = 1; % days since beginning of data
setPointAdd
:温度设定点的附加值,用于确保比例控制器能够达到目标温度。simType
:模拟类型,这里设置为'led'
,表示使用LED补光。seasonLength
:模拟的季节长度(112天)。firstDay
:从试验数据的第几天开始模拟。
(3) 加载试验数据
[outdoor, indoor, controls, startTime] = loadGreenhouseData(firstDay, seasonLength, simType);
- 加载温室试验数据,包括室外环境数据(
outdoor
)、室内环境数据(indoor
)、控制数据(controls
)以及模拟开始时间(startTime
)。
(4) 数据预处理
indoor(:,3) = vaporDens2pres(indoor(:,2), indoor(:,3)); % 将水汽密度转换为水汽压力 indoor(:,4) = 1e6*co2ppm2dens(indoor(:,2),indoor(:,4)); % 将CO₂浓度从ppm转换为mg/m³
- 对室内环境数据进行单位转换,以便模型使用。
(5) 计算天空温度和土壤温度
outdoor(:,7) = skyTempRdam(outdoor(:,3), datenum(startTime)+outdoor(:,1)/86400); % 计算天空温度 outdoor(:,8) = soilTempNl(secsInYear+outdoor(:,1)); % 计算土壤温度
- 使用函数
skyTempRdam
和soilTempNl
计算天空温度和土壤温度,并将其添加到室外环境数据中。
(6) 创建GreenLight模型
led = createGreenLightModel('none', outdoor, startTime, controls, indoor); setParamsBleiswijk2010(led); setBleiswijk2010LedParams(led); % 设置LED补光参数
- 创建GreenLight模型,并设置Bleiswijk 2010试验的参数和LED补光参数。
(7) 设置加热控制
led.d.heatSetPoint = DynamicElement('d.heatSetPoint', indoor(:,1:2)); % 使用测量温度作为设定点 addControl(led, 'boil', proportionalControl(x.tAir, led.d.heatSetPoint+setPointAdd, led.p.tHeatBand, 0, 1)); % 添加锅炉控制 addControl(led, 'boilGro', proportionalControl(x.tAir, led.d.heatSetPoint+setPointAdd, led.p.tHeatBand, 0, 1)); % 添加生长管道控制
- 设置温室的加热控制逻辑,使用比例控制器调节锅炉和生长管道的加热。
(8) 设置初始作物状态
led.x.cLeaf.val = 0.7*6240*10; % 初始叶片干重 led.x.cStem.val = 0.25*6240*10; % 初始茎干重 led.x.cFruit.val = 0.05*6240*10; % 初始果实干重
- 设置作物的初始状态,包括叶片、茎和果实的干重。
3. 求解模型
solveFromFile(led, 'ode15s'); % 使用ode15s求解模型 led = changeRes(led,300); % 设置输出分辨率为5分钟
- 使用MATLAB的
ode15s
求解器求解模型,并将输出时间分辨率设置为300秒(5分钟)。
4. 比较模拟结果与试验数据
(1) 设置管道温度
led.d.tPipe.val(:,2) = controls(:,5); % 设置管道温度 led.d.tGroPipe.val(:,2) = controls(:,6); % 设置生长管道温度
- 将试验数据中的管道温度和生长管道温度输入到模型中。
(2) 计算能量输入
led.d.uPipe = DynamicElement('d.uPipe', [led.d.tPipe.val(:,1), pipeEnergy(controls(:,5)-indoor(:,2))]); % 计算管道能量输入 led.d.uGroPipe = DynamicElement('d.uGroPipe', [led.d.tPipe.val(:,1), groPipeEnergy(controls(:,6)-indoor(:,2))]); % 计算生长管道能量输入
- 根据试验数据计算管道和生长管道的能量输入。
5. 绘制结果
plot(300e-6*cumsum(led.a.hBoilPipe+led.a.hBoilGroPipe)); % 绘制模拟的加热输入 hold on plot(300e-6*cumsum(led.d.uPipe+led.d.uGroPipe)); % 绘制试验数据计算的加热输入 legend('simulated','calculated from data');
- 绘制模拟的加热输入和试验数据计算的加热输入,并进行比较。
6. 计算相对误差
eMeas = 1e-6*trapz(led.d.uPipe+led.d.uGroPipe); % 试验数据的总能量输入 eSim = 1e-6*trapz(led.a.hBoilPipe+led.a.hBoilGroPipe); % 模拟的总能量输入 errorRatio = eSim./eMeas; % 计算相对误差
- 计算模拟结果与试验数据之间的相对误差。
7. 保存结果
toc;
save ledEnergy
- 停止计时器并保存模拟结果到文件
ledEnergy.mat
。
总结
这段代码的主要功能是:
- 加载试验数据并预处理。
- 创建GreenLight模型并设置参数。
- 模拟温室在LED补光条件下的加热需求。
- 将模拟结果与试验数据进行比较,并计算相对误差。
- 绘制结果并保存。
通过这段代码,用户可以评估GreenLight模型在LED补光条件下的性能,并验证模型的准确性。