使用solaR计算斜面太阳辐照结果与实测值偏差过大问题咨询
问题原因排查
- 单位匹配错误:ERA5陆面模式的逐小时
ssrd(地表下行短波辐射)是小时累计值,单位为J/㎡,你直接当成W/㎡传入了solaR包,两者差3600倍,这是偏差极大的核心原因。1W/㎡ = 3600J/㎡/小时,需要先做单位换算。 - 时区未对齐:ERA5数据默认使用UTC时间,而丹麦站点的实测数据使用中欧时间(UTC+1,冬季无夏令时),你在生成时间序列时未统一时区,导致辐照时间错配1小时,高纬度冬季昼短,1小时的偏移会直接导致峰值完全对不上。
- 散射拆分与斜面转换模型不适配高纬度场景:solaR默认使用Erbs模型拆分总辐照为直射/散射、使用Hay模型计算斜面辐照,这两个模型在高纬度(57°N属于高纬度)冬季低太阳高度角场景下误差较大。
- 反照率设置不符合冬季丹麦地表特征:calcGef默认地表反照率为0.2,丹麦1月多积雪,实际反照率可达0.5~0.8,斜面接收的地面反射辐射占比会高于默认值,进一步带来偏差。
修复代码示例
library(dplyr) library(solaR) library(lubridate) # 1. 修正ERA5 ssrd单位:J/㎡转W/㎡ ssdr_correct <- ssdr / 3600 # 2. 时区统一:ERA5为UTC,站点数据转UTC对齐 sh_dat <- sh_raw %>% transmute( # 站点原始时间为丹麦当地时间,先按当地时间解析再转UTC和ERA5对齐 date = with_tz(dmy_hm(str_sub(date, 0, -7), tz = "Europe/Copenhagen"), tz = "UTC"), G0 = ssdr_correct, Ta = t2m - 273.15 ) # 3. 生成Meteo对象 bdi_df = dfI2Meteo(sh_dat, lat = 57.4, time.col = 'date') # 4. 计算斜面辐照,更换模型、调整反照率 # model参数指定斜面转换模型,选高纬度表现更好的perez模型 # albedo参数调整为冬季积雪场景的0.6 # fDif参数指定散射拆分模型,用Reindl替换默认Erbs gef <- calcGef( lat = 57.4, modeRad = 'bdI', dataRad = bdi_df, beta = 35, model = "perez", albedo = 0.6, fDif = fDifReindl )
模型更换说明
calcGef函数内置了多种辐照计算模型,可直接通过参数调整:
- 斜面辐照转换模型:修改
model参数,可选值包括hay(默认)、perez、reindl、klucher等,高纬度地区优先选perez模型。 - 总辐照散射拆分模型:修改
fDif参数,可选值包括fDifErbs(默认)、fDifReindl、fDifPerez等。 - 优化建议:如果你的ERA5数据同时下载了直接辐射、散射辐射产品,可以直接传入这两个字段,跳过拆分步骤,误差会比从总辐照拆分小很多。
内容的提问来源于stack exchange,提问作者Blaiso
相关产品推荐
相关产品推荐

