这段代码是一个完整的温室气候模型模拟流程,用于加载数据、设置模型参数、运行模拟并保存结果。以下是代码的详细解释:
代码逻辑
1. 模拟参数设置
-
absTol
和relTol
: 设置数值求解器的绝对容差和相对容差。 -
maxStep
: 设置数值求解器的最大步长。 -
simType
: 模拟类型(例如'hps'
表示高压钠灯照明系统)。 -
filter
: 数据过滤类型(例如'none'
表示不进行过滤)。 -
simRes
和ctrlRes
: 模拟和控制的时间分辨率(以秒为单位)。 -
scenBegin
和scenEnd
: 模拟场景的起始和结束索引。 -
seasonLength
: 模拟的季节长度(以天为单位)。 -
firstDay
: 数据开始的日期(以天为单位)。
2. 加载数据
-
使用
loadGreenhouseData
函数加载温室的环境数据(如室外温度、室内温度、控制参数等)。 -
对加载的数据进行预处理:
-
将水蒸气密度转换为水蒸气压力。
-
将 CO2 浓度从 ppm 转换为 mg/m³。
-
-
提取测量值并存储到
v
结构体中:-
v.tAir
: 空气温度。 -
v.vpAir
: 水蒸气压力。 -
v.co2Air
: CO2 浓度。
-
3. 计算附加数据
-
计算天空温度和土壤温度,并将其添加到
outdoor
数据中。
4. 创建模型
-
使用
createBvModel
函数创建温室模型bv
。 -
根据
simType
设置模型参数(例如setHpsParams
或setLedParams
)。 -
调整模型的其他参数,例如:
-
cLeakage
: 泄漏系数。 -
aRoof
: 屋顶通风面积。 -
kBlScr
和kThScr
: 黑屏和保温屏的流量系数。 -
cWgh
和cDgh
: 通风系统的风压系数和排放系数。 -
初始化作物的碳含量(叶、茎、果实)。
-
5. 运行模拟
-
使用
ode15s
求解器运行模拟:options = odeset('Vectorized','on','AbsTol', absTol, 'RelTol', relTol, 'MaxStep', maxStep); makeScript(bv,'localhps.m','localhps'); localhps(bv, 'ode15s', options); delete('localhps.m');
-
模拟完成后,调整模型的时间分辨率(
changeRes
函数)。
6. 计算误差指标
-
计算空气温度、水蒸气压力和 CO2 浓度的相对均方根误差(RRMSE):
rrmseTair = sqrt(mean((bv.x.tAir.val(:,2)-v.tAir.val(:,2)).^2))./mean(v.tAir.val(:,2)); rrmseVpair = sqrt(mean((bv.x.vpAir.val(:,2)-v.vpAir.val(:,2)).^2))./mean(v.vpAir.val(:,2)); rrmseCo2air = sqrt(mean((bv.x.co2Air.val(:,2)-v.co2Air.val(:,2)).^2))./mean(v.co2Air.val(:,2));
7. 保存结果
-
将模拟结果保存到文件中:
save(saveTo);
8. 提示音
-
使用
beep
函数发出提示音,表示模拟完成。
关键点
-
数据加载与预处理:
-
从外部数据源加载温室环境数据,并进行必要的单位转换和计算(如水蒸气压力、CO2 浓度、天空温度、土壤温度)。
-
-
模型创建与参数设置:
-
根据模拟类型(HPS 或 LED)设置模型参数。
-
调整通风系统、加热系统、作物生长等参数,以反映不同照明系统的影响。
-
-
模拟运行:
-
使用数值方法(
ode15s
)求解模型的微分方程,模拟温室环境的动态变化。 -
通过
makeScript
和localhps
函数生成并运行模拟脚本。
-
-
误差计算:
-
计算空气温度、水蒸气压力和 CO2 浓度的相对均方根误差(RRMSE),用于评估模型的准确性。
-
-
结果保存:
-
将模拟结果保存到文件中,便于后续分析和比较。
-
总结
这段代码的主要功能是加载数据、设置模型参数、运行温室气候模型模拟,并保存结果。通过调整参数和运行模拟,可以分析不同照明系统(如 HPS 和 LED)对温室环境的影响。代码结构清晰,功能明确,便于扩展和修改。