
[英]Least Squares Solution of Linear Algerbraic Equation Ax = By in Eigen C++
[英]Least Squares Solution of Overdetermined Linear Algebraic Equation Ax = By
我有一个形式为Ax=By
的线性代数方程。 其中A是6x5
的矩阵, x
是大小5
向量,B是6x6
的矩阵, y
是大小6 A
向量A
, B
和y
是已知变量,它们的值可从传感器实时访问。 x
是未知的,必须找到。 一种解决方案是找到x = [(A^T*A)^-1]*(A^T)B*y
Least Square Estimation
。 这是线性代数方程的常规解。 我使用本Eigen QR Decomposition
解决了以下问题
matrixA = getMatrixA();
matrixB = getMatrixB();
vectorY = getVectorY();
//LSE Solution
Eigen::ColPivHouseholderQR<Eigen::MatrixXd> dec1(matrixA);
vectorX = dec1.solve(matrixB*vectorY);//
到目前为止一切都很好。 但是,当我检查错误e = Ax-By
,错误始终不为零。 误差不是很大,甚至是不可忽略的。 还有其他更可靠的分解类型吗? 我浏览了其中一页,但无法理解其含义或如何实施。 以下是参考资料中如何解决问题的行。 有人可以建议我如何实施吗?
通过形成误差向量e = Ax-By
并找到使加权误差(e^T*W*e)
最小的未知向量x
来获得此类方程式Ax = By
解,其中W
是权重矩阵。 为简单起见,选择此加权矩阵的形式为W = K*S
,其中S
为常数对角线缩放矩阵, K
为标量权重。 因此,方程的解变为
x = [(A^T*W*A)^-1]*(A^T)*W*B*y
我不明白如何形成矩阵W
您的陈述“但是当我检查错误e = Ax-By时,它始终不为零。”无论您使用何种技术或选择哪种加权,几乎总是正确的。 当您使用一个过于描述的系统时,您基本上是在尝试将一条直线拟合到一系列点上。 除非偶然地将所有点精确地放置在一条完美的直线上,否则会出现一些误差。 因此,无论您使用哪种技术选择线(权重等),如果这些点不是共线的,都将始终会出现一些错误。 替代方法是使用某种样条,或使用较大尺寸的样条以允许变形。 在这些情况下,您可以选择将所有点精确地拟合为更复杂的形状,因此结果为0。
因此,权重矩阵的选择只是通过为每个点赋予略微不同的权重来更改将使用的直线。 因此,它将永远不会完全消除错误。 但是,如果您有几个比其他点更在意的点,那么在选择最小二乘方误差拟合时,可以给这些点赋予更高的权重。
对于样条拟合,请参见:
http://en.wikipedia.org/wiki/Spline_interpolation
对于真正最好的样条曲线插值,您可以使用Centripital Catmull-Rom,它不仅可以找到适合所有点的曲线,还可以防止不必要的循环和自相交,而这些相交和自相交有时会在数据方向突然变化时出现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.