ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

非线性最小二乘与几何定位:无人机编队纯方位无源定位建模实战

2026/8/14 4:47:56 拓冰建站 浏览量
非线性最小二乘与几何定位:无人机编队纯方位无源定位建模实战

1. 项目概述:从“思路”到“解题框架”的实战转化

每年九月的那个周末,对于全国几十万理工科大学生来说,都是一场没有硝烟的战争——全国大学生数学建模竞赛。2022年B题“无人机遂行编队飞行中的纯方位无源定位”,这个题目一出来,很多队伍直接就懵了。无人机、编队、纯方位、无源定位,这些词单拎出来都够呛,组合在一起更是让人头皮发麻。我当时带了几支队伍,看到题目后第一反应是:这题有得做,但关键在于思路的拆解和转化。很多人把“思路”理解为“答案”或者“标准解法”,这是最大的误区。真正的“思路”,是一个将抽象的、复杂的实际问题,转化为一系列可建模、可计算、可优化的具体步骤的思维框架。它告诉你从哪里切入,用什么工具,可能会遇到什么坑,以及如何权衡不同的方案。这篇文章,我就以2022年B题为例,彻底拆解一遍从拿到赛题到形成完整解题方案的完整思维过程,这不仅仅是复盘一道题,更是分享一套应对复杂建模问题的通用方法论。

这道题的核心场景其实很明确:若干架无人机组成编队,其中一部分(FY00)位置和方向已知,它向其他无人机发射信号,其他无人机只能接收到信号的方向(即方位角),而不知道距离。我们需要根据这些方位角信息,去反推其他无人机的具体位置。这本质上是一个非线性优化和几何定位问题。题目适合有一定数学基础(线性代数、概率论、最优化理论)和编程能力(Matlab/Python)的同学,但更重要的是问题分析和转化能力。如果你只盯着“定位”算法本身,可能会陷入复杂的数学推导出不来;但如果你先厘清问题的约束、目标和可用的信息结构,路就会清晰很多。

2. 核心问题拆解与建模思路总览

面对这种多阶段、多约束的赛题,最忌讳的就是一头扎进细节。我的习惯是,先用半小时到一小时,把题目从头到尾精读三遍,用笔划出所有已知条件、假设、目标和问题。2022年B题可以清晰地拆解为几个层次分明的子问题。

2.1 题目信息结构与关键约束提取

首先,我们必须把题目中的“物理描述”翻译成“数学语言”。这是建模的第一步,也是决定后续所有工作是否稳固的基石。

  1. 编队几何描述:题目给出了一个理想化的圆形编队。FY00位于圆心,另9架无人机(FY01-FY09)均匀分布在半径为100米的圆周上。这是一个非常强的初始几何约束。但要注意,这只是“理想位置”。题目明确说明,实际位置会有偏差,我们需要去“估计”或“调整”它们的位置。所以,这里的圆形和均匀分布,是我们优化的目标几何形状,而不是已知的固定位置。

  2. 观测模型:这是问题的核心。FY00发射信号,其他无人机接收。接收机(FY01-FY09)只能测量到信号来源的“方位角”。在二维平面上,方位角通常定义为与某一参考方向(如正北、FY00的机头方向)的夹角。题目中,FY00的“方向角”是已知的,这很可能就是全局的参考方向。因此,对于任意一架无人机FY0i,它观测到的FY00的方位角,实际上反映了FY0i相对于FY00连线的角度信息。关键点在于:这是一个“纯方位”信息,只含角度,不含距离。

  3. 问题目标:题目分为几问,但核心目标可以归纳为:

    • 定位:在FY00位置和方向已知,且已知部分无人机(如FY01, FY02)精确位置的前提下,仅利用其他无人机对FY00的方位角观测,去估计这些无人机的位置。
    • 调整:在定位出实际位置后,如何通过调整少数无人机(如FY01)的位置,使得整个编队尽可能恢复到理想的圆形均匀分布状态。这里涉及一个“调整距离最小化”的优化目标。
  4. 关键难点与隐含假设

    • 非线性性:方位角观测方程(arctan((y_i - y_0)/(x_i - x_0)))本身就是非线性的。这直接排除了使用简单线性方程组求解的可能性,必须引入优化或几何方法。
    • 可观测性:仅凭一个角度信息,在二维平面上是无法唯一确定一个点的(它位于一条射线上)。这就是为什么题目需要额外信息:要么知道另外两架无人机(FY01, FY02)的精确位置,要么需要无人机之间的相对观测(后续问题)。这些额外信息提供了必要的“几何约束”,使得问题变得可解。
    • 误差处理:观测的方位角必然存在误差。我们的模型必须能容忍一定的观测噪声,而不是追求在噪声下完全精确的数学解。这通常意味着我们需要采用最小二乘或更鲁棒的优化框架。

