-3

我想AX=bi在Matlab中求解#n线性方程(对于#n b's),它b在一个循环中变化并且A是恒定的。

一种快速的方法是计算A循环之前和循环体中的倒数,只是 get Xfrom inv(A)*b,但是因为矩阵A是奇异的,我得到了一个糟糕的答案!当然,数值解给出了一个很好的答案,但关键是在循环中计算不同的 'sA/b需要很长时间。#nX#n

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

4

1 回答 1

3

我实际上认为这是一个很好的问题,除了拼写错误和矩阵奇点问题。有一些很好的方法可以处理这个问题,Tim Davisfactorize在 MATLAB Central 上的提交涵盖了所有角度。

不过,仅供参考,让我们在原生 MATLAB 中自己动手,先从Ais square 的情况开始。首先,有您建议的两种方法(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!SayA对称正定的

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不是对称正定的,那么您将对方阵或 QR 使用 LU 分解。同样,您可以自己完成所有操作,也可以只使用Tim Davis 的超棒分解函数

于 2013-10-01T21:35:11.587 回答