用分布式阵列直接法求解线性方程组
这个例子展示了如何求解这种形式的线性方程组 与使用分布式阵列的直接方法并行。
分布式数组非常适合于大型数学计算,例如线性代数的大型问题。与存储在客户机内存中的数组相同,您可以使用mldivide
求解可以使用分布式阵列定义的线性方程组,因此不需要更改代码。
分布式数组将数据从客户机工作空间分发到本地机器或集群中的并行池。每个worker在其内存中存储数组的一部分,但也可以与其他worker通信以访问数组的所有段。分布式数组可以包含不同类型的数据,包括完整矩阵和稀疏矩阵。
求解线性方程的直接方法通常将系数矩阵因式分解
来计算解。mldivide
的结构选择一组直接求解方法中的一种
以及是否
是满的或稀疏的。
这个例子演示了如何求解这样一个简单的线性方程组 用一个确切的已知解 .系统由矩阵定义 列向量 .解决方案 也是一个列向量。在本例中,系统是使用全矩阵和稀疏矩阵定义的。对于使用分布式数组或客户端内存上的数组定义的系统,所需的代码是相同的。
有关展示如何使用迭代求解器和分布式数组的相关示例,请参见用分布数组迭代法求解线性方程组.
解一个全矩阵系统
首先定义系数矩阵
作为客户端内存中的变量,一个
,然后把这个矩阵传递给分布式
函数创建相同矩阵的分布式版本,ADist
.当您使用分布式
函数,MATLAB自动启动一个并行池使用您的默认集群设置。
n = 1 e3;一个=兰迪(100 n, n);ADist =分布式(A);
现在可以定义右手向量了 .在这个例子中, 定义为的行和 的精确解 的形式 .
b =和(2);bDist = (ADist, 2)之和;
自总和
作用于分布式阵列,bDist
也是分布式的,它的数据存储在并行池的工作线程的内存中。最后,定义精确解,与直接数值方法得到的解进行比较。
xEx = 1 (n, 1);xDistEx = 1 (n, 1“分布式”);
既然已经定义了线性方程组,就可以使用mldivide
直接求解方程组。在MATLAB中,你可以调用mldivide
使用特殊操作符\
.您不必更改代码来解决分布式系统asmldivide
具有对分布式阵列的自动支持。
一旦计算出了解,就可以检查得到的结果的每个元素之间的误差 的期望值 .
x = \ b;呃= abs (xEx-x);xDist = ADist \ bDist;errDist = abs (xDistEx-xDist);图次要情节(2,1,1)semilogy(呃,“o”);标题(“全矩阵线性方程组”);ylabel (的绝对误差);包含(“x元素”);ylim ([10 e-17, e-13])次要情节(2,1,2)semilogy (errDist,“o”);标题(“分布全矩阵线性方程组”);ylabel (的绝对误差);包含(“x元素”);ylim ([10 e-17, e-13])
对于分布式阵列和存储在客户端的阵列,计算结果之间的绝对误差为 确切的结果是 很小。对于这两种数组类型,该解决方案的精度大致相同。
意思是(err)
ans = 1.6031 e-13
意思是(errDist)
ans = 1.2426 e-13
求解一个稀疏矩阵系统
分布式数组也可以包含稀疏数据。来创建系数矩阵
,使用sprand
而且speye
直接生成随机数的稀疏矩阵加上稀疏单位矩阵。添加单位矩阵有助于防止创建
作为奇异或近奇异矩阵,两者都很难因式分解。
n = 1 e3;密度= 0.2;A = sprand(n,n,density) + speye(n);ADist =分布式(A);
选择右手向量 的行和 得到与完整矩阵系统的解形式相同的精确解。
b =和(2);bDist = (ADist, 2)之和;xEx = 1 (n, 1);xDistEx = 1 (n, 1“分布式”);
用和全矩阵一样的方法,你现在可以直接用mldivide
并检查得到的结果与期望值之间的误差。
x = \ b;呃= abs (xEx-x);xDist = ADist \ bDist;errDist = abs (xDistEx-xDist);图次要情节(2,1,1)semilogy(呃,“o”);标题(“客户端内稀疏矩阵线性方程组”);ylabel (的绝对误差);包含(“x元素”);ylim ([10 e-17, e-13])次要情节(2,1,2)semilogy (errDist,“o”);标题(“分布稀疏矩阵线性方程组”);ylabel (的绝对误差);包含(“x元素”);ylim ([10 e-17, e-13])
与全矩阵系统一样,同时使用客户端阵列和分布式阵列求解线性方程组的结果具有相当的精度。
意思是(err)
ans = 1.6031 e-13
意思是(errDist)
ans = 1.2426 e-13
在完成计算之后,可以删除并行池。的gcp
函数返回当前并行池对象,以便您可以删除当前池。
删除(gcp (“nocreate”));
提高解决方案的效率
对于某些类型的大而稀疏系数矩阵 ,有比直接因式分解更有效的方法来求解你的方程组。在这些情况下,迭代法在求解线性方程组时可能更有效。迭代法产生一系列近似解,收敛到最终结果。有关如何使用迭代方法求解具有大型稀疏输入矩阵的线性方程的示例,请参见用分布数组迭代法求解线性方程组.