注意:很多队伍在这里会犯一个错误,试图直接用方位角构造三角形,用正弦定理、余弦定理去解算位置。这在理论上对于无噪声、观测完备的情况或许可行,但一旦引入噪声和实际问题的复杂性(如多解性),这种方法会非常脆弱且难以推广。现代数学建模竞赛中,更倾向于采用具有良好抗噪性和可扩展性的数值优化框架。

2.2 整体技术路线设计

基于以上拆解,我们可以规划出一条清晰的、层层递进的技术路线。这条路线不是唯一的,但经过实践检验是稳健且高效的。

第一阶段:基础定位模型建立(对应赛题前几问)核心思想是将定位问题转化为一个非线性最小二乘优化问题

  1. 参数化:将未知无人机的位置 (x_i, y_i) 作为待优化的参数。
  2. 构建目标函数:对于每一个方位角观测值,计算其理论值(根据当前估计位置和FY00位置算出)与实际观测值之间的差值。将所有这些差值的平方和作为目标函数。目标函数的值越小,说明估计位置越符合观测数据。
  3. 引入约束:利用FY01、FY02的精确位置作为强约束(固定其参数),或利用它们与其他无人机的几何关系(如距离约束)作为优化问题的约束条件。
  4. 求解:使用数值优化算法(如Matlab的lsqnonlin,fmincon,或Python SciPy的least_squares,minimize)求解这个带约束的非线性最小二乘问题,得到未知无人机的位置估计。

第二阶段:编队调整优化(对应赛题后几问)在获得所有无人机的估计位置后,进入调整阶段。

  1. 定义“理想位置”:以FY00为圆心,半径为100米,将FY01-FY09均匀分配在圆周上,得到一组理想坐标。
  2. 定义调整策略与成本:题目通常要求只调整部分无人机(如FY01)。我们需要决定调整哪些无人机,以及将它们移动到哪个新位置。调整的成本就是移动的距离。
  3. 构建调整优化模型:这是一个组合优化连续优化问题。决策变量是所选无人机的调整后位置。优化目标是:在调整后,所有无人机位置与理想编队位置的总体偏差(如距离平方和)最小,同时使得调整成本(总移动距离)最小或不超过某个上限。这通常可以构建为一个多目标优化或带约束的单目标优化问题。
  4. 求解与方案输出:使用优化算法(如智能优化算法:遗传算法、粒子群算法;或混合整数规划)求解,得到具体的调整方案,并计算调整后的队形偏差。

第三阶段:模型的推广与稳健性分析(对应最后一问及论文亮点)考虑更复杂情况,如部分无人机位置缺失、观测存在系统性误差等,并测试模型在噪声增大时的表现,提出改进方案(如使用更鲁棒的损失函数、引入滤波算法等)。

3. 核心模型构建与算法实现细节

思路有了,接下来就是具体的“搭积木”过程。每一块积木怎么选、怎么用,直接决定了模型的精度和速度。

3.1 非线性最小二乘定位模型详解

这是整个赛题的基石。我们以最典型的场景为例:已知FY00坐标(0,0),方向角α(设为0度,即指向x轴正方向),已知FY01和FY02的精确坐标,需要仅利用FY03-FY09对FY00的方位角观测,来估计FY03-FY09的位置。

