资讯动态

光学硕博必备:仿真+算法重构光学设计工作流

发布时间:2026/10/20 23:51:27 来源:尧图企业网站定制
最近我越来越确认一件事光学方向的同学如果不尽快把“仿真 算法”这套工作流捡起来接下来三五年会很被动。这不是贩卖焦虑而是我已经不止一次在组会、项目评审和行业交流里看到同样一种信号以前光学设计靠经验、靠软件里手动调参数现在越来越多课题和岗位要求你把整个光学系统当成一个“可计算的函数”交给优化器、交给数据驱动方法去迭代。说白了这项能力正在从“加分项”变成“默认配置”早晚会像用手机拍照一样成为大家默认掌握的东西。这篇东西不是教材也不是论文导读我想以这些年实际接触光学仿真、计算成像和智能优化项目的经验把“为什么光学硕博需要这套能力”“这套能力由哪几个核心部分组成”“从零怎么做通一个小Demo”以及“真正落地时有哪些坑”完整讲一遍。内容会尽量具体到能直接照着敲代码适合光学方向的研究生、博士生以及想往计算光学转型的工程师。看完之后你可以不立刻精通但至少能建立起一个正确的工作流框架也知道下一步该往哪儿使劲。1. 为什么这件事正在变成光学硕博的必修课1.1 传统光学设计流程的瓶颈我刚接触镜头设计时最大的感触是这活儿非常像“靠手艺熬经验”。标准流程大家都熟——拿到指标以后先查专利或者翻手册找一个初始结构然后在光学设计软件里手动调曲率半径、镜片间距、玻璃材料再跑一次点列图或MTF看结果不行就继续调直到像质看起来差不多。导师经常说的那句“你再试试”背后其实是设计变量太多、人脑根本顾不过来。传统流程的问题不在于它错了而在于它对人的经验依赖太重而且在真实的高维参数空间里效率低得惊人。一个普通的三片式镜头可调变量至少包括七八个曲率半径、两三个镜片间距、三四个折射率和阿贝数这已经是一个十几维的优化问题。人手动调参本质上是在一个很小的邻域里做局部搜索得到的往往是“附近还不错”的解不是“全局意义上更优”的解。更要命的是光学系统的可行域很不规则镜片厚度太薄加工不了、边缘太厚装夹不了、后焦距离不够放不下探测器这些约束叠加在一起之后人工试错基本只能靠运气。我参与过的项目里有一类典型的场景工程师在软件里调了一整天最后找到一组参数RMS波前误差勉强达标但没有底气说这组参数是不是最优的。后来我们把这同一个设计问题脚本化用优化器从几十个随机初始点出发跑了一个晚上找出来的解在像质上比人工方案好出一个量级而且顺带满足了所有加工约束。那一次之后我就明白传统流程不是不能用而是天花板太明显——人的经验和直觉很重要但不应该让它们去做本该由算法完成的暴力搜索。1.2 计算光学带来的范式变化真正让这件事发生质变的是“计算光学”这个概念的普及。以前设计一个成像系统大家默认的优化目标是“镜头本身的像质”比如像差最小、MTF最高。但现在的系统越来越倾向端到端设计镜头只是个前端物理器件后面还有探测器、图像信号处理、甚至深度学习重建算法整个链路放在一起决定最终图像质量。在这种思路下镜头设计不再是孤立环节而是整个成像链路上的一个可调模块。比如允许镜头保留一定程度的像差让后端的解卷积算法去补偿整体成像效果可能更好同时镜头可以做得更轻、更小、成本更低。手机计算摄影就是最典型的例子很多镜头设计指标已经从“纯光学衍射极限”转向“全链路信噪比最优”。换句话说你优化的对象从“镜头的PSF”变成了“整个成像系统的输出质量”这时候你就必须能把物理模型和算法模型放在同一个优化框架里让两者联合迭代。这对光学研究生的冲击是根本性的。只会在软件里调镜头、看不懂代码、不会构建端到端模型已经很难参与当前最活跃的那批研究方向。反过来如果你能把光线追迹写成函数把像质评价写成损失函数把设计变量交给优化器去迭代那你就获得了和算法工程师协同工作的接口这恰恰是当前很多论文做“深度光学”“可微成像系统”的基本姿势。1.3 早已跑起来的落地场景如果你觉得这只是“高校发论文的新玩法”那就低估了这件事。业界有大量场景已经在用“光学 算法”联合设计的思路来解决问题。手机影像就不多说了多摄像头融合、基于深度学习的去模糊、超分、夜景降噪这些方向里有相当一部分优化工作是在镜头设计阶段就考虑后端算法的。显微成像领域傅里叶叠层显微成像、结构光照明显微、自适应光学校正几乎每一个都依赖精确的物理模型和重建算法配合研究者自己写仿真代码是基本要求。光刻相关技术里光源、掩模与光刻工艺的联合优化早就成为常态这类项目的核心工作就是把物理约束变成可计算的数学模型。更不要说激光加工、车载相机、内窥镜、AR显示这些领域不同程度上都在往“物理光学模型 数据驱动算法”这个方向走。所以“之后将成为常态”不是夸张我甚至觉得在很多细分方向已经是“现在时”了。早一点把工作流搭建起来等你毕业求职或者读博做课题的时候至少不会在起跑线上被拉得太远。2. 搭建智能光学工作流要掌握的三根支柱2.1 支柱一能看懂并建模物理系统很多同学一听说“光学要学编程”第一反应就是去背语法、刷题其实这是本末倒置。光学方向的编程是为了表达物理模型代码只是工具核心是你对光学系统本身的理解够不够深。你需要能把一个系统抽象成参数化模型。举个例子一片透镜在你的脑子里不应该只是一个“长那个样子的玻璃块”而是一组可以输出数值的参数集合口径、边缘厚度、中心厚度、前后表面曲率半径、材料折射率、阿贝数、部分色散、表面面形误差。如果你能把这些参数和它们对应的像差贡献关系说清楚比如哪个参数主要影响球差、哪个参数决定匹兹伐场曲、哪个参数和色差强相关那你构建仿真代码时就知道该给优化器留哪些自由度。我经常和组里的同学说不要一上来就只追求调用商业软件接口先把光线追迹这个底层机制弄明白。光的传播无非是直线传播加界面折射一条光线在哪个平面与球面相交、交点处的法线方向怎么算、斯涅尔定律怎么写成一堆向量运算这些事情一旦亲手实现过一遍再回去看仿真软件里的那些操作界面你会发现自己对每个按键背后在算什么心里有底得多。我这里还要特别强调一个概念不要把PSF、MTF当成黑盒指标。它们本质上是波前信息的统计表达是无数条光线或无数个角谱分量经过系统后的结果。只有当你理解这些指标是怎么从光线和波前算出来的你写的损失函数才有明确的物理意义也才知道为什么有时候MTF数值很高但实际成像很差——大概率是视场、波段或离焦加权出了问题。2.2 支柱二用代码把光线追迹变成函数第二根支柱是把整个仿真过程“函数化”。什么意思呢就是让一个仿真任务变成可以反复调用、批量执行的标准接口。输入是一组光学参数输出是一组像质评价指标中间不做人工干预。这个转变看起来简单但作用极大。以前你在软件界面里改一个参数要看一眼像质本质上是“手动循环”现在你把循环交给脚本就能在一个晚上跑几千上万次仿真。很多人的第一个自动化工作流往往是把自己日常手动的过程脚本化比如批量扫描某个曲率半径对MTF的影响或者批量加载几组玻璃材料做色差对比。这些事情在软件界面里做非常痛苦写成脚本后只需要修改循环变量和输出路径。更关键的是函数化让优化成为可能。优化算法本质上需要反复调用评价函数如果你的评价过程还要人工点击鼠标那优化规模就不可能上去。函数化之后你可以用非常标准的优化库去做参数搜索也可以把同一个评价函数套在遗传算法、粒子群、贝叶斯优化这些工具上完全不改变物理模型。我自己的习惯是凡是需要用第二次的仿真过程一定顺手写成函数存进一个公共脚本哪怕是只有一小段计算焦距的代码也不直接堆在临时文件里。到项目后期你就会发现这些不起眼的小函数才是整个工作流里最宝贵的资产因为新想法往往是靠组合这些基础模块快速验证出来的。2.3 支柱三用优化器和数据驱动替代码替经验有了物理模型和函数化接口之后剩下的问题就是“怎么搜索最优参数”。这里有三层工具你可以按复杂度从低到高理解。第一层是通用数值优化器。参数不超过二三十个、物理模型跑一次只要几十毫秒的时候直接用优化库里的阻尼最小二乘、Nelder-Mead或者L-BFGS就够了。这类优化器的特点是实现简单、收敛快缺点是比较依赖初始点容易陷入局部最优。第二层是群体智能算法比如遗传算法、粒子群、CMA-ES。它们不依赖梯度可以做全局范围的粗搜索适合优化器对初值敏感的问题。缺点是收敛慢需要反复调用物理模型如果单次仿真代价高就要谨慎使用。第三层是端到端可微优化这是当前计算光学最值得关注的工具。核心思路是把光线追迹或者PSF计算过程做成可微分的模块这样梯度可以同时流过光学参数和后面的神经网络参数实现真正意义上的联合设计。它们之间不是替代关系而是搭配使用。在我实际接触的项目里常见的套路是先拿遗传算法或CMA-ES在全局范围搜一轮挑出几个有潜力的候选解再用梯度优化器在局部精调最后用完整的仿真流程做验证。这个思路和传统镜头设计的“全局搜索 局部精调 像质评估”逻辑其实一脉相承只不过以前靠人工起初始结构现在靠算法替你铺开覆盖范围。深度学习在这里更像是最后那一层“放大器”当你需要同时优化物理器件和重建算法时它才真正发挥出独特价值但它的前提仍然是前两层工作流扎实。3. 手把手复现一个光学自动优化Demo3.1 Demo任务设定一个双凸透镜的球差优化光讲概念容易飘我直接带你过一个小Demo。这个Demo足够简单两三个小时就能跑通但它包含了完整的工作流骨架后面遇到复杂镜头、多视场、多波长场景时改的无非是参数化对象和损失函数。我们的任务如下设计一片双凸球面透镜材料为最常见的硼硅冕玻璃折射率取常用值1.5168。通光口径20毫米即入射半孔径10毫米目标后顶焦距50毫米工作波长取可见光中心波长587.6纳米。要优化的变量是两个表面的曲率半径R1和R2透镜中心厚度固定为2.5毫米。连接变量表符号含义初始值优化范围R1前表面曲率半径30毫米5 ~ 200毫米R2后表面曲率半径-20毫米-200 ~ -5毫米d透镜中心厚度2.5毫米固定n折射率1.5168固定半孔径光线入射高度0 ~ 10毫米采样符号约定上R正则球心在光线传播方向右侧R负则球心在左侧。双凸透镜意味着R1为正、R2为负这种表示方式和光学设计软件里的习惯是一致的。为什么选这个任务因为双凸透镜的球差特性非常典型曲率分配越接近等双凸球差越小焦距则同时受两个曲率半径控制。这个任务可以通过解析公式手算出来“最优解大致在R1约52毫米、R2约-52毫米附近”所以特别适合用来验证工作流是否正确。如果脚本写对了优化器应该能在不需要任何人工干预的情况下自己搜索到同样趋势的解。3.2 光线追迹模型的实现光线追迹是整个Demo最核心的部分大概分三步求光线与球面的交点、计算交点处的表面法线、用矢量斯涅尔定律计算折射后的方向。下面是核心实现我尽量把注释写清楚。import numpy as np def intersect_sphere(origin, direction, sphere_center, radius): # 计算直线与球面的最近正向交点 oc origin - sphere_center b 2.0 * np.dot(oc, direction) c np.dot(oc, oc) - radius * radius disc b * b - 4.0 * c if disc 0: return None t1 (-b - np.sqrt(disc)) / 2.0 t2 (-b np.sqrt(disc)) / 2.0 t t1 if t1 1e-8 else t2 if t 1e-8: return None return origin direction * t def snell_refract(v_in, normal, n1, n2): # normal指向入射介质一侧v_in为入射方向单位向量 cosI -np.dot(normal, v_in) if cosI 0: normal -normal cosI -np.dot(normal, v_in) eta n1 / n2 sinT2 eta * eta * (1.0 - cosI * cosI) if sinT2 1.0: return None cosT np.sqrt(1.0 - sinT2) v_out eta * v_in (eta * cosI - cosT) * normal return v_out / np.linalg.norm(v_out)这里有一个容易踩坑的细节表面法线方向到底取哪边。我为了让斯涅尔公式始终成立统一让法线指向入射介质一侧。因为入射光从左侧来所以法线的z分量应为负检查几何法线后做一次符号修正即可。这段代码不依赖任何商业软件只需要numpy就能跑。有了这两个基础函数追踪一条平行光线穿过透镜就很直接了。示意图流程是这样的光线从z0处出发方向指向z正方向第一个球面顶点在z0球心在zR1光线与该球面求交后从空气入射到玻璃然后在玻璃内部直线传播到第二个球面第二个球面顶点在z2.5毫米球心在z2.5R2再次做交点计算按玻璃到空气的折射率组合做折射最后在空气中继续传播直到评价平面。评价平面我用近轴焦点位置确定。具体做法是追踪一条入射高度只有0.001毫米的近轴光线求它出射后与光轴相交的z坐标这个位置就近似当成理想焦点平面。然后追踪十几条从0到10毫米不同高度的平行光线计算这些光线到达这个评价平面时离光轴的距离取RMS作为光斑半径。这个量直接反映了轴上球差的大小。光线数建议用16条以上太少的话优化结果会变得不稳定。3.3 损失函数与优化闭环光学模型写好后下一步就是把它封装成优化器能调用的评价函数。参数是R1和R2返回值是一个标量损失值。我习惯把损失函数设计成三项之和焦距偏差项、光斑RMS项、边界惩罚项。def evaluate_lens(params): R1, R2 params # 1. 用近轴光线计算后顶焦距BFL # 2. 追迹多根光线计算评价平面上的RMS弥散斑半径 # 3. 惩罚过厚或过薄的边界情况 bfl compute_bfl(R1, R2) rms compute_spot_rms(R1, R2, num_rays32) loss 0.01 * (bfl - 50.0) ** 2 5.0 * rms # 边界惩罚示例透镜中心厚度固定时可以约束曲率半径差 if R1 5 or R1 200 or R2 -5 or R2 -200: loss 1e6 return loss然后调用通用优化器做搜索。我建议先用多一点随机初始点跑一遍再选最优的结果继续用局部优化器精调这是性价比最高的方案。from scipy.optimize import minimize import random best None best_loss np.inf for _ in range(20): r1 random.uniform(15, 100) r2 -random.uniform(15, 100) res minimize(evaluate_lens, [r1, r2], methodNelder-Mead, options{maxiter: 300}) if res.fun best_loss: best_loss res.fun best res.x print(最优参数 R1%.2f mm, R2%.2f mm % (best[0], best[1]))为什么用多个随机初始点因为光学设计问题普遍是“非凸”的单独一次优化很容易陷进局部最优。多起点优化配合局部精调在工程上是一种稳定有效且极易实现的全局搜索策略。只要单次评价速度快多跑几十次根本不是什么成本问题。这个思想很多光学设计软件里的“锤形优化”也在用只不过现在你自己用Python实现什么约束都能加整个流程透明可控。3.4 运行结果与参数记录这个Demo跑完后典型的趋势是这样的初始参数R130毫米、R2-20毫米时后顶焦距可能偏短只有四十多毫米RMS弥散斑也偏大优化器经过几十轮迭代后会往R1约52毫米、R2约-52毫米的区域移动焦距误差明显减小RMS也同时下降。我把一次典型运行的记录整理成下面这个趋势表注意具体数值会随光线采样数和优化器设置变化但整体走向是一致的。阶段R1毫米R2毫米后顶焦距BFL毫米RMS光斑毫米初始点30-20约43约1.8优化中期40-35约47约1.1收敛后51.5-51.0约50.1约0.3看到这里你应该能感觉到整个流程里没有一个步骤需要人工干预。你只需要把物理模型写对、把损失函数定义清楚、选一个合理的优化策略剩下的搜索工作全部交给代码完成。这正是我想强调的工作流核心——你不再是那个“反复点鼠标的人”而是那个“设计评价规则并启动搜索的人”。如果把这个Demo扩展到三片式镜头无非是多几个曲率半径、间距、玻璃类型损失函数再加一个色差项、场曲项、边缘厚度限制扩展到多视场只需要对每一根主光线都追迹然后把各个视场的像质加权求和扩展到非球面就把曲率半径这个标量参数扩展成一组非球面系数。框架完全一样工作量多了一个量级但思考方式没有变。4. 真正动手后才会遇到的坑4.1 采样不足导致的虚假优化新手最容易犯的错误是优化时用的光线数量太少。为了追求单次评价速度只追迹三五条光线结果优化器很容易“钻空子”把像质变差的部分藏到采样点之间的空隙里。这就好比你要检查一段路面是否平整只踩了三个点恰好都踩在鼓包上得出一个“路很平”的错误结论。我自己的经验是优化过程中至少用16到32条光线最终验证阶段加到上百条。如果做的是MTF评价频率采样和视场采样同样要足够密否则优化出来的解在一两个采样频率上指标很高整体却不堪用。这个坑最隐蔽的地方在于损失值一直在下降你甚至会以为自己得到了一个很棒的设计直到放大点列图才发现光线密集区之外还有一大团离群点。4.2 损失函数“打架”光学系统的像质评价从来不是单目标的。同一个设计里你可能希望焦距准、球差小、场曲平、色差低但这些目标经常互相挤压。如果你把所有目标用一个加权和硬塞进损失函数就会陷入权重的泥潭。权重调高焦距项RMS就放飞权重调高RMS焦距可能跑偏百分之几。很多人卡在这里以为是优化器不行其实是没有处理好目标之间的关系。我常用的方法是分层优化或约束优化。第一阶段先锁死第一优先级的指标比如先把焦距校正到目标值附近第二阶段再把焦距作为硬约束只优化RMS第三阶段再加其他像差指标。也可以用罚函数做软约束但一定要记录优化过程中每一项目标的数值而不是只看总损失。有一次我把RMS权重调得过高优化器为了让RMS降低把焦距拉到偏离目标十几毫米总损失反而“很好看”差点就被这个假像骗过去。4.3 局部最优与多起点策略光学设计问题几乎必然有局部最优这一点无论你用的是商业软件还是自研脚本都无法回避。很多人用完一次优化器发现结果不好就怀疑算法选错了。实际上大多数情况下不是算法的问题而是初始点没有覆盖到有潜力的区域。我建议把“多起点 局部优化”变成默认习惯而不是遇到难题才用。跑批量优化时随机生成几十组初始参数每组都做局部精调最后汇总所有结果挑出Pareto前沿。这个过程听起来费时间实则非常划算因为大部分物理模型单次评价只要毫秒级跑几百上千次完全没压力。大批量搜索的意义不仅在于找到好解更在于让你看清整个参数空间的形状培养对问题难度的直觉。4.4 仿真到加工之间那堵墙仿真优化做得再漂亮最终也要面对加工和装配的现实。光学抛光的曲率公差、镜片中心厚度公差、玻璃折射率批次差异、空气间隔装配误差每一项都会把仿真里的理论像质拉低。很多同学第一次送加工回来后一脸困惑仿真RMS那么小实测怎么差这么多。这不是说仿真没用而是说仿真要提前把公差纳进来。优化收敛后我强烈建议做一个额外的蒙特卡洛分析给每个变量按照典型加工公差加高斯扰动跑几百组仿真统计像质指标的分布。如果设计在公差扰动下像质急剧恶化说明这个解太“脆”根本不适合量产就算仿真值达到衍射极限也白搭。反过来如果你能把公差灵敏度写进损失函数的一部分优化器就会自动避开那些“悬崖式”的脆弱区域这才是面向真实工程的设计。4.5 代理模型的训练域陷阱用深度学习模型替代物理仿真做快速预测是当前很流行的思路我也做过类似的事情。这个思路本身没问题问题出在很多人对训练数据的覆盖范围过于乐观。代理模型在训练数据覆盖范围内能做插值预测一旦跑出这个范围就完全是“自由发挥”有时甚至会给出一组看起来极好、实际完全错误的参数。我见过不止一次组里的同学想用神经网络代理Zemax仿真训练集随机采了几千组参数测试集表现不错于是放心用遗传算法在代理模型上搜索。结果搜出来的“最优解”拿去真仿真一看性能和代理预测差了十万八千里仔细查才发现遗传算法早就把参数跑到了训练域外代理模型在那些区域疯狂乱猜。正确做法是代理模型和真实仿真混合使用代理模型负责快速粗筛候选点真实仿真负责验证和精修同时在搜索过程中不断把新仿真结果加入训练集让模型覆盖范围逐步扩大。说得直接一点代理模型永远只是加速器不能替代物理仿真作为最终的裁判。5. 给光学硕博的落地学习路径5.1 三个月可以走通的路线很多人一看到要学的东西很多就慌了。其实以光学背景学生的底子三个月搭出最小工作流完全够用关键是路线要正确。我自己比较推荐的时间安排是这样的第一个月重点解决“代码表达物理模型”的问题。每天花一两个小时复习几何光学的基础公式同时上手numpy和matplotlib目标是能独立写出一个“平行光经过单透镜聚焦”的仿真脚本。不要贪多不用急着学深度学习更不用背各种晦涩的编程语法。标准是手头有一个能用的trace_system函数你知道怎么改参数也知道怎么画出点列图。第二个月把手上的实际课题局部自动化。无论你是做镜头设计、成像系统还是光学检测一定存在某个环节是重复劳动比如扫描参数、批量计算像差、整理多组仿真结果。把这个环节脚本化体会一下“自动化取代重复操作”的感觉。同时开始接触优化工具用优化器替代手动参数扫描跑出至少一次“自动搜索得到好解”的完整流程。第三个月进入深度学习与计算光学的交叉部分。这个时候再去学PyTorch或TensorFlow理解自动微分和梯度回传能看懂端到端成像系统里“光学参数 算法参数”如何联动优化。不用钻太深但要有能力复现一篇简单的计算光学论文里的关键环节。三个月结束时你手里的武器是物理仿真代码、自动化流程、优化器 一个能跑的深度学习Demo这个组合已经超过很多人了。5.2 最小工具链建议工具链不需要多关键在于能顺畅串起来。我个人项目里最常用的组合如下你可以参考但不用照抄工具用途说明Python numpy科学计算基础矩阵运算、光线追迹、数组处理scipy优化与插值局部优化器、多起点搜索、信号处理matplotlib可视化点列图、MTF曲线、像面亮度分布PyTorch / TensorFlow深度学习可微光学模块、端到端联合优化Git版本管理保存仿真代码、记录不同版本设计Markdown实验记录把参数、结果、结论写成结构化文档这里面最容易被低估的是Git和Markdown。光学项目的迭代过程非常长你可能一周后回头想复现某个结果发现参数记录是乱的、代码是散在几个文件里的。建立一个“每个仿真任务一个文件夹里面代码、配置、结果截图画布齐全”的习惯比任何花哨的算法都更有价值。5.3 如何把新工作流插进现有课题最后特别想提醒一点不要试图一次性推倒重来把课题组里所有传统流程都替换成深度学习方案。这种做法我见过不少最后大多以“PPT很漂亮但没有真正帮到项目”收场。正确姿势是把新工作流当成一种“放大器”插进现有流程里最耗时的那个环节。比如你可能负责的是公差分析传统做法是在软件里对一个设计加减不同误差看谁影响最大。这个工作手动做很枯燥而且很难覆盖所有误差组合。你只需要把公差分配方案脚本化批量跑几百组蒙特卡洛仿真自动输出灵敏度排名整个项目的可靠性分析效率就能上一个台阶同时完全不改变课题组原有的设计流程。类似地如果你在调节初始结构可以先让优化器从多个起点自动搜索一把把搜到的几个候选结构交给导师或资深工程师判断他们会觉得你的方法“很懂行”而不是“在搞花活”。这个策略最大的好处是阻力小、见效快你能在真实项目里快速积累信心和口碑。一旦你在某个具体环节证明了自动化工作流的价值后续再推广到端到端联合优化、深度学习代理模型这些更前沿的方向大家自然更容易接受。技术路线再好最后还是要靠一个个真实产出来说话。我自己在实际项目里走过不少弯路最深的体会是光学设计这门手艺不会消失但它的核心会从“亲手调参的手感”慢慢变成“设计正确的优化目标和约束的能力”。你不需要一开始就掌握所有工具但一定要尽早把最小闭环跑通。从一个小到不能再小的透镜Demo开始让它自己转起来然后再一点一点把真实问题的复杂度加进去。等哪天你习惯性地把“跑一版脚本”当成默认动作而不是先打开软件界面时这项能力就算真正长在你身上了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