Matlab:求解线性方程组中的单个变量

时间:2018-01-14 17:47:37

标签: matlab linear-equation

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

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

2 个答案:

答案 0 :(得分:2)

大部分计算时间用于反转矩阵,如果我们能找到避免完全反转矩阵的方法,那么我们就可以改善计算时间。让我们假设我只对最后一个变量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分解之前交换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);

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

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

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

此外,这种方法并没有利用A的稀疏性。在我的实验中,即使使用2000x2000稀疏矩阵,一切都显着减慢,LU方法明显变慢。那说全矩阵表示只需要大约30MB,这在大多数计算机上都不应该成为问题。

答案 1 :(得分:1)

如果您可以访问NASTRAN上的理论手册,我相信(从内存中)可以看到线性系统的部分解决方案。同时尝试寻找A * x = b的迭代或三对角解算器。在此page上,查看Shantachhani的pqr解决方案答案。另一个reference