1. 观测方程建立:设FY0i的估计坐标为 (x_i, y_i),FY00坐标为 (0,0)。那么,从FY0i观测FY00的理论方位角 θ_i_theory 为:θ_i_theory = atan2(y_i, x_i) * 180 / π(注意转换为度,并与全局方向对齐,这里假设参考方向为x轴正向,所以直接用atan2)。atan2(y, x)是四象限反正切函数,能自动处理角度所在的象限,比atan(y/x)更稳定。

2. 目标函数构建:设FY03-FY09的实际方位角观测值(题目给出或根据理想位置加噪声模拟)为θ_i_obs。 则目标函数(残差平方和)为:F(X) = Σ_{i=3}^{9} [ θ_i_theory(X) - θ_i_obs ]^2其中X = [x_3, y_3, x_4, y_4, ..., x_9, y_9]是待优化的参数向量。

3. 约束处理:FY01和FY02的位置已知,设为 (x1, y1), (x2, y2)。它们不仅自身不参与优化,还可能为其他点提供间接约束。例如,FY01和FY02与FY00的相对位置是精确已知的,这实际上为整个坐标系提供了一个“基准尺”和“方向标”,解决了纯方位定位中的尺度和旋转模糊性问题。在优化中,我们不需要为它们设置约束,但在计算理论方位角时,所有点(包括FY01, FY02)都应满足与FY00的几何关系,这隐含在模型的一致性中。

4. 算法选择与实现:

  • 初值设定:非线性优化对初值敏感。一个非常好的初值就是理想编队位置(均匀分布在半径为100的圆上)。因为实际位置偏差不大,从理想位置开始搜索,收敛速度快且不易陷入局部最优。
  • 求解器选择
    • Matlab:使用lsqnonlin(非线性最小二乘专用)或fmincon(通用约束优化)。lsqnonlin更高效。
    % 示例代码框架 % 定义目标函数(返回残差向量) function residual = myObjective(params, observed_angles) % params: [x3, y3, x4, y4, ...] % 计算理论角度 theoretical_angles = atan2d(params(2:2:end), params(1:2:end)); % atan2d直接返回角度 residual = theoretical_angles - observed_angles; end % 设置初值(理想位置) initial_guess = ... % 从理想位置获取FY03-FY09的坐标,拉成向量 % 调用优化器 options = optimoptions('lsqnonlin', 'Display', 'iter', 'Algorithm', 'trust-region-reflective'); [estimated_params, resnorm] = lsqnonlin(@(p) myObjective(p, obs_angles), initial_guess, [], [], options);
    • Python:使用 SciPy 的least_squares
    import numpy as np from scipy.optimize import least_squares def objective(params, observed_angles): # params 结构同Matlab示例 x = params[::2] y = params[1::2] theoretical_angles = np.degrees(np.arctan2(y, x)) return theoretical_angles - observed_angles initial_guess = ... # 理想位置向量 result = least_squares(objective, initial_guess, args=(observed_angles,), method='trf', verbose=1) estimated_params = result.x

实操心得atan2atan2d(Matlab)或np.arctan2后接np.degrees(Python)的使用是关键。直接使用atan(y/x)会遇到除零和象限判断错误的问题。另外,角度的周期性(比如359度和1度相差2度,但数值差358度)需要小心处理。可以在目标函数中加入角度差值的规范化,确保差值在[-180, 180]度之间:delta = mod(theta_theory - theta_obs + 180, 360) - 180

3.2 编队调整优化模型实现

定位完成后,我们得到一组估计位置P_est = [p0, p1, ..., p9],其中p0是FY00。理想编队位置为P_ideal

1. 问题建模:假设我们被允许调整K架无人机(例如K=1,调整FY01)。设调整决策为,将FY01从当前位置p1_est移动到新位置p1_new。 我们需要优化p1_new,使得调整后的整体编队形态最接近理想圆形。

2. 目标函数设计:这里有两个可能的目标:

  • 目标A:最小化整体队形偏差。即最小化所有无人机位置(FY00固定,FY01用新位置,其他用估计位置)与理想位置的距离平方和。Minimize: Σ_{i=0}^{9} || p_i_adjusted - p_i_ideal ||^2其中,p_i_adjusted对于i=1是p1_new,对于其他i是p_i_est
  • 目标B:在调整量受限下,最小化队形偏差。即约束||p1_new - p1_est|| <= D_max,在此约束下最小化上述整体偏差。

