1

我在 Matlab 中有一个大约 2000 个稀疏方程的线性系统。对于我的最终结果,我只需要其中一个变量的值:其他值无关紧要。虽然简单地求解方程并提取正确的变量并没有真正的问题,但我想知道是否有更快的方法或 Matlab 命令。例如,只要计算出所需的变量,程序原则上就可以停止运行。

有没有人知道这是否可能,或者继续解决整个系统是否会更容易?

4

2 回答 2

2

大部分的计算时间都花在了矩阵的求逆上,如果我们能找到一种方法来避免矩阵的完全求逆,那么我们也许可以提高计算时间。假设我只对最后一个变量的解决方案感兴趣x(N)。使用我们计算的标准方法

x = A\b;
res = x(N);

假设A是满秩,我们可以改为使用增广矩阵的 LU 分解[A b]来得到x(N)如下所示的

[~,U] = lu([A b]);
res = U(end,end-1)/U(end,end);

x(N)这本质上是执行高斯消除,然后使用反向替换求解。

我们可以通过交换LU 分解之前x的列来扩展它以找到 的任何值,A

x_index = 123;    % the index of the solution we are interested in
A(:,[x_index,end]) = A(:,[end,x_index]);
[~,U] = lu([A b]);
res = U(end,end)/U(end,end-1);

在 MATLAB2017a 中使用 10,000 个随机 200 维系统进行基准测试,我们得到了轻微的加速

Total time direct method : 4.5401s
Total time LU method     : 3.9149s

请注意,如果A条件不佳,您可能会遇到一些精度问题。

此外,这种方法没有利用A. 在我的实验中,即使使用 2000x2000 稀疏矩阵,一切都明显变慢了,LU 方法也明显变慢了。也就是说,完整的矩阵表示只需要大约 30MB,这在大多数计算机上应该不是问题。

于 2018-01-14T18:43:26.813 回答
1

如果您可以访问 NASTRAN 的理论手册,我相信(从记忆中)涵盖了线性系统的部分解决方案。还可以尝试寻找 A*x = b 的迭代或三对角求解器。在此页面上,查看 Shantachhani 的 pqr 解决方案答案。另一个参考

于 2018-01-14T18:29:26.683 回答