简介:本资源为2022年全国大学生数学建模竞赛本科组B题的完整论文,聚焦无人机纯方位无源定位问题,适合备战数模竞赛的本科生及指导教师参考。论文围绕圆形与锥形两种编队,系统建立被动接收信号无人机的定位模型与位置调整模型,涵盖余弦定理反解坐标、三圆共点判定、枚举法确定额外发射信号无人机数量,以及步长0.01米的遍历调整策略,并附MATLAB编程实现思路。压缩包内为1个PDF文件,约2.63MB,完整呈现摘要、问题重述、模型假设、符号说明与模型求解全过程,便于读者对照赛题复盘建模逻辑与算法细节。该论文曾获河北省一等奖,目前已有8039人学习下载,适合需要理解几何定位建模、学习MATLAB数值求解与优化迭代思路的参赛者深入研读。
1. 从一道国赛题说起:纯方位无源定位到底难在哪
2022年全国大学生数学建模竞赛本科组B题,题目是无人机纯方位无源定位的问题研究。这道题当年让不少队伍卡在了第一问——明明每个字都认识,但真要把“被动接收信号无人机定位模型”写出来,发现无从下手。核心矛盾在于:无人机编队飞行时不能主动发射电磁波,只能靠接收信号来推算自己的位置,这就意味着你手里只有角度信息,没有距离信息。没有距离,怎么定位?这就是纯方位无源定位的难点,也是这道题真正想考的东西。
这道题适合两类人参考:一类是正在准备数学建模竞赛的学生,想看看完整的建模论文应该怎么组织;另一类是做无人机编队控制或传感器网络定位的从业者,需要一套从建模到求解的完整思路。整篇论文用MATLAB实现,覆盖了圆形编队和锥形编队两种场景,从定位模型建立到位置调整方案,再到额外信号源数量的确定,形成了一条完整的解题链路。下面按方案结构拆开讲,每一步都落到可复现的细节上。
2. 定位模型怎么建:从余弦定理到三圆共点的完整推导
2.1 坐标系建立与已知条件梳理
圆形编队的设定是:0号无人机在圆心,1到9号均匀分布在半径r=100m的圆周上,相邻两架间隔40度。这个几何关系是后面所有推导的基础。建立二维直角坐标系,把0号放在原点,1号固定在x轴正方向上,那么9架圆周无人机的准确坐标可以直接写出来。
| 编号 | X坐标 | Y坐标 |
|---|---|---|
| FY00 | 0 | 0 |
| FY01 | r | 0 |
| FY02 | 0.77r | 0.64r |
| FY03 | 0.17r | 0.98r |
| FY04 | -0.50r | 0.87r |
| FY05 | -0.94r | 0.34r |
| FY06 | -0.94r | -0.34r |
| FY07 | -0.50r | -0.87r |
| FY08 | 0.17r | -0.98r |
| FY09 | 0.77r | -0.64r |
这张表看着简单,但它是后面所有计算的基准。我一般会先在MATLAB里把这组坐标生成好,后面不管是用余弦定理反解还是做遍历搜索,都直接调用,避免每次手算。
2.2 被动接收信号无人机的实际位置反解
题目给的条件是:两架圆周无人机加圆心那架发射信号,位置无偏差;另一架位置有偏差的无人机被动接收信号。接收到的信息是三个角度——接收机与三架发射机连线之间的夹角。
设发射机为i、j,圆心为0,接收机为k。已知量是三个角度α₁、α₂、α₃和编队半径r。要求的是接收机k的实际坐标。
思路是先用余弦定理把三条边的长度解出来,再反推坐标。具体来说,在三角形0-i-k中,边0i=r已知,角α₁已知,用余弦定理可以建立关于边0k和边ik的方程。同理在三角形0-j-k和三角形i-j-k中再建立两个方程,三个未知量三个方程,联立可解。
% 被动接收信号无人机定位模型 - 反解实际位置 % 输入:三个方位角alpha1, alpha2, alpha3,发射机编号i,j,接收机编号k,半径r alpha1 = input('第一个角度:'); % 0-k-i夹角 alpha2 = input('第二个角度:'); % 0-k-j夹角 alpha3 = input('第三个角度:'); % i-k-j夹角 FY0i = input('发射信号无人机1:'); FY0j = input('发射信号无人机2:'); r = input('圆形编队半径:'); % 计算发射机i和j之间的距离 a1 = sqrt(2*r^2 - cosd(abs(FY0i-FY0j)*40)*2*r^2); % 建立方程组:三个余弦定理方程,三个未知量k0, a2, a3 syms k0 a2 a3 eq1 = (k0^2 + a3^2 - r^2)/(2*k0*a3) - cosd(alpha1); eq2 = (k0^2 + a2^2 - r^2)/(2*k0*a2) - cosd(alpha2); eq3 = (a2^2 + a3^2 - a1^2)/(2*a2*a3) - cosd(alpha3); [X,Y,Z] = solve(eq1, eq2, eq3, k0, a2, a3); % 提取实数解,转换为直角坐标 K0 = double(X); k0i = acosd(1 - 2*cosd(alpha1)^2); k01 = k0i - 40*abs(i-1); x = real(K0*cosd(k01)); % 横坐标 y = real(K0*sind(k01)); % 纵坐标这段代码的关键在于用solve做符号求解,三个方程联立后得到边长k0、a2、a3。其中k0是接收机到圆心的距离,a2和a3分别是接收机到两架发射机的距离。拿到k0之后,结合角度关系就能算出直角坐标。
参数说明:alpha1、alpha2、alpha3是接收到的三个方位角,单位是度;FY0i和FY0j是发射信号的无人机编号;r是编队半径。输出x、y就是接收机的实际位置坐标。
2.3 准确位置的确定:三圆共点
上面解的是“实际位置”,但题目还要求确定“应当到达的准确位置”。这两个不是一回事。实际位置是根据接收到的角度反解出来的,而准确位置是编队几何关系决定的理想坐标。
确定准确位置的思路用到了一个几何性质:一个动点到两个定点的夹角为定值时,动点的轨迹是一段圆弧。当有三架位置无偏差的无人机时,接收机相对于每两架发射机都有一条轨迹圆弧,三条圆弧的交点就是准确位置。
这个性质在推导时有一个容易翻车的地方:当夹角是钝角时,轨迹是“眼睛”形;当夹角是锐角时,轨迹是“葫芦”形。两种情况的方程形式不同,但最终都归结为圆弧求交。
% 求解九个点的准确坐标(直角坐标) k = 0; for i = 1:9 x(i) = cosd(k); y(i) = sind(k); k = k + 40; end % 输出:x, y 分别为9架圆周无人机的准确坐标(单位圆) % 实际使用时乘以半径r即可这段代码生成的是单位圆上的坐标,实际使用时乘以半径r。看起来简单,但它是后面做误差比较和位置调整的基准。没有这个基准,你连“偏差多少”都算不出来。
3. 额外信号源数量怎么定:枚举法与最小误差匹配
3.1 为什么一架额外信号源就够了
题目第二小问的核心问题是:0号和1号已经确定发射信号,还需要额外增加几架无人机发射信号,才能让其他所有接收机都实现准确定位?
先看极端情况:如果只有0号和1号发射信号,那么其他任何一架接收机只能收到一个方向信息。一个角度对应一条圆弧轨迹,圆弧上每个点都满足这个角度条件,所以位置无法唯一确定。
增加一架发射信号后,接收机可以收到三个角度信息(分别对应与三架发射机的夹角),三条圆弧交于一点,位置就唯一确定了。所以答案是:额外增加1架就够了。
但问题没这么简单——具体增加哪一架?这取决于接收机是谁、它接收到的角度值是多少。不同组合下,需要增加的发射机编号不同。
3.2 枚举所有组合并匹配最小误差
由于0号和1号固定发射,额外增加的发射机从2到9号中选。对于每一架接收机k,遍历所有可能的额外发射机j(j≠k,j≠0,j≠1),计算在该组合下接收机应该接收到的三个角度值,然后与实际接收到的角度值做差,取平方和最小的那个组合。
% 额外无人机数量确定 - 枚举法求解 FY00 = 0; FY0i = 1; % 两个已知定点 r = input('圆形编队半径:'); % 第一步:枚举所有可能的发射机组合,计算对应的角度值 for FY0j = 2:9 for FY0k = 2:9 if FY0k == FY0j continue; end a1 = sqrt(2*r^2 - cosd((FY0j-FY0i)*40)*2*r^2); a3 = sqrt(2*r^2 - cosd((FY0k-FY0i)*40)*2*r^2); a2 = sqrt(2*r^2 - cosd((FY0k-FY0j)*40)*2*r^2); alpha1(FY0j,FY0k) = acosd((r^2+a3^2-r^2)/(2*r*a3)); alpha2(FY0j,FY0k) = acosd((a3^2+a2^2-a1^2)/(2*a3*a2)); alpha3(FY0j,FY0k) = acosd((r^2+a2^2-r^2)/(2*r*a2)); end end % 第二步:根据实际接收到的角度,找最小误差对应的发射机 beta1 = input('第一个角度:'); beta2 = input('第二个角度:'); beta3 = input('第三个角度:'); FY0k = input('接收信号的无人机编号:'); min_val = 1000; mini = 0; for i = 2:9 if i == FY0k continue; end m = (beta1-alpha1(i,FY0k))^2 + (beta2-alpha2(i,FY0k))^2 + (beta3-alpha3(i,FY0k))^2; if m <= min_val min_val = m; mini = i; end end % mini 即为需要额外增加的发射信号无人机编号这段代码分两步:第一步把所有可能的发射机组合对应的角度值算出来存表;第二步用实际接收到的角度去匹配,找平方和最小的那个组合。min_val是误差平方和,mini是对应的额外发射机编号。
参数说明:beta1、beta2、beta3是实际接收到的三个角度;FY0k是接收机编号;输出mini就是需要额外增加的发射机编号。误差平方和越小,说明匹配度越高。
注意:枚举时要注意排除接收机自己作为发射机的情况,否则会出现自己给自己发信号的逻辑错误。
4. 位置调整方案怎么落地:步长遍历与方向判断
4.1 圆形编队的位置调整策略
第三小问要求给出完整的位置调整方案。已知0号和1号已经在理想位置,其他无人机有偏差,需要通过接收方向信息逐步调整到理想位置。
调整的核心逻辑是:接收机根据当前接收到的角度信息,反解出自己当前的实际位置,然后与准确位置比较,决定往哪个方向移动。移动的步长设为0.01米,向四周全方位遍历,当与准确位置的距离小于0.01米时,认为已经到达理想位置。
% 圆形编队位置调整 - 步长遍历法 FY00 = 0; FY01 = 1; njl = 0.01; % 最小距离阈值 r = 100; % 圆形编队半径 bzrow = 100; % 准确位置半径 bztheta = [0 40 80 120 160 200 240 280 320]; % 准确位置角度 % 读取2号无人机的初始位置 FY0irow(2) = input('FY02的初始位置(row):'); FY0itheta(2) = input('FY02的初始位置(theta):'); jl = 100; % 初始距离设为大于阈值 while(jl > njl) mjl = 10000; for j = 0:359 % 向四周遍历,寻找使距离最小的方向 % 每次移动一个步长,计算新位置与准确位置的距离 % 如果距离减小,则更新位置 end % 更新当前位置与准确位置的距离 jl = mjl; end这段代码的框架是:外层while循环控制调整过程,内层for循环遍历360个方向,每个方向移动一个步长,计算移动后与准确位置的距离,选择距离最小的方向作为调整方向。重复这个过程直到距离小于阈值。
参数说明:njl是距离阈值,设为0.01米;r是编队半径;bzrow和bztheta是准确位置的极坐标;FY0irow和FY0itheta是初始位置的极坐标。
4.2 锥形编队的调整方案
问题二的锥形编队和圆形编队本质上是同一类问题,但几何关系更复杂。锥形编队中,相邻三架无人机构成等边三角形,直线上相邻两架间距相等。
调整策略分三轮:
第一轮:假设1号和5号位置无偏差,用它们定位2号。具体做法是:1号和2号发射信号,5号接收,得到一个方向信息;2号和5号发射信号,1号接收,得到另一个方向信息。在三角形1-2-5中,两个角已知,第三个角可求,从而确定2号的位置。
第二轮:1号、2号、5号位置都无偏差后,用它们定位其他无人机。但有一个坑:当某架无人机位于三角形边的延长线上时,只能接收到一个方向信息,无法定位。所以4、7、9、11、13、14号在这一轮无法定位。
第三轮:选取2、6、8号作为发射信号无人机,剩下的未定位无人机都不在它们构成的三角形边的延长线上,全部可以定位。
% 锥形编队位置调整 - 三轮定位策略 % 第一轮:定位2号无人机 % 1号和2号发射,5号接收 -> 方向信息1 % 2号和5号发射,1号接收 -> 方向信息2 % 三角形1-2-5中,两角已知,第三角可求 % 第二轮:用1、2、5号定位其他无人机 % 注意:在延长线上的无人机无法定位 % 第三轮:选取2、6、8号发射信号 % 剩余未定位无人机均可定位锥形编队的调整逻辑和圆形编队一致,都是先定位再调整,区别在于发射机的选取策略和延长线问题的处理。
5. 避坑与常见问题:建模过程中最容易翻车的五个点
5.1 角度单位混用导致结果全错
现象:MATLAB算出来的坐标明显偏离合理范围,或者求解方程时报错。
原因:MATLAB的三角函数默认输入是弧度,但题目给的角度是度。如果混用cos和cosd,结果会差一个数量级。
解决:统一使用cosd、sind、acosd这些以度为单位的函数。在代码开头加注释标明单位,避免后面改代码时忘记。
5.2 符号求解出现多解或虚数解
现象:solve返回多个解,或者解里带虚数部分。
原因:余弦定理建立的方程组可能有多个数学解,但只有一个是符合物理意义的。另外,当角度值不满足三角形存在条件时,会出现虚数解。
解决:用real()提取实部,然后根据几何约束(比如距离必须为正、坐标必须在编队范围内)筛选合理解。如果所有解都是虚数,说明输入的角度值有问题,需要检查数据来源。
5.3 枚举法计算量过大导致程序卡死
现象:运行枚举程序时MATLAB长时间无响应。
原因:如果对每一架接收机都重新枚举所有发射机组合,计算量会很大。尤其是当编队规模扩大时,组合数呈指数增长。
解决:先把所有组合的角度值预先算好存表,后面匹配时直接查表。这样只需要枚举一次,后续都是查表操作,速度会快很多。
5.4 延长线问题被忽略导致定位失败
现象:锥形编队调整时,某些无人机始终无法定位。
原因:当接收机位于两架发射机连线的延长线上时,接收到的角度信息退化,无法唯一确定位置。
解决:在选取发射机时,先检查目标接收机是否在发射机连线的延长线上。如果是,换一组发射机。锥形编队中,第二轮选取2、6、8号就是为了避开延长线问题。
5.5 步长设置不当导致调整效率低或精度不够
现象:调整过程要么迭代次数太多跑得慢,要么精度不够达不到要求。
原因:步长太大,精度不够;步长太小,迭代次数多。
解决:先用大步长快速接近,再用小步长精细调整。或者直接用解析法算出调整方向,一步到位,不需要遍历。题目中设步长0.01米是一个折中方案,实际工程中可以根据精度要求调整。
6. 验收与答辩:怎么证明你的方案是对的
6.1 验收标准与测试方法
一套定位方案能不能用,看三个指标:定位误差、调整收敛速度、鲁棒性。
定位误差的验收方法是:随机生成一组有偏差的初始位置,运行定位模型,比较解算出的位置与准确位置的差距。如果误差在0.01米以内,说明模型精度达标。
调整收敛速度的验收方法是:记录从初始位置调整到理想位置所需的迭代次数。如果迭代次数在合理范围内(比如几百次以内),说明调整策略有效。
鲁棒性的验收方法是:在输入角度中加入小幅随机噪声,看模型输出是否稳定。如果噪声导致输出剧烈波动,说明模型对输入太敏感,需要改进。
| 验收项 | 测试方法 | 合格标准 |
|---|---|---|
| 定位精度 | 随机初始位置,比较解算值与准确值 | 误差 < 0.01m |
| 收敛速度 | 记录迭代次数 | < 500次 |
| 鲁棒性 | 加入±1度噪声 | 输出波动 < 0.05m |
6.2 答辩时怎么讲清楚你的方案
答辩的核心不是把论文念一遍,而是让评委在短时间内理解你的思路。我一般会按这个顺序讲:
先讲问题本质——纯方位无源定位的核心矛盾是只有角度没有距离,所以需要多个信号源提供多个角度约束。再讲解决方案——用余弦定理建立方程组,用三圆共点确定唯一位置。然后讲实现——MATLAB符号求解加枚举匹配。最后讲验证——用误差分析和收敛性测试证明方案有效。
有一个技巧:准备一张图,把三圆共点的几何关系画出来。评委看到图就明白你的思路了,比讲一堆公式管用。
6.3 我踩过的坑
第一次做这道题的时候,我在角度单位上翻了车。MATLAB里混用了cos和cosd,结果算出来的坐标全是乱的,排查了两个小时才发现问题。从那以后我每次写三角函数相关的代码,都会在文件开头写一行注释标明单位,并且在关键计算步骤后面加断点检查数值范围。
还有一次是在枚举法那里,没有预先存表,每次匹配都重新算一遍角度值,程序跑了十几分钟没出结果。后来改成先存表再查表,几秒钟就跑完了。这个习惯我后来一直保留着——凡是重复计算的东西,先存起来,别每次都重算。
希望帮到你。
本文还有配套的精品资源,点击获取