题目通常要求的是目标B,即给定调整距离上限,求最优调整方案。这可以转化为一个带约束的优化问题

3. 模型求解:由于决策变量只有两个(p1_new的x, y坐标),搜索空间不大,但问题是非凸的(因为目标函数是距离平方和)。可以采用以下方法:

  • 直接使用非线性约束优化:如Matlab的fmincon,Python的minimize(method='SLSQP' 或 ‘trust-constr’)。
    from scipy.optimize import minimize, NonlinearConstraint def total_deviation(p1_new): # 计算调整后的总偏差 adjusted_positions = estimated_positions.copy() adjusted_positions[1] = p1_new # 假设索引1是FY01 return np.sum(np.linalg.norm(adjusted_positions - ideal_positions, axis=1)**2) # 约束:调整距离不超过D_max def distance_constraint(p1_new): return D_max - np.linalg.norm(p1_new - estimated_positions[1]) cons = {'type': 'ineq', 'fun': distance_constraint} # 不等式约束,要求fun>=0 result = minimize(total_deviation, x0=estimated_positions[1], constraints=cons, method='SLSQP') optimal_new_position = result.x
  • 几何分析法(针对简单情况):如果只调整一架,且目标是让编队尽可能圆,一个直观的思路是,让被调整的无人机“填补”当前编队中最破坏圆形的那个点。可以计算当前所有点到理想圆心的距离和角度,找到偏离最大的点,然后尝试将其向理想位置调整。但这种方法最优性无法保证,可作为优化算法的初值或验证。

4. 结果评估:计算调整后的队形偏差,并与调整前对比。同时,给出调整无人机的移动方向和距离。

4. 仿真验证、误差分析与模型稳健性探讨

模型建好了,代码也写了,但你怎么知道它是对的、是好的?这就需要一套完整的验证和分析流程。

4.1 数据仿真与模型验证流程

国赛题通常会提供一些数据,但为了全面测试模型,自己生成仿真数据是必不可少的。

  1. 生成理想编队数据:以(0,0)为圆心,生成FY01-FY09在半径100米圆上的均匀分布坐标。
  2. 加入随机位置偏差:模拟实际位置与理想的偏差。可以在径向和切向分别加入高斯随机噪声,例如径向偏差~N(0, 5^2)米,切向偏差(导致的角度变化)~N(0, (2°)^2)。
  3. 生成方位角观测数据
    • 计算每架无人机(FY01-FY09)到FY00(0,0)的真实角度(使用atan2)。
    • 在真实角度上加入观测噪声,例如高斯噪声 ~N(0, σ^2),σ 可取0.5°, 1°, 2°等不同水平,以测试模型抗噪性。
  4. 运行定位模型:将FY01, FY02的真实坐标作为已知,将FY03-FY09的带噪声方位角作为观测,输入我们的非线性最小二乘模型,估计出FY03-FY09的位置。
  5. 评估定位精度:计算估计位置与真实位置(步骤2中生成的)之间的欧氏距离,统计平均误差、最大误差、均方根误差(RMSE)。

注意事项:仿真时,必须固定随机种子(如Matlab的rng(1), Python的np.random.seed(1))。这确保了结果可重现,便于调试和对比不同参数下的性能。这是科研和竞赛中的基本规范,但很多新手会忽略。

4.2 误差来源分析与模型敏感性测试

模型结果出现偏差,不要急着调参,先系统分析误差从哪里来。

  1. 观测噪声敏感性:这是最主要的误差源。我们可以绘制一幅图:横坐标是观测噪声的标准差σ(从0.1°到5°),纵坐标是定位的RMSE。通常会发现,RMSE随着σ增大而近似线性增长。这验证了模型的基本合理性。如果曲线出现异常陡增或平台,说明模型在某个噪声阈值下崩溃了,可能需要改进(如提供更好的初值、使用鲁棒损失函数)。
  2. 已知点位置误差的传播:题目假设FY01、FY02位置精确已知。但现实中可能存在误差。我们可以做一个敏感性分析:在FY01、FY02的真实坐标上加入微小误差(如1米),再看定位结果的变化。这能评估模型对“基准”精度的依赖程度。
  3. 优化算法与初值依赖性:尝试不同的初值(例如,给一个偏离很远的初值),观察优化算法是否能收敛到正确解,或者陷入局部最优。这能帮助我们理解算法的稳定性,并在论文中给出“建议从理想位置附近开始迭代”的实用建议。
  4. 几何构型的影响:如果FY01和FY02与FY00的夹角很小(即它们几乎在同一个方向),那么它们提供的“基线”就很短,定位精度会下降(类似于GPS中的几何精度衰减因子GDOP)。虽然本题中它们分布较开,但分析这一点能体现你对问题深度的理解。

