【发布时间】:2018-01-14 17:47:36
【问题描述】:
我在 Matlab 中有一个由大约 2000 个稀疏方程组成的线性系统。对于我的最终结果,我只需要其中一个变量的值:其他值无关紧要。虽然简单地求解方程并提取正确的变量并没有真正的问题,但我想知道是否有更快的方法或 Matlab 命令。例如,只要计算出所需的变量,程序原则上就可以停止运行。
有没有人知道这是否可能,或者继续解决整个系统是否会更容易?
【问题讨论】:
我在 Matlab 中有一个由大约 2000 个稀疏方程组成的线性系统。对于我的最终结果,我只需要其中一个变量的值:其他值无关紧要。虽然简单地求解方程并提取正确的变量并没有真正的问题,但我想知道是否有更快的方法或 Matlab 命令。例如,只要计算出所需的变量,程序原则上就可以停止运行。
有没有人知道这是否可能,或者继续解决整个系统是否会更容易?
【问题讨论】:
大部分计算时间都花在了矩阵的求逆上,如果我们能找到一种方法来避免矩阵的完全求逆,那么我们或许可以改进计算时间。假设我只对最后一个变量x(N) 的解决方案感兴趣。使用我们计算的标准方法
x = A\b;
res = x(N);
假设A 是满秩,我们可以改为使用增广矩阵[A b] 的LU 分解得到x(N),如下所示
[~,U] = lu([A b]);
res = U(end,end-1)/U(end,end);
这实质上是执行高斯消除,然后使用反向替换求解x(N)。
我们可以通过在 LU 分解之前交换 A 的列来扩展它以找到 x 的任何值,
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,这在大多数计算机上应该不是问题。
【讨论】: