简介:这是面向2023年高教社杯全国大学生数学建模竞赛A题的定日镜场优化设计模型资源包,适合参赛学生与数学建模爱好者系统学习。内容以Matlab代码为核心,配套Word文档解析,完整呈现从太阳轨迹模拟到镜面朝向优化、能量产出与成本评估的建模链路。压缩包共23个文件,以xml文档结构、png示意图、jpg图片及rels关系文件为主,便于对照阅读与二次修改,整体仅844KB,轻量易获取。目前已有40人浏览学习。资源包不仅提供可直接运行的Matlab程序,还包含模型构建思路、参数迭代方法和结果可视化说明,帮助读者理解多学科交叉优化问题的求解流程,缩短备赛周期,提升综合建模能力。 定日镜场优化设计,这个题目在数学建模竞赛圈子里算是典型的"看着物理、做着几何、考的是优化"的综合型赛题。2023年高教社杯A题一出,很多队伍的第一反应是先去查塔式太阳能光热发电的原理,然后找一堆文献准备搞复杂的热力学仿真,结果做到一半发现,真正把你卡死的不是热力学,而是几何关系、坐标变换和优化搜索的那点“基本功”。这篇文章我打算把定日镜场优化设计的核心建模思路、光学效率计算的细节坑,以及Matlab实现过程中最容易被忽视的问题,完整拆一遍。适合正在备战数学建模国赛、对塔式光热电站感兴趣,或者想搞清楚怎么用Matlab做大规模参数优化的同学。
1. 问题理解与整体建模思路
1.1 定日镜场是什么
定日镜场是塔式太阳能光热发电系统的“聚光阵列”。每面定日镜其实是一面可以自动跟踪太阳的平面反射镜,它把太阳光反射到吸热塔顶端的吸热器上,吸热器里的熔盐或水被加热,再通过蒸汽循环发电。整片镜场由几百面到上万面定日镜组成,镜子的位置、大小、高度、朝向都会影响反射到塔顶的能量。这里面的关键问题是:总反射能量越高越好,但镜场占地面积、镜子成本、阴影遮挡损失也都上来了,所以本质上是一个多变量、多约束、强耦合的优化问题。
国赛A题把这个问题做了高度简化,给定了小区块的地形尺寸、塔高、吸热器尺寸、镜面尺寸的候选范围等,要求参赛者设计一个镜场布局,使得单位镜面面积的平均输出热功率尽可能大。这个目标函数看起来一句话就能说完,真正做起来需要把“太阳位置-镜子姿态-遮挡关系-能量截断”这一整条物理链路都算清楚。
1.2 建模目标与决策变量
题目给出的优化目标通常是“年平均输出热功率 / 总面积”,也就是让每一平方米镜面贡献的能量最大化。单纯让总功率最大但不控制镜面数量的话,结果往往是铺满一整片地,既不符合工程实际,也会在评审时被质疑。所以目标函数里天然包含了“单位面积效率”的经济性指标。
决策变量主要有三类:
- 镜场的布局参数:每面定日镜的安装位置(通常是圆形或方形网格上的坐标),以及镜面中心的安装高度。
- 定日镜的结构参数:镜面宽度、镜面高度、镜面朝向的初始仰角等。题目可能固定一部分,另一部分让你选。
- 跟踪姿态的隐含变量:每面镜子在某个时刻的方位角和仰角,虽然是由太阳位置和镜子位置计算出来的中间量,但它们直接决定余弦效率,属于“随时刻变化”的隐藏决策变量。
这里最关键的建模判断是:题目要求的是“全年平均”最优,还是“某个代表日”最优?真实赛题一般会用春分、秋分、夏至、冬至以及若干时间点加权平均来近似全年。很多队伍在这一点上栽跟头,只算夏至日正午,结果得出满场都是大镜子的错误方案。正确的做法是先把题目给的时间点列全,统计太阳高度角和方位角,再按权重算平均。
1.3 为什么这题容易做崩
我见过大量队伍在思路上是清晰的,但程序一跑起来就崩,原因集中在三个地方:
第一,坐标系统一问题。定日镜的位置坐标、塔基坐标、太阳光线方向矢量、反射光线方向矢量,这些必须在同一个坐标系下处理。有人用的是地理坐标系(东、北、天),有人用平面直角坐标,还有人混用,结果余弦效率算出来全是负的或者在0.8到1.0之间来回跳。
第二,阴影遮挡效率。这是整个题目里最容易拿分也最容易扣分的地方。容易拿分是因为它物理概念明确,计算扣分是因为很多队伍把它处理得过于粗糙:要么完全忽略,要么用一个全局系数近似,导致优化结果明显失真。
第三,优化规模。如果按每个镜面坐标作为一维变量交给遗传算法或粒子群直接搜索,几百面镜子的优化问题会变成一个几千维的连续优化,算法收敛极慢,而且容易过拟合到某个代表日。正确分解思路应该是:先用确定性方法或者网格搜索确定镜场布局的“大致形状”,再用智能算法对局部参数做微调。
2. 光学效率计算的几个坑
2.1 余弦效率计算公式
余弦效率是定日镜场的基础效率,它描述的是:一束平行的太阳光打到镜面上,镜面反射到塔顶的过程中,由于镜面相对入射光线倾斜,镜面有效投影面积会缩水。它的物理公式比较简单:
η_cos = cos(入射光线与镜面法线的夹角)
也有人用“入射光线单位矢量”和“反射光线单位矢量”的夹角来算,公式是:
η_cos = sqrt((1 + dot(I, R)) / 2)
其中I是太阳入射光线的单位方向矢量(指向太阳方向,朝镜子入射方向),R是从镜子指向吸热器的单位方向矢量。这个公式是稳定且不需要求法线的。我建议直接用这个形式,不容易出错。
这里有个概念性误区:入射光线与镜面法线的夹角不是太阳高度角,也不是镜面仰角,而是由太阳入射方向和镜面法线方向共同决定的。所以必须先算太阳位置,再算每面镜子的法线矢量,最后才能得到余弦效率。
2.2 阴影遮挡效率的两个层面
阴影和遮挡在定日镜场里是两件事:阴影是前方镜子的影子落在后方镜子上,导致入射光被挡住;遮挡是反射光在去往塔顶的路上被前方镜子挡住。不过实际计算时,往往统一用一个几何投影方法来处理。
一个实用算法是“网格化镜面投影”:把每面镜子离散成若干小网格点,依次计算“该网格点是否能被太阳照亮”(阴影检测)以及“从该网格点反射的光线能否到达吸热器”(遮挡检测)。如果都成立,该网格才算有效反射面积。这个方法的缺点是计算量大,但优点是准确、可控,而且一旦写好了,在后续的优化迭代里可以直接复用。
另一种更常用的简化方法是“平面几何法”:假设所有镜面是共面或近似共面的,用投影多边形之间的相交面积来计算效率。竞赛阶段用这种方法比较稳妥。
我自己在赛题里采用的是折中策略:先把全场镜子按离塔距离分成若干环带,环带内近似认为太阳方位角一致,用相邻镜面的相对位置关系判断阴影遮挡的“二元状态”,然后对结果做平滑修正。这样既保留了主要物理规律,又不会让程序慢到无法优化。
2.3 大气透射率与截断效率
大气透射率描述太阳光在镜面到吸热器这段路程中被大气吸收和散射的比例。距离越远,透射率越低。不同文献给出的公式不同,一般用指数衰减形式:
τ_atm = 0.99321 - 0.0001176 * d + 1.97e-8 * d^2(d为距离)
这里的d单位是米。如果距离在1000米以内,透射率基本在0.85到0.99之间,很多人为了省事直接设成0.95左右,这在精度要求不高的优化里确实够用。但如果题目给出的塔高很高、镜场半径很大,忽略距离相关的变化会导致外围镜子的效率被高估,进而误导布局优化。
截断效率则是“反射光斑落进吸热器接收窗口的比例”。严格来说,要用光学仿真工具去卷积高斯光斑,但竞赛阶段可以用简化模型:根据镜面到吸热器距离、镜面尺寸、太阳光束发散角,估算光斑尺寸,再与吸热器尺寸比较。如果光斑远大于吸热器窗口,截断效率就会很低。这个指标对“镜子不能太小也不能太大”有很强约束:镜子太小,反射能量少;镜子太大,光斑大,截断效率低。优化结果就会收敛到某个中间尺寸。
3. 优化方案与Matlab实现细节
3.1 两种优化思路对比:枚举搜索 vs 智能算法
这个赛题最终是优化问题,所以选优化方案特别关键。常见的优化思路有两类:
一类是基于布局模式的网格搜索。定日镜场最常见的布局是环形布局,即沿塔心向外扩散的若干圈镜环,同一环上的镜子等间距分布。这时候优化变量可以压缩成环数、环间距、每环镜面数量、镜面尺寸等几个标量,用枚举或模式搜索就可以得到不错的解。这个方法速度快、稳定、容易解释,适合初赛快速出结果。
另一类是完全自由布局,用遗传算法或粒子群直接优化每面镜子的坐标。这种方法理论上能找到更好的解,但计算量极大,而且结果对初始参数很敏感。我见过有人用粒子群优化120面镜子,跑了三个小时,最后结果和环形布局差不多,还多了许多重叠镜面。所以建议把智能算法作为第二阶段优化工具,在网格搜索得到的布局基础上做局部微调。
3.2 目标函数的向量化实现
Matlab程序里最影响速度的通常是目标函数。如果你写一个for循环,逐面镜子去算效率,几百面镜子再乘上几十个时刻,运行速度会非常感人。正确做法是向量化。
你可以把所有镜面的坐标存成一个N×2矩阵,太阳位置角标量,然后用矩阵运算一次算出每面镜子的入射方向、反射方向、余弦效率、距离、大气透射率和截断效率。这样目标函数一次调用就可以返回所有时刻的总能量。
以余弦效率为例,代码大约是这样的:
% sun_pos: 1x3 单位向量,指向太阳 % mirror_pos: Nx3 矩阵,每行一面镜子坐标 % tower_top: 1x3 吸热器中心坐标 I = repmat(sun_pos, N, 1); % 入射方向(指向太阳) R = tower_top - mirror_pos; % 反射方向(指向塔顶) R = R ./ vecnorm(R, 2, 2); % 归一化 cos_theta = sqrt((1 + dot(I, R, 2)) / 2);这个代码比for循环快一个数量级。而且我建议把“全年时间点”也向量化:把所有时刻的太阳位置一次性生成,再在当前时刻内同时计算所有镜子,形成“时刻×镜子”的矩阵运算。这样目标函数的数据流是规整的,后续做优化也方便。
3.3 关键代码模块划分
我写这套Matlab代码时,是按“数据输入—太阳位置—单时刻效率—全年加权—优化主循环”五个模块来划分的:
- 数据输入模块:读取场地尺寸、塔高、吸热器尺寸、镜面参数候选范围。
- 太阳位置模块:输入年积日、时刻、纬度、经度,输出太阳高度角和方位角,进一步转成方向余弦向量。这个模块要单独写好,并反复验证。
- 单时刻效率模块:输入太阳方向、镜子坐标、塔顶坐标,输出余弦效率、阴影遮挡效率、大气透射率、截断效率以及总输出功率。
- 全年加权模块:按题目给出的代表时刻和权重,计算全年平均输出功率。
- 优化主循环模块:调用fmincon、ga或patternsearch,循环调整布局参数,直到收敛。
其中太阳位置模块是硬骨头。如果你对天文学公式不熟,建议直接使用Matlab自带的Solar Position计算函数,或者自己实现一个简化版(基于太阳赤纬和时角的标准天文算法),但必须验证正午太阳高度角和实际值能对上。我在赛题调试时发现,太阳方位角定义不一致是最常见的错误源:有的公式从北方顺时针量,有的从南方顺时针量,如果你的反射光线计算恰好用了不同基准,结果会整体偏离。
另外,代码里最好把“单位”统一成米和度。坐标用米,角度在计算前转弧度,所有函数入口都明确注释,避免后期反复试错。
4. 常见问题与调试技巧实录
4.1 计算结果不合理:先检查太阳位置
很多队伍第一天跑出来全年输出功率是负的或者大得离谱,最常见的根因就是太阳位置算错了。我建议写一个简单验证:把某日正午的太阳高度角和当地实际值对比。如果差了10度以上,说明赤纬角或时角公式有问题。另外一个常见问题是太阳方向矢量的方向搞反了:入射方向应该“从太阳指向镜场”,而不是“从镜面指向太阳”。
如果太阳位置没问题,再看余弦效率是否在0到1之间。如果余弦效率超过1,说明单位向量点积那里错了。这个错误通常在反射方向R的归一化上:没有做归一化,直接把距离向量拿去点积,结果肯定错。
4.2 阴影遮挡计算太慢
阴影遮挡效率是程序最耗时的部分。如果用网格化投影方法,每面镜子划分成10×10=100个网格点,整个镜场500面镜子,一个时刻就要做500万次判断,全年时间点再乘上20,那基本没法跑优化。
解决思路有三个:
第一,减少网格密度。赛题精度要求下,每面镜子分成5×5或6×6就够,优先保证相对趋势正确。第二,预计算遮挡邻域表。对每面镜子,先找出可能遮挡它的“邻居镜子”,只对邻居做遮挡判断,而不是全厂面面俱到。第三,在优化迭代早期使用更粗糙的阴影遮挡近似,到后期再切换到精确计算。这样可以兼顾速度和精度。
4.3 优化不收敛或收敛到很差的结果
优化不收敛有两种情况:一种是一开始就不收敛,说明目标函数有太多局部极值或存在无解区域;另一种是收敛得很快但结果很差,说明设计变量之间的量纲差异太大。解决方法是对变量做归一化,让每个变量的取值范围都映射到0到1附近。比如镜面尺寸范围是3到10米,那么就用(x - 3) / 7作为优化变量。
另外,遗传算法或粒子群对种群大小和迭代次数很敏感。我在实测中发现,种群规模设为变量数的10倍以上,迭代次数至少200代,结果才比较稳定。如果还不行,可以考虑增加“精英保留”策略,把每代最优的几个解直接保留到下一代。
4.4 Matlab版本与工具箱问题
这个赛题用到的优化工具箱函数(ga、fmincon、patternsearch)在大多数Matlab版本里都有,但部分离线安装的Matlab可能没有全局优化工具箱(Global Optimization Toolbox),导致ga函数报错。建议写代码时先用fmincon验证整体流程,再切换ga做全局搜索,这样即使工具箱不齐全也能保证基本结果。
另外,代码里避免使用某些新版本才有的函数(比如vecnorm在较老版本也能用,但如果你不放心,可以用sqrt(sum(X.^2, 2))自己写),这样可以方便队友的电脑直接跑起来。
4.5 常见问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 余弦效率大于1 | 反射方向未归一化 | 对R做归一化 |
| 全年输出功率为零 | 太阳位置方向算反 | 验证正午太阳高度角 |
| 阴影遮挡效率不合理 | 邻居表未更新 | 每次迭代后重建邻居表 |
| 程序运行极慢 | 网格投影网格过密 | 降到5×5,增加预计算 |
| 优化收敛到同一布局 | 种群太小或变量未归一化 | 扩大种群,变量归一化 |
5. 个人经验与扩展建议
我强烈建议把“阴影遮挡效率”作为全题的胜负手。很多获奖论文的精髓并不在于用了多高深的算法,而是把阴影遮挡这件事算得比别人更贴近物理。你可以用一个简化图形来验证:在某一时刻随机选取三四面相邻的镜子,手动画出它们的投影关系,和程序结果对比。如果这关能过,那么整道题的计算逻辑基本就稳了。
这套定日镜场模型的价值不光在于竞赛本身。塔式光热电站的定日镜场设计在实际工程中也要面对同样的问题,只不过镜子数量更多、地形更复杂、控制策略更精细。竞赛阶段学会的“目标函数构造—几何光学计算—优化迭代”这个完整链路,在后续做光学仿真、能源系统规划甚至机器人路径规划时都是通用的。如果你有兴趣,后续还能往两个方向扩展:一是加入风速、云量等气象随机性,做鲁棒优化;二是把吸热器的流动传热过程耦合进来,从“场的优化”升级为“系统与场的一体化优化”。我个人的经验是,这种赛题最大的收获不是拿奖,而是真正把“看到一个工程现象—抽象成模型—用代码求解—验证工程合理性”这套方法论练熟了。当你有一天面对完全陌生的问题时,这套方法论会替你做判断的。
本文还有配套的精品资源,点击获取