4.3 模型稳健性提升与扩展思考

这是论文拿高分的关键,展示了你的建模不止于解题,更有思考。

  1. 鲁棒损失函数:标准最小二乘对异常值(大的观测误差)非常敏感。可以考虑使用Huber损失Cauchy损失代替平方损失。在scipy.optimize.least_squares中,可以通过设置loss参数(如loss='huber')轻松实现。这能有效抑制个别“坏”观测数据的影响。
  2. 考虑更多约束:在调整模型中,除了调整距离约束,是否可以考虑无人机之间的防碰撞约束?即调整后的任意两架无人机距离应大于某个安全值d_min。这会将问题变成一个更复杂的带不等式约束的优化问题,但更贴近实际。
  3. 分布式定位思想:题目只利用了FY00发射,其他接收的模式。可以思考,如果所有无人机都能互相测量方位角(即“相对方位”),能否设计一个分布式协同定位算法?这可以引出基于图优化或一致性理论的方法,虽然竞赛时间内难以完全实现,但在模型推广部分提出这个想法,能极大提升论文的视野和深度。
  4. 三维扩展:题目是二维的。但在结论中,可以简要讨论模型扩展到三维空间(无人机高度不同)需要修改哪些部分(方位角需用俯仰角和方位角两个量描述,观测方程变为球面几何关系)。这展示了模型的普适性。

5. 参赛实操中的关键技巧与避坑指南

思路和模型是骨架,真正的血肉是参赛那三天里的具体操作。这里分享一些实战中血与泪换来的经验。

5.1 论文写作与结果呈现的核心要点

数学建模竞赛,“建模”只占三分之一,“写作”和“编程”同样重要。一篇好的论文能让评委迅速抓住你们的亮点。

  1. 摘要就是一切:摘要必须独立成段,控制在500-800字。采用“总-分-总”结构。开头一两句话概括问题、你们的方法和最终结论。然后,针对每一个问题,用一两句话说明你们用了什么模型、得到了什么关键结果(务必给出具体数值,如“定位平均误差为0.8米”、“在调整距离不超过30米的约束下,将队形偏差降低了75%”)。最后,总结模型的优点、特色或推广价值。摘要里不要出现公式和图表引用。
  2. 模型假设要合理且明确:在模型建立章节,首先列出假设。例如:“假设一:方位角观测噪声为零均值高斯白噪声。假设二:FY00的位置和方向精确已知且无误差。假设三:无人机视为质点,忽略其尺寸。” 合理的假设能简化问题,也定义了模型的适用范围。
  3. 图表专业清晰
    • 定位结果图:画两张图并列。左图:理想编队(圆圈+均匀点)。右图:估计出的编队(用‘x’表示)与真实编队(用‘o’表示)的对比,并用线段连接每个估计点和对应的真实点,线段的长度直观表示误差。给图形加上图例、坐标轴标签。
    • 误差分析图:箱线图非常适合展示不同噪声水平下定位误差的分布。横轴是噪声水平σ,纵轴是定位误差,每个σ对应一个箱体。
    • 调整方案示意图:用箭头清晰标出哪架无人机被调整,从哪移动到哪,箭头旁标注移动距离。背景可以保留理想编队的圆圈作为参考。
    • 所有图表必须有编号和标题,如“图1 无人机编队定位结果对比”,并在正文中引用“如图1所示”。
  4. 模型检验部分不可或缺:不要只说“我们用了非线性最小二乘,结果很好”。要展示敏感性分析(如5.2节所述)、稳定性分析(改变初值,结果变化不大)、以及与简单方法的对比(例如,可以尝试用几何交会法算一下,然后对比误差,凸显你们优化模型的优越性)。

