Ubuntu下C语言调用UMFPACK求解稀疏矩阵
记录程序人生
环境:linux 我用的是 ubuntu 16.04
稀疏矩阵解题数学库 - UMFPACK
1、UMFPACK 简介
UMFPACK就是求解类似于 Ax=b 这样问题的一个库,来自佛罗里达州立大学。 一般情况下A 是稀疏非对称的矩阵。UMFPACk可以对矩阵进行 LU分解(L 和 U 分别是下三角矩阵和上三角矩阵)
2、C语言使用UMFPACK
根据稀疏矩阵的非零元素个数以及是否实数,UMFPACK主要提供以下几个种类的函数供调用:
(1)函数类型
1. umfpack_di_*: //非零元素的个数为 int 型,元素为实数
2. umfpack_dl_***: //非零元素的个数为 SuiteSparse_long型,元素为实数
3. umfpack_zi_*: //非零元素的个数为 int 型,元素为复数
4. umfpack_zl_*: // 非零元素的个数为 SuiteSparse_long型,元素为复数
(2)常用函数
主要有以下5个函数,也是用来求解Ax=b 的5个步骤:
1.umfpack_*_symbolic:
//该函数会返回一个指向Symbolic类型的void * 指针。主要进行符号分解。
2.umfpack_*_numeric:
//该函数主要对之间所说的矩阵进行数值分解,需要用到umfpack_*_symbolic返回的结果。
3.umfpack_*_solve:
//该函数用来求解线性系统(Ax=b),会用到umfpack_*_numeric返回的结果。矩阵A必须是方的。
4.umfpack_*_free_symbolic:
//释放umfpack_*_symbolic得到的Symbolic对象。
5.umfpack_*_free_numeric:
//释放umfpack_*_numeric得到的Numeric对象。
(3)UMFPACK矩阵测试
int n = 5 ;
int Ap [5] = {0, 2, 5, 9, 10, 12} ;
int Ai [12] = { 0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4} ;
double Ax[12] = {2.0, 3.0, 3.0, -1.0, 4.0, 4.0, -3.0, 1.0, 2.0, 2.0, 6.0, 1.0} ;
double b[5] = {8.0, 45.0, -3.0, 3.0, 19.0} ;
double x[5];
double *null = (double *) NULL ;
void *Symbolic, *Numeric ;
(void) umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, null, null) ;
(void) umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, null, null) ;
umfpack_di_free_symbolic (&Symbolic) ;
(void) umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null, null) ;
umfpack_di_free_numeric (&Numeric) ;
// 此例中Ax=b, A为5*5稀疏矩阵,b为长度为5的矩阵
// 求出的值在数组x[5]中
// 此例中A的稀疏矩阵存储方式为CSR格式