我有37个线性方程和36个变量,以矩阵方程的形式表示为:A*X=B。这些方程没有确切的答案。我想使用Matlab的最小二乘法来找到误差最小的答案。由于我对Matlab不熟悉,所以希望能得到任何建议。谢谢。
我有37个线性方程和36个变量,以矩阵方程的形式表示为:A*X=B。这些方程没有确切的答案。我想使用Matlab的最小二乘法来找到误差最小的答案。由于我对Matlab不熟悉,所以希望能得到任何建议。谢谢。
A
的秩为满秩,即矩阵 A
的列线性无关,那么对于一个超定的线性方程组,最小二乘解可以被求出。A * x = b
可以通过反转正常方程(参见线性最小二乘法)来找到。
x = inv(A' * A) * A' * b
A
不是满秩矩阵,那么A' * A
就不可逆。相反,可以使用A
的伪逆矩阵。x = pinv(A) * b
或者Matlab的左除运算符
x = A \ b
两种方法都可以得到相同的解,但是左除法更具有计算效率。
后两种计算方法也可以处理线性方程组的欠定情况,但在这种情况下它们会给出不同的解:伪逆矩阵会给出使 x
的平方和最小的解,而左除法运算符会给出尽可能多的0系数的解。
x = inv(A' * A) * A * b
应该是 x = inv(A' * A) * A' * b
。 - Tamás SzabóX = pinv(A) * B;
lsqlin
函数来实现。我相信语法是 x = lsqlin(A,B,[],[],0,inf)
。 - rlbondmldivide
(反斜杠运算符)差。 - knedlseppmldivide
和pinv
在像这个问题一样的超定问题中是等效的,但对于欠定问题,pinv
会给出“实际”的最小二乘解(最小能量解)。 - rlbond(A'*A)*inv(A)
提供与 pinv
和反斜杠相同的解决方案。 如果A不可逆,则使用反斜杠的等式仍然有效,但是过于复杂。 - A. Dondalinprog
函数。 - Tamás SzabóA\b
中的 \
倾向于 A
,意味着 inv(A)*b
(假设满秩),而进行 A/b
意味着 A*inv(b)
(同样假设满秩)。我经常会感到困惑,最后通过看斜杠倾向的方向来解决了问题。 - rayryeng