反复解决A x = bAx=b同一个A, 不同的bb

计算科学 线性代数 matlab 线性求解器 矩阵 线性系统
2021-12-15 02:06:32

我正在使用 MATLAB 解决一个涉及求解的问题Ax=b在每个时间步长,其中b随时间变化。现在,我正在使用 MATLAB 完成此操作mldivide

x = A\b

我可以根据需要灵活地进行尽可能多的预计算,所以我想知道是否有比mldivide. 通常在这里做什么?谢谢大家!

4个回答

您可以做的最明显的事情是预先计算

[L,U] = lu(A)~ O(n^3)

然后你只需计算

x = U \ (L \ b)~ O(2 n^2)

这将大大降低成本并使其更快。准确度是一样的。

我们在关于这个主题的科学计算课程中做了一些广泛的计算机实验室。对于我们在那里进行的“小”计算,Matlab 的反斜杠运算符总是比其他任何东西都快,即使在我们尽可能优化代码并事先重新排序所有矩阵之后(例如,使用 Reverse Cuthill McKee 对稀疏矩阵进行排序) .

您可以查看我们的实验室说明之一。第 4 页(很快)介绍了您的问题的答案。

例如,切尼写了一本关于该主题的好书

认为A是一个n×n 密集矩阵,你必须解决Axi=bi,i=1m. 如果m足够大,那么就没有错

V = inv(A);
...
x = V*b;

翻牌是O(n3)对于inv(A)O(n2)V*b因此为了确定盈亏平衡值m需要一些实验...

>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
   1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc     
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
   1.0e-11 *
    0.1912    0.1912    0.1912    0.6183

在这个简单的例子中A1预计算优于LU前向和后向解决方案m>125.

一些笔记

有关稳定性和错误分析,请参阅对此不同答案的评论,尤其是 VictorLiu 的评论。

提议的时间安排根本不是“科学的”,而是为了表明 Milind R 在答案中提出的方法,虽然如果通过调用相关的 LAPACK 和 BLAS 子例程在 C 或 Fortran 中实现它是完全有意义的,但可能证明不是这样在 Matlab 中有效,即使对于mn.

时序是在一台 12 核计算机上使用 Matlab R2011b 执行的,UNIX 平均负载相当恒定,为 5;三探头的最佳tic, toc时间。

看一下这个问题,答案说明mldivide很聪明,也给出了如何看Matlab用什么来解决的建议A\b这可能会为您提供有关优化选项的提示。