首页 > 其他分享 >最小二乘法拟合空间直线

最小二乘法拟合空间直线

时间:2024-07-31 17:41:21浏览次数:11  
标签:直线 frac matrix pt sum center 拟合 乘法

一、空间直线方程

1.1 一般方程

空间直线可以看成成两个平面的交线,设两个平面方程分别为\(A_1x + B_1y + C_1z + D_1 = 0\) 和 \(A_2x + B_2y + C_2z + D_2 = 0\),则直线\(l\)的一般方程可以表示为:
\(\left\{\begin{matrix} A_1x + B_1y +C_1 +D_1 = 0 \\ A_2x + B_2y +C_2 +D_2 = 0 \end{matrix}\right.\)

1.2 点向式


设直线方向向量为\(v = (m, n, t)\),直线上一点\(P_0:(x_0, y_0, z_0)\),则任意点\(P:(x, y, z)\)可以表示为 \(P = kP_0\),所以直线也可以表示为:
\(\frac{x - x_0}{m} = \frac{y - y_0}{n} = \frac{z - z_0}{t} = k\)

1.3 参数式

点向式经过简单变形即可得到:
\(\left\{\begin{matrix} x = x_0 + mk \\ y = y_0 + nk \\ z = z_0 + tk \end{matrix}\right.\)

1.4 平面法线叉乘表示

设两平面法线分别为:\(n_1=(x_1, y_1, z_1)\) 和 \(n_2 = (x_2, y_2, z_2)\),则直线的方向向量\(v(i,j,k)\)可以表示为:
\(v = n_1 \times n_2 = \begin{vmatrix} i & j & k \\ x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \end{vmatrix}\)
在到直线上取一点即可表示直线。

二、公式推导

这里参考链接1给出基于最小二乘法拟合直线的推导,设直线点向式方程为:\(\frac{x - x_0}{m} = \frac{y - y_0}{n} = \frac{z - z_0}{t}\),则转换后可以得到

\(\left\{\begin{matrix} x = \frac{m}{t}(z - z_0) + x_0 = k_1z + b1 \\ y = \frac{n}{t}(z-z_0) + y_0 = k_2z + b_2 \end{matrix}\right.\)

其中\(K_1 = \frac{m}{t}, b_1 = x_0 - \frac{m}{t} z_0, k_2 = \frac{n}{t}, b_2 = y_0 - \frac{n}{t}z_0\)。
所以空间直线可以看作

\(\left\{\begin{matrix} x = k_1z + b1 \\ y = k_2z + b_2 \end{matrix}\right.\)

两个平面相交,因此对空间之间拟合就可以转换为对这两个平面的拟合,假设有\(n\)个点\((x_1, y_1, z_1), (x_2, y_2, z_2),...,(x_n, y_n,z_n)\),则可以得到这些点和两个平面的残差的平方和为:

\(\left\{\begin{matrix} Q_1 = \sum_{i = 1}^{n}(x_i - k_1z_i -b_1)^2 \\ Q_2 = \sum_{i = 1}^{n}(y_i - k_2z_i -b_2 )^2 \end{matrix}\right.\)

依据最小二乘法有:\(Min Q_1\) 和 \(Min Q_2\),因此分别对\(k_1, b_1, k_2, b_2\)求导,然后令导数为0可以得到:

\(\left\{\begin{matrix} \sum_{i = 1}^{n}2(x_i - k_1z_i -b_1)(-z_i) = 0 \\ \sum_{i = 1}^{n}2(x_i - k_1z_i -b_1)(-1) = 0 \\ \sum_{i = 1}^{n}2(y_i - k_2z_i -b_2)(-z_i) = 0 \\ \sum_{i = 1}^{n}2(y_i - k_2z_i -b_2)(-z_i) = 0 \end{matrix}\right.\)

依据第一个式子有:

\(\sum_{i=1}^{n}(-x_iz_i - k_1z_i^2+b_iz_i)=0\)

==>

\(k_1 = \frac{\sum_{i=1}^{n}x_iz_i - \sum_{i=1}^{n}b_iz_i}{\sum_{i=1}^{n}z_i^2}\)

依据第二个式子有:

\(b_1 = \frac{\sum_{i=1}^{n}x_i - k_1 \sum_{i=1}^{n}z_i}{n}\)

将\(b_1\)代入\(k_1\)中可以得到:

\(k_1 = \frac{n\sum_{i=1}^{n}x_iz_i - \sum_{i=1}^{n}x_i\sum_{i=1}^{n}z_i}{n\sum_{i=1}^{n}z_i^2 - \sum_{i=1}^{n}z_i\sum_{i=1}^{n}z_i}\)

同理可以得到:

\(k_2 = \frac{n\sum_{i=1}^{n}y_iz_i - \sum_{i=1}^{n}y_i\sum_{i=1}^{n}z_i}{n\sum_{i=1}^{n}z_i^2 - \sum_{i=1}^{n}z_i\sum_{i=1}^{n}z_i}\)

\(b_2 = \frac{\sum_{i=1}^{n}y_i - k_2 \sum_{i=1}^{n}z_i}{n}\)

求出\(k_1,k_2,b_1,b_2\)后就可以算出直线的方向向量\(v=(m, n, t)\),令\(t = 1\),则\(m = k_1, n = k_2\),所以\(v(k_1, k_2, 1)\),还可以求出直线上一个点\(p(x, y, z)\) ,令\(z = 1\),则\(x = k_1 + b_1, y = k_2 + b_2\),所以点坐标可以表示为:\(p(k_1 + b_1, k_2 + b_2, 1)\)。

三、代码实现


double FitLine(const std::vector<Vector3>& pointArray, Vector3& dir, Vector3& pt)
{
		// ref: https://www.doc88.com/p-8189740853644.html
		core::Vector3 center = core::Vector3(0.0, 0.0, 0.0);
		int n = pointArray.size();
		for (const core::Vector3& pt : pointArray) {
			center += pt;
		} 

		double sumXZ = 0.0, sumYZ = 0.0, sumZ2 = 0.0;
		for (const core::Vector3& pt : pointArray) {
			sumXZ += pt.x() * pt.z();
			sumYZ += pt.y() * pt.z();
			sumZ2 += pt.z() * pt.z(); 
		}
		double den = n * sumZ2 - center.z() * center.z();
		double k1 = (n * sumXZ - center.x() * center.z()) / den;
		double b1 = (center.x() - k1 * center.z()) / n;
		double k2 = (n * sumYZ - center.y() * center.z()) / den;
		double b2 = (center.y() - k2 * center.z()) / n; 

		dir = core::Vector3(k1, k2, 1.0);
		dir.Normalize();
		
        double z = 1.0;
        double x = k1 + b1;
        double y = k2 + b2;
        pt = core::Vector3(x, y, 1.0);
		return 0.0;
}

四、效果

下面是拟合的效果,红色点是输入散点,绿色点表示直线上的两个点。

五、参考资料

https://www.doc88.com/p-8189740853644.html

标签:直线,frac,matrix,pt,sum,center,拟合,乘法
From: https://www.cnblogs.com/xiaxuexiaoab/p/18305798

相关文章

  • 数学建模--拟合算法
    目录拟合与插值的区别常用的拟合算法应用实例总结最小二乘法在不同数据分布下的性能表现如何?傅里叶级数拟合在图像处理中的应用案例有哪些?贝叶斯估计法与最大似然估计法在参数估计中的优缺点分别是什么?最大似然估计法(MLE)优点:缺点:贝叶斯估计法(BayesianEstimation)优......
  • 如何使用最小二乘法和权重矩阵?
    我知道如何使用Python通过最小二乘法求解A.X=B:示例:A=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]]B=[1,1,1,1,1]X=numpy.linalg.lstsq(A,B)printX[0]#[5.00000000e-015.00000000e-01-1.66533454e-16-1.11022302e-16]但是如果权重矩阵不......
  • P3811 【模板】模意义下的乘法逆元 题解
    【模板】模意义下的乘法逆元题目背景这是一道模板题题目描述给定n,pn,pn,p求......
  • 【Python数值分析】革命:引领【数学建模】新时代的插值与拟合前沿技术
    目录​编辑第一部分:插值的基本原理及应用1.插值的基本原理1.1插值多项式1.2拉格朗日插值 1.3牛顿插值 1.4样条插值2.插值的Python实现2.1使用NumPy进行插值2.2使用SciPy进行插值2.2.1一维插值​编辑2.2.2二维插值3.插值的应用场景3.1数据平......
  • 【逆运动学2】damped least squares method阻尼最小二乘法
    逆运动学 逆运动学,就是从操作空间的endeffectorpositionandorientation,求关节空间的jointposition的问题。在之前的文章,我们简单提到求逆运动学解的解析解法和优化解法,详细讲解了用逆瞬时(或说微分)运动学即雅可比矩阵法迭代求解逆运动学的方法。这篇文章我们继续讲雅可比矩......
  • Python拟合曲线
    拟合曲线多项式拟合np.ployfit(x,y,deg)importmatplotlib.pyplotaspltimportnumpyasnpx=[1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8]y=[33.40,79.50,122.65,159.05,189.15,214.15,238.65,252.2,267.55,280.50,296.65,301.65,310.......
  • 矩阵乘法
    OI中的主要应用在于加速计算线性递推式。举例来自OI-wiki。通常使用二维数组模拟矩阵。矩阵乘法的一个前提是两个矩阵中存在一个的行数等于另一个的列数的情况,因此在处理非正方形时的矩阵乘法时要注意循环顺序对应的行与列。通常将二维数组封到一个结构体内,定义如下:struct......
  • Matlab编程资源库(9)数据插值与曲线拟合
    一、一维数据插值    在MATLAB中,实现这些插值的函数是interp1,其调用格式为:Y1=interp1(X,Y,X1,'method')    函数根据X,Y的值,计算函数在X1处的值。X,Y是两个等长的已知向量,分别描述采样点和样本值,X1是一个向量或标量,描述欲插值的点,Y1是一个与X1等长的插值结......
  • 霍夫(Hough)直线变换(直线检测)
    0原理 霍夫变换在检测各种形状的的技术中非常流行,如果你要检测的形状可以用数学表达式写出,你就可以是使用霍夫变换检测它。及时要检测的形状存在一点破坏或者扭曲也可以使用。我们下面就看看如何使用霍夫变换检测直线。首先将一条直线用一个点表示,这样用一个点表示直线上......
  • 矩阵乘法写法比较
    免责声明测的比较随意,有吹黑哨的嫌疑。看一下就好了。测试对象\(n=1000\),测试\(n\timesn\)矩阵乘\(n\timesn\)的atcoder::modint998244353的矩阵乘法速度。矩阵数字生成:mt19937rng{1}正确结果矩阵元素异或和:6597111编译选项: g++$<-o$@-O2-std=c++14-static......