5.2 编程实现与团队协作的实战细节

  1. 代码模块化与版本管理
    • 将不同功能的代码写成独立的函数或脚本文件。例如:generate_data.m,lsq_localization.m,formation_optimization.m,plot_results.m
    • 使用Git(或至少用文件夹+日期备份)进行版本管理。每天结束前提交一次代码。这能在你们误删文件或想回溯到之前某个模型版本时救命。
  2. 调试与数据检查
    • 优化不收敛?首先打印出目标函数在初值处的值,检查观测数据和理论计算函数是否写对了。经常遇到的问题就是角度单位(弧度/度)弄混,或者atan2参数顺序写反。
    • 结果明显不对?将中间变量画出来。比如在定位迭代过程中,把每次迭代的无人机位置估计画成动画,观察优化过程是否在向合理方向移动。
  3. 分工与时间管理
    • 第一天上午:共同读题、讨论、确定基本思路和分工。一人主攻建模推导和论文大纲,一人主攻编程实现(数据生成、基础算法),一人开始撰写问题重述、模型假设等前期文字部分。
    • 第一天下午到第二天全天:核心建模与编程期。保持频繁沟通,实现者随时向建模者反馈算法遇到的问题和初步结果,建模者根据结果微调模型。论文撰写者同步整理已确定的部分。
    • 第三天上午:所有模型结果应该都已得出。开始集中进行论文写作、图表制作和结果分析。
    • 第三天下午到晚上:论文整合、修改、润色摘要、反复检查格式和错别字。务必留出至少2小时进行全文通读和格式调整。许多队伍最后因为匆忙,导致图表错位、公式编号错误、参考文献格式混乱,非常可惜。
  4. 常见致命错误
    • 忽略单位:题目中距离单位是米,角度是度。在计算中务必统一,尤其在反三角函数中,Matlab的sincos默认输入是弧度,而观测数据往往是度,需要转换。
    • 优化变量排列错误lsqnonlinleast_squares的目标函数输入是一个一维参数向量。你需要清晰地定义这个向量如何与无人机的坐标对应(如[x1, y1, x2, y2, ...]),并在计算理论值时正确地索引出来。这是最容易出错的地方之一,建议写一个清晰的注释,并编写一个专门的函数来将参数向量转换为坐标矩阵。
    • 论文复制代码或中间输出:论文里不要贴大段的代码。可以贴关键的一两行算法核心代码。更不要将Matlab命令窗口的冗长迭代输出直接复制到论文里。应该整理成清晰的表格或总结性语句。

5.3 心态调整与资源利用

最后,说点务虚但同样重要的。国赛强度很大,三天时间非常紧张。

  • 遇到卡点是常态:模型推不下去、程序报错、结果不合理,这些都会发生。这时候不要互相抱怨,停下来,三个人一起把问题写在白板或纸上,一步步回溯。往往是在解释给队友听的过程中,自己就发现了问题所在。
  • 善用外部资源,但切忌抄袭:可以查阅优化算法手册、MATLAB/Python官方文档、经典的几何定位论文。但核心模型和求解思路必须是你们自己的。裁判组对论文重复率有检查,直接复制网上的成段代码或模型描述是高风险行为。
  • 结果不完美也要全面分析:如果模型在某些极端参数下效果不好,不要试图掩盖。在论文中坦诚地指出模型的局限性,并分析原因(例如“当观测噪声超过3度时,由于问题接近不可观测,模型定位误差显著增大”),这体现了科学的严谨性,有时比一个完美的结果更能打动评委。

这道2022年的B题,就像一块试金石,检验的不仅是数学和编程能力,更是将复杂现实抽象为数学模型,并稳健求解的系统性思维能力。从“纯方位无源定位”这个具体问题中提炼出来的“问题拆解-模型转化-数值优化-仿真验证-稳健性分析”框架,对于解决绝大多数工程和科学中的反问题,都具有普遍的参考价值。