我想在Matlab中解决#n线性方程AX=bi
(对于#n b's),其中b
在循环中发生变化且A
是常数。
一种快速的方法是在循环之前计算A
的倒数,在循环体中计算X
的{{1}},但因为矩阵inv(A)*b
是单数,我得到一个可怕的答案!
当然,数值解A
给出了一个很好的答案,但重点是在A/b
循环中计算#n
不同X
需要很长时间。< / p>
我想要的是一种既准确又快速的解决方案。
答案 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。