这段代码与之前的evaluateClimateModelLed
代码非常相似,但它是用于评估在HPS(高压钠灯)补光条件下GreenLight模型的气候模拟性能。代码通过加载2010年在荷兰Bleiswijk进行的试验数据,模拟温室中的气候条件(如温度、湿度和CO₂浓度),并将模拟结果与试验数据进行比较。以下是代码的详细解释:
1. 代码背景
- 研究背景:代码基于Katzin等人的研究(2020),该研究评估了在LED和HPS(高压钠灯)补光条件下温室的气候模拟性能。
- 数据来源:代码需要从外部数据文件(
dataLED.mat
和dataHPS.mat
)加载试验数据,这些数据可以通过DOI链接访问。 - 模型用途:GreenLight模型是一个开源的温室模型,用于模拟温室环境中的能量流动、作物生长等。
2. 代码结构
(1) 初始化
simType = 'hps'; seasonLength = 112; % season length in days (data length is 112 days) firstDay = 1; % days since beginning of data
simType
:模拟类型,这里设置为'hps'
,表示使用HPS补光。seasonLength
:模拟的季节长度(112天)。firstDay
:从试验数据的第几天开始模拟。
(2) 加载试验数据
[outdoor, indoor, controls, startTime, filtInd] = loadGreenhouseData(firstDay, seasonLength, simType);
- 加载温室试验数据,包括室外环境数据(
outdoor
)、室内环境数据(indoor
)、控制数据(controls
)、模拟开始时间(startTime
)以及过滤索引(filtInd
)。
(3) 数据预处理
indoor(:,3) = vaporDens2pres(indoor(:,2), indoor(:,3)); % 将水汽密度转换为水汽压力 indoor(:,4) = 1e6*co2ppm2dens(indoor(:,2),indoor(:,4)); % 将CO₂浓度从ppm转换为mg/m³
- 对室内环境数据进行单位转换,以便模型使用。
(4) 创建动态元素
v.tAir = DynamicElement('v.tAir', [floor(indoor(:,1)) indoor(:,2)]); % 温度 v.vpAir = DynamicElement('v.vpAir', [floor(indoor(:,1)) indoor(:,3)]); % 水汽压力 v.co2Air = DynamicElement('v.co2Air', [floor(indoor(:,1)) indoor(:,4)]); % CO₂浓度
- 将试验数据中的温度、水汽压力和CO₂浓度封装为动态元素(
DynamicElement
),以便与模拟结果进行比较。
(5) 计算天空温度和土壤温度
outdoor(:,7) = skyTempRdam(outdoor(:,3), datenum(startTime)+outdoor(:,1)/86400); % 计算天空温度 outdoor(:,8) = soilTempNl(secsInYear+outdoor(:,1)); % 计算土壤温度
- 使用函数
skyTempRdam
和soilTempNl
计算天空温度和土壤温度,并将其添加到室外环境数据中。
(6) 创建GreenLight模型
hps = createGreenLightModel('none', outdoor, startTime, controls, indoor); setParamsBleiswijk2010(hps); setBleiswijk2010HpsParams(hps); % 设置HPS补光参数
- 创建GreenLight模型,并设置Bleiswijk 2010试验的参数和HPS补光参数。
(7) 设置初始作物状态
hps.x.cLeaf.val = 0.7*6240*10; % 初始叶片干重 hps.x.cStem.val = 0.25*6240*10; % 初始茎干重 hps.x.cFruit.val = 0.05*6240*10; % 初始果实干重
- 设置作物的初始状态,包括叶片、茎和果实的干重。
3. 求解模型
solveFromFile(hps, 'ode15s'); % 使用ode15s求解模型 mesInterval = v.tAir.val(2,1)-v.tAir.val(1,1); % 获取测量数据的时间间隔 hps = changeRes(hps,mesInterval); % 设置输出分辨率与测量数据一致
- 使用MATLAB的
ode15s
求解器求解模型,并将输出时间分辨率设置为与试验数据一致。
4. 比较模拟结果与试验数据
(1) 计算相对均方根误差(RRMSE)
mesLength = length(v.tAir.val(:,1)); % 测量数据的长度 simLength = length(hps.x.tAir.val(:,1)); % 模拟数据的长度 compareLength = min(mesLength, simLength); % 取较短的长度进行比较 rrmseTair = sqrt(mean((hps.x.tAir.val(1:compareLength,2)-v.tAir.val(:,2)).^2))./mean(v.tAir.val(1:compareLength,2)); % 温度的RRMSE rrmseVpair = sqrt(mean((hps.x.vpAir.val(1:compareLength,2)-v.vpAir.val(1:compareLength,2)).^2))./mean(v.vpAir.val(1:compareLength,2)); % 水汽压力的RRMSE rrmseCo2air = sqrt(mean((hps.x.co2Air.val(1:compareLength,2)-v.co2Air.val(1:compareLength,2)).^2))./mean(v.co2Air.val(:,2)); % CO₂浓度的RRMSE
- 计算模拟结果与试验数据之间的相对均方根误差(RRMSE),用于评估模型的准确性。
(2) 保存结果
save hpsClimate
- 将模拟结果和误差指标保存到文件
hpsClimate.mat
。
5. 总结
这段代码的主要功能是:
- 加载试验数据并预处理。
- 创建GreenLight模型并设置参数。
- 模拟温室在HPS补光条件下的气候条件(温度、湿度和CO₂浓度)。
- 将模拟结果与试验数据进行比较,并计算相对均方根误差(RRMSE)。
- 保存结果。
通过这段代码,用户可以评估GreenLight模型在HPS补光条件下的气候模拟性能,并验证模型的准确性。与evaluateClimateModelLed
代码的主要区别在于补光类型(HPS vs. LED)和相应的参数设置。