gpt4 book ai didi

c++ - 线性(超定)代数方程的解

转载 作者:行者123 更新时间:2023-11-28 07:07:35 34 4
gpt4 key购买 nike

我有一组线性代数方程,Ax=By。其中A是36x20的矩阵,x是20x1的 vector ,B是36x13,y是13x1。 排名(A)=20。因为系统是超定的,所以最小二乘解是可能的,即; x = (A^TA)^-1A^TBy。我想要的解决方案应使残留误差 e = Ax-By 最小化。我使用 Maple 对矩阵进行转置和求逆,但对如此大的矩阵进行求逆需要更长的时间和 RAM。我什至花了一整天时间进行矩阵求逆,但由于 RAM 内存不足,它被打断了。这非常慢,我想 Maple 无法实现。

有人可以建议用 C++ 或任何其他求解方程的方法来解决这个问题,而不是采用逆和转置。

矩阵的形成,

    [ 1 0 0 ...0]
[ 0 1 0 ...0]
[ 0 0 1 ...0] [LinearVelocity_x]
[ 0 0 0 ...1] [LinearVelocity_y]
[ . . . ....], x=[LinearVelocity_z]
A = [ . . . ....] [RotationalVelocity_ROLL]
[ . . . ....] [RotationalVelocity_PITCH]
[ 1 0 0 ...0] [RotationalVelocity_YAW]
[ 0 1 0 ...0]
[ 0 0 1 ...0]
[ 0 0 0 ...1]

x 基本上是位置 (x,y,z) 和方向(Roll、Pitch 和 Yaw) vector 。但是 B 不是固定 oneszeros 的矩阵。 B 是一个矩阵,包含角度的sincos 元素,这些元素是实时传感器数据而不是固定数据。在 maple B 中,几乎是一个由变量和固定元素组成的矩阵,你可以说是一个dense sparse 矩阵。同时,y是所有传感器或编码器的 vector 。

最佳答案

如果您的数据是 float ,那么 Maple 应该可以很快得到它。如果 ABy 都只有数字条目,则尝试,

ans := LinearAlgebra:-LeastSquares( evalf(A), evalf(B.y) );

或者,如果您想要本身具有最小 2 范数的解决方案,

ans := LinearAlgebra:-LeastSquares( evalf(A), evalf(B.y), 'optimize'=true );

我的猜测是您的数据是纯有理数或整数,您可能没有意识到使用它会导致 Maple 尝试找到一个精确的有理数答案。或者您可能在数据中有一些未知的符号量(......尽管这可能会使计算最小残差的目标成为问题)。这种纯粹精确的数据,无论是理性的还是符号的,都是潜在的内存占用噩梦,并且可能根本不是您真正想要的,因为您正在考虑将 C++ 作为替代方案。这就是为什么我用 evalf 调用来将数据转换为 float 。

对于纯 float 据,36x20 最小二乘法是一个小问题,Maple 应该能够在几分之一秒内完成。

您应该让 LinearAlgebra:-LeastSquares 例程完成提升,而不是尝试自己形成或使用正规方程或矩阵求逆。如果您想要一种稳健的方法,请使用 method=SVD 选项。让它处理数值上的困难。

关于c++ - 线性(超定)代数方程的解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21540724/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com