在朱莉娅有效地解决特定的线性系统

时间:2016-07-20 17:07:36

标签: julia linear-algebra numerical-methods

我广泛使用了朱莉娅的线性方程求解器res = X\b。由于参数变化,我必须在我的程序中使用它数百万次。这工作正常,因为我使用的是小尺寸(最多30)。现在我想要分析更大的系统,直到1000,线性求解器不再有效。

我认为可以解决这个问题。但是我必须说有时我的X矩阵是密集的,有时是稀疏的,所以我需要一些适用于这两种情况的东西。

b向量是一个全零的向量,除了一个始终为1的条目(实际上它始终是最后一个条目)。此外,我不需要所有res向量,只需要它的第一个条目。

3 个答案:

答案 0 :(得分:4)

通常当人们谈论加速线性求解器res = X \ b时,它就是多个b。但是,由于您的b没有变化,并且您只是不断更改X,所以这些技巧都不适用。

从数学的角度来看,加快这一点的唯一方法似乎是确保Julia选择X \ b的最快解算器,即如果你知道X是正定的,使用Cholesky等Matlab’s flowcharts来获取用于X \ b的解算器,对于密集和稀疏X,它们是可用的 - 很可能Julia也实现了接近这些流程图的东西,但是再一次,也许你可以找到一些简化或快捷方式。

所有与编程相关的加速(多个线程 - 虽然每个单独的解算器可能已经是多线程的,但当每个解算器使用的线程少于核心时,可能值得并行运行多个求解器; @simd如果你是愿意深入研究解决方案; OpenCL / CUDA库等;然后可以应用。

答案 1 :(得分:4)

如果您的问题的格式为(A - µI)x = b,其中µ是变量参数且Ab已修复,则可以使用对角化。

A = PDP°其中表示P的倒数。然后(PDP° - µI)x = b可以转换为

(D - µI)P°x = P°b, 
P°x = P°b / (D - µI), 
x = P(P°b / (D - µI)).

/操作表示由标量Dr - µ划分各个向量元素。)

对角化A后,为任何µ计算解决方案会减少为两个矩阵/矢量积,或者如果您还可以预先计算P°b,则为单个积分。

数值不稳定性将显示在A的特征值附近。

答案 2 :(得分:0)

效率的最佳方法是使用:JuliaMath / IterativeSolvers.jl。对于A * x = b问题,我建议x = lsmr(A, b)

第二个最佳替代方案是向编译器提供更多信息:如果Cholesky分解适合您,则执行x = inv(A'A) * A' * b而不是x = inv(cholfact(A'A)) A' * b。否则,您可以尝试U, S, Vt = svd(A)x = Vt' * diagm(sqrt.(S)) * U' * b

不确定x = pinv(A) * b是否已优化,但效率可能略高于x = A \ b