matlab 乘法_Matlab最小二乘法实现轨迹定位方法(原创:呵呵哒!( ̄▽ ̄)")...

本文介绍了一种使用Matlab进行轨迹定位的方法,通过最小二乘法解决多点定位问题。给出了四种不同的程序实现,包括常规程序、简化程序、代码优化和更简洁的实现,最终求出待定点的坐标并确定直线方程。
摘要由CSDN通过智能技术生成

4d06f996ac7be25c9db1381261502d99.png

轨迹定位方法——Matlab 仿真方法

已知平面四点坐标(x1,y1)=(0,0), (x2,y2) =(1,0), (x3,y3) =(0,1), (x4,y4) =(0,2),某人沿一条直线行走,行走过程中经过待定位点的坐标分别为 (a1,b1),…… (a5,b5) ,待定位各个坐标点到已知四点距离分别测得为( 0.71, 0.78, 0.64 ,1.52 ), ( 1.4, 0.95, 1.05 ,1.5 ), ( 2.12, 1.61, 1.55 ,1.52), ( 2.87, 2.24, 2.31 ,2.1 ), ( 3.61, 3, 2.97 ,2.57 )求此人行走的直线方程。

定位方法——多点定位

131406863abd0690893af38b311c4299.png

1ce6219483dd0e38bc0b4a778b7f1f7a.png

解题思路:

(1)线性回归方程

a95b4a2a59ab242eabe7613fff308b0e.png

(2)最小二乘法

5a0b23e9896dd3bb33bb21a314c188ce.png

程序实现:

Location.m

function kk=Location(xx,yy,ll)
 
xxx = xx(1:end-1);
 
yyy = yy(1:end-1);
 
lll = ll(1:end-1);
 
 
 
A = [2*(xxx-xx(end)) 2*(yyy-yy(end))];
 
b = (xxx.^2-xx(end)^2) + (yyy.^2-yy(end)^2) - (lll.^2-ll(end)^2);
 
kk=(A.'*A)^(-1)*A.'*b;
 

drawline.m(线性回归方程matlab实现画直线)

function drawline(x,y)
 
n=length(x);
 
xb=mean(x);
 
yb=mean(y);
 
x2b=sum(x.^2)/n;
 
xyb=x*y'/n;
 
b=(xb*yb-xyb)/(xb^2-x2b);
 
a=yb-b*xb;
 
y1=a+b.*x;
 
plot(x,y,'*',x,y1);
 
serror=sum((y-y1).^2)

第一种常规程序:(缺点:每次求一个定位点都得调用Location()函数,代码很多冗余)

heheda_matlab_changui.m

tic
 
xx=[0 1 0 0].';
 
yy=[0 0 1 2].';
 
l1=[0.71 0.78 0.64 1.52].';
 
l2=[1.4 0.95 1.05 1.5].';
 
l3=[2.12 1.61 1.55 1.52].';
 
l4=[2.87 2.24 2.31 2.1].';
 
l5=[3.61 3 2.97 2.57].';
 
k1=Location(xx,yy,l1)
 
k2=Location(xx,yy,l2)
 
k3=Location(xx,yy,l3)
 
k4=Location(xx,yy,l4)
 
k5=Location(xx,yy,l5)
 
 
 
X=[k1(1) 1
 
    k2(1) 1
 
    k3(1) 1
 
    k4(1) 1
 
    k5(1) 1]
 
Y=[k1(2)
 
    k2(2)
 
    k3(2)
 
    k4(2)
 
    k5(2)]
 
X1=[k1(1) k2(1) k3(1) k4(1) k5(1)]
 
Y1=[k1(2) k2(2) k3(2) k4(2) k5(2)]
 
 
 
drawline(X1,Y1)
 
toc
 

第二种:简化程序

heheda_chengxu.m

tic
 
xx=[0 1 0 0].';
 
yy=[0 0 1 2].';
 
l1=[0.71 0.78 0.64 1.52].';
 
l2=[1.4 0.95 1.05 1.5].';
 
l3=[2.12 1.61 1.55 1.52].';
 
l4=[2.87 2.24 2.31 2.1].';
 
l5=[3.61 3 2.97 2.57].';
 
sum=[l1 l2 l3 l4 l5];
 
kk=[]
 
i=1
 
for i=1:5
 
    kk(:,i)=Location(xx,yy,sum(:,i));
 
end;
 
k_x=kk(1,:)
 
k_y=kk(2,:)
 
 
 
X=[]
 
Y=[]
 
for i=1:5
 
    X(:,i)=[k_x(i),1]
 
    Y(:,i)=k_y(i)
 
end
 
X=X.'
 
Y=Y.'
 
a = -5:0.1:2;
 
b = 0:0.1:10;
 
drawline(k_x,k_y)
 
toc
 

第三种:实现代码优化

code_fast.m

tic
 
xx=[0 1 0 0].';
 
yy=[0 0 1 2].';
 
l1=[0.71 0.78 0.64 1.52].';
 
l2=[1.4 0.95 1.05 1.5].';
 
l3=[2.12 1.61 1.55 1.52].';
 
l4=[2.87 2.24 2.31 2.1].';
 
l5=[3.61 3 2.97 2.57].';
 
sum=[l1 l2 l3 l4 l5];
 
kk=[]
 
i=1
 
for i=1:5
 
    kk(:,i)=Location(xx,yy,sum(:,i));
 
end;
 
k_x=kk(1,:)
 
k_y=kk(2,:)
 
X=[]
 
Y=[]
 
for i=1:5
 
    X(:,i)=[k_x(i),1]
 
    Y(:,i)=k_y(i)
 
end
 
X=X.'
 
Y=Y.'
 
a = -5:0.1:2;
 
b = 0:0.1:10;
 
drawline(k_x,k_y)
 
toc

第四种:实现代码更简洁

true_line.m

tic
 
xx=[0 1 0 0].';
 
yy=[0 0 1 2].';
 
l1=[0.71 0.78 0.64 1.52].';
 
l2=[1.4 0.95 1.05 1.5].';
 
l3=[2.12 1.61 1.55 1.52].';
 
l4=[2.87 2.24 2.31 2.1].';
 
l5=[3.61 3 2.97 2.57].';
 
sum=[l1 l2 l3 l4 l5];
 
kk=[]
 
i=1
 
for i=1:5
 
    kk(:,i)=Location(xx,yy,sum(:,i));
 
end;
 
k_x=kk(1,:)
 
k_y=kk(2,:)
 
X=[]
 
Y=[]
 
for i=1:5
 
    X(:,i)=[k_x(i),1]
 
    Y(:,i)=k_y(i)
 
end
 
X=X.'
 
Y=Y.'
 
%a = -5:0.1:2;
 
%b = 0:0.1:10;
 
EK=(X.'*X)^(-1)*X.'*Y
 
a=EK(1)
 
b=EK(2)
 
y1=a.*k_x+b;
 
plot(k_x,k_y,'*',k_x,y1);
 
toc

0c81fe385ecd6312a6319f23ff195df7.png

dffae488cdf3de1ed789c248b0668580.png

4f56c9fb3b2222a69613389c423f86a1.png

求出坐标

X1 =

0.4483 1.0283 1.4512 2.1122 2.5165

Y1 =

0.5487 0.9273 1.5460 1.9580 2.6070

即5个待定点的坐标,可确定直线。

最小二乘法确定系数a和b:

思路同上

(感谢物联网老师,让我从入坑到放弃,哈哈哈!小编还是会继续努力的,争取发表更多有意义的原创文章)

希望能帮到您

非常感谢您的观看,喜欢的话点个赞吧?

一只喜欢猫和老鼠的呵呵哒!

原文链接:Matlab最小二乘法实现轨迹定位方法(原创:呵呵哒!( ̄▽ ̄))_人工智能_weixin_41987016的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值