R 加权最小二乘 代码_利用最小二乘法拟合空间圆(球)

本文介绍如何利用最小二乘法及矩阵形式对带有测量误差的空间球面进行拟合,通过线性化方程并运用矩阵运算求解球心坐标与半径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小二乘法可以很好的解决Ax=b的问题,同时,矩阵形式的最小二乘法为求解带了了非常大的便利。之前介绍了用矩阵形式最小二乘法拟合平平面的方式,这次来做用矩阵形式来拟合空间球(圆)(由于测量误差的存在,认为空间圆的测量值分布在一个球面上,且球心与空间圆心重合)。二维空间中求圆心和求球的方法相同,只是少了一个维度。


最小二乘法使用的关键步骤为使方程线性化!


空间球方程为

b911b30a0f99b519155cf1144655d660.png

9be79689189d5e1ce3e78c1f77d32c80.png

乍一看这个方程和Ax=b相差很大,经过变形得到

31df8e28774d12656b612a7c3419b6df.png

将红色部分分别记作Ax,Ay,Az,Ad(加粗则表示向量),黄色部分记作d,蓝色部分记作e(加粗则表示向量),可以得到

f9b522192ae38b1804db147273911fbf.png

写为矩阵形式为(这里的加粗大写字母表示向量而不是矩阵)

8812689a4ed4bef5f7909c32004394d6.png

所以又回到了最小二乘法的矩阵形式,可以获得abcd,并进一步求出r。


最小二乘法使用的关键步骤为使方程线性化!

使方程线性化的一般方法为:将所有不包含未知量的量全都放在方程右侧,作为b(b可被直接观测和计算到);将所有包含相同因子的未知量全部整理在一起,并将因子(常数因子和可以被观测到的量均视为因子)提出来放在前面,其中没有因子的量视作因子为1(即将x视作k*x,其中k=1),将具有相同因子的未知量视为一个新的未知量。

这种方法是不是像状态空间控制理论中的状态变量的变换!而且方程也变为控制系统的输出方程y=Ax,其中y为系统输出,可以被观测,x为系统状态,在控制系统中可以通过设计观测器观测,获得x和y之后,可以对系统进行辨识,即获得A。


附上测试代码

clear all
%确认圆心和半径
o = [13.85 23.45 8.94];
R = mean(o);
%获得一系列测量点
P = [];
nP = [];
for i = 1:100
    vec = [randn(1,1) randn(1,1) randn(1,1)];
    vec = vec/norm(vec) + 0.01*[randn(1,1) randn(1,1) randn(1,1)];
    P   = [ P; o+R*vec; ];
    nP  = [nP;norm(P(i,:)-o)];
end

%由P生成A(包括Ax,Ay,Az,Ad)和e
 x = P(:,1);
 y = P(:,2);
 z = P(:,3);
Ax = -2*x;
Ay = -2*y;
Az = -2*z;
Ad =  0*P(:,1) + 1;
 A = [ Ax Ay Az Ad];
 e = -x.^2 -y.^2 -z.^2;
%求解abcd, Ax=e
 X = inv(A'*A)*A'*e;
 a = X(1)
 b = X(2)
 c = X(3)
 r2 = a^2 + b^2 + c^2 - X(4)
 r  = r2^0.5
%验证结果
err = [a b c r] - [ o R] %结果接近0,说明结果正确
%绘图验证
hold on
plot3(P(:,1),P(:,2),P(:,3),'.')
plot3(o(1),o(2),o(3),'o')
plot3(a,b,c,'*')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值