在Matlab中求解线性方程

时间:2013-10-01 20:54:41

标签: matlab

我想在Matlab中解决#n线性方程AX=bi(对于#n b's),其中b在循环中发生变化且A是常数。

一种快速的方法是在循环之前计算A的倒数,在循环体中计算X的{​​{1}},但因为矩阵inv(A)*b是单数,我得到一个可怕的答案! 当然,数值解A给出了一个很好的答案,但重点是在A/b循环中计算#n不同X需要很长时间。< / p>

我想要的是一种既准确又快速的解决方案。

1 个答案:

答案 0 :(得分:3)

我实际上认为这是一个很好的问题,拼写错误和矩阵奇点问题。有一些很好的方法可以解决这个问题,Tim Davis'factorize submission on MATLAB Central涵盖了所有角度。

但是,仅供参考,让我们在原生MATLAB中自己做,从A为正方形的情况开始。首先,您建议使用两种方法(inv\mldivide):

% inv, slow and inacurate
xinvsol = inv(A)*b;
norm(A*xinvsol - b ,'fro')

% mldivide, faster and accurate
xref = A\b;
norm(A*xref - b ,'fro')

但如果你说A没有改变,只需要分解A并解决新的b!说A对称肯定

L = chol(A,'lower'); % Cholesky factorization

% mldivide, much faster (not counting the chol factorization) and most accurate
xcholbs= L'\(L\b); %'
norm(A*xcholbs - b ,'fro')

% linsolve, fastest (omits checks for matrix configuration) and most accurate
sol1 = linsolve(L, b, struct('LT',true));
xcholsolv = linsolve(L, sol1, struct('LT',true,'TRANSA',true));
norm(A*xcholsolv - b ,'fro')

如果A不是对称正定,那么你将使用LU分解为方形矩阵或QR。同样,您可以自己完成所有操作,也可以使用Tim Davis' awesome factorize functions