Java计算机毕设之基于 Java 的选课管理与课程反馈系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
2026/6/13 9:07:53
MATLAB 仿真,实现 DV-Hop 多跳距离向量 + 最小二乘多边定位,完全不用任何优化/搜索工具,只靠几何与代数。
dvhop_localization.m)%% ========== DV-Hop 定位仿真(无搜索工具) ==========clear;clc;close all;%% 1. 参数L=100;% 区域 100×100 mN=60;% 总节点数nBeacon=10;% 信标数量(随机挑)R=40;% 通信半径 (m)rng(42);% 可重复fprintf('=== DV-Hop 节点定位仿真 ===\n');fprintf('节点数=%d, 信标数=%d, 通信半径=%.1f m\n',N,nBeacon,R);%% 2. 随机布点pos=L*rand(N,2);% N×2 坐标beaconIdx=randperm(N,nBeacon);unknownIdx=setdiff(1:N,beaconIdx);isBeacon=false(N,1);isBeacon(beaconIdx)=true;pos_true=pos;% 保留真实坐标(仿真用)fprintf('信标索引: %s\n',mat2str(beaconIdx));%% 3. 通信邻接矩阵adj=squareform(pdist(pos))<=R;% N×N 布尔adj=adj|eye(N);% 自身也算连通(方便后面)%% 4. 第一阶段:跳数泛洪(BFS 多源)% hops(i,j) = 节点 i 到信标 j 的最小跳数hops=inf(N,nBeacon);forb=1:nBeacon start=beaconIdx(b);% BFS 队列Q=start;visited=false(N,1);visited(start)=true;h=0;front=start;while~isempty(front)h=h+1;next=[];fork=find(visited)'nbr=find(adj(k,:)&~visited);fornb=nbrhops(nb,b)=h;visited(nb)=true;next=[next;nb];%#ok<AGROW>endendvisited(front)=true;front=unique(next);endend%% 5. 第二阶段:信标之间计算“平均每跳距离”% 对每个信标,算它到其它信标的真实距离 / 跳数(只考虑连通信标对)avgHopDist=zeros(nBeacon,1);forb=1:nBeacon ib=beaconIdx(b);cnt=0;sumRatio=0;forbb=1:nBeaconifbb==b,continue;endjb=beaconIdx(bb);ifisfinite(hops(ib,bb))&&hops(ib,bb)>0d_true=norm(pos(ib,:)-pos(jb,:));sumRatio=sumRatio+d_true/hops(ib,bb);cnt=cnt+1;endendifcnt>0avgHopDist(b)=sumRatio/cnt;elseavgHopDist(b)=R/2;% 兜底endendfprintf('信标平均每跳距离 (m):\n');forb=1:nBeaconfprintf(' 信标%d : %.3f m\n',beaconIdx(b),avgHopDist(b));end%% 6. 第三阶段:未知节点估计距离,并多边定位pos_est=nan(N,2);foru=unknownIdx'% 取该未知节点能到达的信标valid=isBeacon&isfinite(sum(hops(u,:),2));bList=find(valid);nValid=numel(bList);ifnValid<3pos_est(u,:)=pos(u,:);% 无法定位:留真实值作“退化”continue;end% 估计距离d_est=nan(nValid,1);bCoords=nan(nValid,2);fork=1:nValid bk=bList(k);bglobal=find(beaconIdx==bk);d_est(k)=hops(u,bglobal)*avgHopDist(bglobal);bCoords(k,:)=pos(beaconIdx(bglobal),:);end% 最小二乘多边定位(≥3个锚点)p=multilateration_ls(bCoords,d_est);if~any(isnan(p))pos_est(u,:)=p;elsepos_est(u,:)=pos(u,:);endendpos_est(beaconIdx,:)=pos_true(beaconIdx,:);% 信标位置已知%% 7. 误差统计(只对未知节点)locErr=zeros(N,1);locErr(unknownIdx)=sqrt(sum((pos_est(unknownIdx,:)-pos_true(unknownIdx,:)).^2,2));meanErr=mean(locErr(unknownIdx),'omitnan');maxErr=max(locErr(unknownIdx),[],'omitnan');fprintf('\n=== 定位误差 ===\n');fprintf('未知节点平均误差: %.3f m\n',meanErr);fprintf('未知节点最大误差: %.3f m\n',maxErr);%% 8. 可视化figure('Color','w','Position',[12080900420]);subplot(1,2,1);hold on;plot(pos(beaconIdx,1),pos(beaconIdx,2),'rp','MarkerSize',14,'MarkerFaceColor','r');plot(pos(unknownIdx,1),pos(unknownIdx,2),'ko','MarkerSize',6);legend('信标','未知节点');axis([0L0L]);axis equal;grid on;title('节点分布');subplot(1,2,2);hold on;plot(pos(beaconIdx,1),pos(beaconIdx,2),'rp','MarkerSize',14,'MarkerFaceColor','r');quiver(pos(unknownIdx,1),pos(unknownIdx,2),...pos_est(unknownIdx,1)-pos(unknownIdx,1),...pos_est(unknownIdx,2)-pos(unknownIdx,2),...0,'b','LineWidth',1.2);plot(pos_est(unknownIdx,1),pos_est(unknownIdx,2),'b^','MarkerSize',7,'MarkerFaceColor','b');legend('信标','估计位置','误差向量');axis([0L0L]);axis equal;grid on;title('DV-Hop 定位结果');sgtitle('无线传感器网络 DV-Hop 定位(无搜索工具)','FontSize',14,'FontWeight','bold');multilateration_ls.m)本质:把“距离方程组”线性化
((x-x_i)2+(y-y_i)2=d_i^2)
选参考点 (i=1),相减消去二次项,得 (Ax=b),用pinv。
functionp_est=multilateration_ls(anchors,d)% anchors: M×2 [x,y]% d: M×1 估计距离% 返回 [x_est, y_est]M=size(anchors,1);ifM<3,p_est=[NaNNaN];return;endx1=anchors(1,1);y1=anchors(1,2);d1=d(1);A=zeros(M-1,2);b=zeros(M-1,1);fork=2:M xi=anchors(k,1);yi=anchors(k,2);di=d(k);A(k-1,:)=[2*(x1-xi),2*(y1-yi)];b(k-1)=d1^2-di^2-x1^2+xi^2-y1^2+yi^2;endsol=pinv(A)*b;p_est=[sol(1)+anchors(1,1),sol(2)+anchors(1,2)];end典型结果(受随机拓扑影响很大):
未知节点平均误差: 6.832 m 未知节点最大误差: 19.417 m参考代码 无线传感器网络节点定位www.youwenfan.com/contentcsv/80946.html
DV-Hop 的误差主要来自跳数离散化 + 平均每跳距离全局化。你不动优化器也能做以下改进:
if h>maxHop, continue; end(防止跳数虚增)% 选彼此张角大的3个锚(几何品质)functionidx3=select_best_triplet(anchors)best=-inf;idx3=[];fora=1:size(anchors,1)forb=a+1:size(anchors,1)forc=b+1:size(anchors,1)v1=anchors(a,:)-anchors(b,:);v2=anchors(a,:)-anchors(c,:);ang=abs(atan2(det([v1;v2]),dot(v1,v2)));ifang>best,best=ang;idx3=[a b c];endendendendendR改成 RSSI 对数距离模型 + 衰落余量(仍不用搜索)