无线传感器网络实验指导书信息工程学院实验一 质心算法一、实验目的掌握合并质心算法的基本思想;学会利用MATLAB 实现质心算法;学会利用数学计算软件解决实际问题。
二、实验内容和原理无需测距的定位技术不需要直接测量距离和角度信息。
定位精度相对较低,不过可以满足某些应用的需要。
在计算几何学里多边形的几何中心称为质心,多边形顶点坐标的平均值就是质心节点的坐标。
假设多边形定点位置的坐标向量表示为p i = (x i ,y i )T ,则这个多边形的质心坐标为:例如,如果四边形 ABCD 的顶点坐标分别为 (x 1, y 1),(x 2, y 2), (x 3, y 3) 和(x 4,y 4),则它的质心坐标计算如下:这种方法的计算与实现都非常简单,根据网络的连通性确定出目标节点周围的信标参考节点,直接求解信标参考节点构成的多边形的质心。
锚点周期性地向临近节点广播分组信息,该信息包含了锚点的标识和位置。
当未知结点接收到来自不同锚点的分组信息数量超过某一门限或在一定接收时间之后,就可以计算这些锚点所组成的多边形的质心,作为确定出自身位置.由于质心算法完全基于网络连通性,无需锚点和未知结点之间的协作和交互式通信协调,因而易于实现。
三、实验内容及步骤该程序在Matlab 环境下完成无线传感器中的质心算法的实现。
在长为100米的正方形区域,信标节点(锚点)为90个,随机生成50个网络节点。
节点的通信距离为30米.需完成:分别画出不同通信半径,不同未知节点数目下的误差图,并讨论得到的结果所用到的函数:1. M = min(A)返回A 最小的元素.如果A 是一个向量,然后min (A )返回A 的最小元素。
如果A 是一个矩阵,然后min (A)是一个包含每一列的最小值的行向量。
2。
rand()12341234,,44x x x x y y y y x y ++++++⎛⎫= ⎪⎝⎭X = rand返回一个单一均匀分布随机数在区间 (0,1)。
X = rand(n)返回n——n矩阵的随机数字。
3。
S = sum(A)返回 A 沿其大小不等于 1 的第一个数组维度的元素的总和.如果A是一个向量,sum(A)可返回元素的总和。
如果A是一个矩阵,然后sum(A)返回一个行向量包含每个列的总和。
4。
inf无穷大此 MATLAB 函数返回正无穷大的 IEEE 算术表示.除以零和溢出等操作会生成无穷值,从而导致结果因太大而无法表示为传统的浮点值5. zeros —创建全零数组X = zeros返回标量0.X = zeros(n) -由—n矩阵的零返回n。
6。
plot(X,Y)画出Y随X变化的2D 曲线。
plot(X,Y,o)用o描述(X,Y)这一点。
7。
n= norm(v)返回的 2—范数或欧氏范数的向量v。
n = norm (v,p)返回向量范数定义的sum(abs(v)^p)^(1/p),这里p是任何正值, Inf 或-Inf.8.s = num2str(A)数值数组转换为字符数组输出,它表示的数字。
输出格式取决于原始值的大小。
num2str是用于标签和标题情节与数字值.所用到的变量:xy:均匀分布的信标节点位置矩阵n:未知节点数量SS:未知节点位置矩阵dm:通信半径cent:质心MM:未知节点估计坐标矩阵e:估计位置和实际位置距离矩阵(误差)四、源程序clearclc%锚节点节点设置for i=1:1:10%1到10,步长是1;画出锚点,前一个括号是标号。
for j=1:1:10x(j+(i-1)*10)=(i—1)*10;y(j+(i-1)*10)=(j—1)*10;endendfigure%出现图形界面plot(x,y,’k.'); %黑点hold on %继续画图axis([0 100 0 100]);xy=[x;y];把X,Y的坐标付给矩阵XYxy;hold onxm=90;ym=90;n=50;%未知节点for i=1:1:nSx(i)=rand(1,1)*xm;%产生一个一行一列的矩阵;依然是0—1中任意一个值。
Sy(i)=rand(1,1)*ym;plot(Sx(i),Sy(i),’r*’);%红星xlabel(’x轴’);ylabel(’y轴');hold onenddm=30 ;%通信半径m=100;一共100个点;for j=1:1:n%未知节点循环;每一个未知节点都与在通讯范围内所有的锚点算一遍距离,放到一个矩阵中,通讯距离以外的点为零。
SS=[Sx(j);Sy(j)];k=0;%表示通信半径内的信标节点数for i=1:1:md=norm((xy(:,i)—SS),2);%2范数就是求直线距离;不管行,第i 列;if d〈=dm 是否在范围内,取出信标节点,放到XX,yy中xx(j,i)=xy(1,i);第1行第i列;%X坐标都给了XXyy(j,i)=xy(2,i);第2行第i列;k=k+1;elsexx(j,i)=0;yy(j,i)=0;endendif k~=0%k不等于零cent(:,j)=[sum(xx(j,:));sum(yy(j,:))]/k;%第j行的所有列 elsecent(:,j)=0;令第j列的所有元素为零.endplot(cent(1,j),cent(2,j),'o') ;hold onplot([cent(1,j) Sx(j)],[cent(2,j) Sy(j)],’R--’) ;%估计位置和真实位置连接title('Centroid’);hold onMM=[cent(1,j);cent(2,j)];e(j)=norm((MM—SS),2); %定位误差end% figure/dm% axis([0 n 0 1])% j=1:1:n% plot(j,e(j),’—r.’)% hold on% title('Centroid')% E=sum(e)/nE=sum(e)/(n*dm);disp(['定位误差=’,num2str(E)]); %将结果转换成字符串输出实验二 DV—hop算法一、实验目的掌握DV-hop算法的基本思想;学会利用MATLAB实现DV—hop算法;学会利用数学计算软件解决实际问题。
二、实验内容和原理DV—Hop算法解决了低锚点密度引发的问题,它根据距离矢量路由协议的原理在全网范围内广播跳数和位置。
已知锚点L1与L2、L3之间的距离和跳数。
L2计算得到校正值(即平均每跳距离)为(40+75)/(2+5)=16。
42m。
假设传感器网络中的待定位节点A从L2获得校正值,则它与3个锚点之间的距离分别是L1=3×16。
42,L2=2×16.42,L3=3×16。
42,然后使用多边测量法确定节点的位置。
图1 DV hop 算法示意图三、实验内容及步骤该程序在Matlab环境下完成无线传感器中的DV-Hop算法的实现.在长为100米的正方形区域,随机生成100个网络节点,其中信标节点(锚点)为8个,未知坐标节点为92个。
节点的通信距离为50米.可算出最短路经算法计算节点间跳数、每个信标节点的校正值并可用用跳数估计距离。
(1000—1000, 300个节点,60个信标节点)所用到的函数:参见上节:质心算法;需完成:1)运行程序,生成随机分布的节点;2)更正程序中的错误,求每个信标节点的校正值;3)继续运行程序,利用跳数估计待求节点的距离.四、源程序%~~~~~~~~~~ DV—Hop算法~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ % BorderLength-—---正方形区域的边长,单位:m% NodeAmount—-----—网络节点的个数% BeaconAmount——-信标节点数% Sxy--—-——-—--——--用于存储节点的序号,横坐标,纵坐标的矩阵%Beacon-———--—-—-信标节点坐标矩阵;BeaconAmount*BeaconAmount%UN——-——--—-—-——未知节点坐标矩阵;2*UNAmount% Distance-----—未知节点到信标节点距离矩阵;2*BeaconAmount%h——-—---—--———--节点间初始跳数矩阵%X—--———--——-———-节点估计坐标初始矩阵,X=[x,y]’% R-——-——-—-———-———--节点的通信距离,一般为10-100mclear,close all;BorderLength=100;NodeAmount=100;BeaconAmount=8;UNAmount=NodeAmount-BeaconAmount;R=50;%D=zeros(NodeAmount,NodeAmount);%未知节电到信标节点距离初始矩阵;BeaconAmount行NodeAmount列h=zeros(NodeAmount,NodeAmount);%初始跳数为0;NodeAmount行NodeAmount列X=zeros(2,UNAmount);%节点估计坐标初始矩阵%~~~~~~~~~在正方形区域内产生均匀分布的随机拓扑~~~~~~~~~~~~~~~~~~~~C=BorderLength.*rand(2,NodeAmount);%带逻辑号的节点坐标Sxy=[[1:NodeAmount];C];%将1-NodeAmount与C上下合到一起,产生一个总矩阵。
Beacon=[Sxy(2,1:BeaconAmount);Sxy(3,1:BeaconAmount)];%信标节点坐标UN=[Sxy(2,(BeaconAmount+1):NodeAmount);Sxy (3,(BeaconAmount+1):NodeAmount)];%未知节点坐标%画出节点分布图plot(Sxy(2,1:BeaconAmount),Sxy(3,1:BeaconAmount),’r*',Sxy(2,(BeaconAmount+1):NodeAmount),Sxy(3,(BeaconAmount+1):NodeAmount),'k.')xlim([0,BorderLength]);ylim([0,BorderLength]);title(’* 红色信标节点。
黑色未知节点')%~~~~~~~~~~~~~~~~~~~~~~~~~~~~初始化节点间距离、跳数矩阵~~~~~~~~~~~~~~~~~~~~~~for i=1:NodeAmountfor j=1:NodeAmountDall(i,j)=((Sxy(2,i)—Sxy(2,j))^2+(Sxy(3,i)-Sxy(3,j))^2)^0.5;%所有节点间相互距离if (Dall(i,j)<=R)&(Dall(i,j)〉0)h(i,j)=1;%初始跳数矩阵elseif i==jh(i,j)=0;%自己到自己的距离else h(i,j)=inf;endendend%~~~~~~~~~~~最短路经算法计算节点间跳数~~~~~~~~~~~~~~~~~~~~ for k=1:NodeAmountfor i=1:NodeAmountfor j=1:NodeAmountif h(i,k)+h(k,j)〈h(i,j)%min(h(i,j),h(i,k)+h(k,j))h(i,j)=h(i,k)+h(k,j);endendendendh%~~~~~~~~~~~~~求每个信标节点的校正值~~~~~~~~~~~~~~~~~~~~~~~~~~h1=h(1:BeaconAmount,1:BeaconAmount);%从大矩阵中取出信标节点的跳数D1=Dall(1:BeaconAmount,1:BeaconAmount);%从大矩阵中取出信标节点的距离for i=1:BeaconAmountdhop(i,1)=sum(D1(i,:))/sum(h1(i,:));%每个信标节点的平均每跳距离endD2=Dall(1:BeaconAmount,(BeaconAmount+1):NodeAmount);%新标节点与未知节点的距离,逗号前面是行的范围,后面是列的范围.for i=1:BeaconAmountfor j=1:UNAmountif min(D2(:,j))==D2(i,j)Dhop(1,j)= dhop (i,j);%未知节点从最近的信标获得校正值endendendDhop%~~~~~~~~~~~~~~~~用跳数估计距离~~~~~~~~~~~~~~~~~~~hop1=h(1:BeaconAmount,(BeaconAmount+1):NodeAmount)%未知节点到信标跳数,BeaconAmount行UNAmount列for i=1:UNAmounthop=Dhop(1,i);%hop为从最近信标获得的校正值Distance(:,i)=hop*hop1(:,i);%%Beacon行UN列;end% %~~~~~~~~~~~~~最小二乘法求未知点坐标~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~d=Distance;for i=1:2for j=1:(BeaconAmount-1)a(i,j)=Beacon(i,j)-Beacon(i,BeaconAmount);endend%a为第一个信标节点和最后一个信号节点的坐标差值,保留最后一个信标节点% a'A=—2*(a’);% d=d1’;for m=1:UNAmountfor i=1:(BeaconAmount—1)B(i,1)=d(i,m)^2—d(BeaconAmount,m)^2—Beacon(1,i)^2+Beacon(1,BeaconAmount)^2—Beacon(2,i)^2+Beacon(2,BeaconAmount)^2;% 前九个信标节点到未知节点的距离平方%最后信标节点到未知节点的距离平方%前九个信标节点横坐标平方%最后信标节点到未知节点的横坐标平方%前九个信标节点纵坐标平方% 最后信标节点纵坐标平方endX1=inv(A'*A)*A'*B; %inv是求逆矩阵X(1,m)=X1(1,1);X(2,m)=X1(2,1);end%X为估计的未知节点位置for i=1:UNAmounterror(Z,i)=(((X(1,i)—UN(1,i))^2+(X(2,i)-UN(2,i))^2)^0。