Ubuntu下C语言调用UMFPACK求解稀疏矩阵

记录程序人生

环境:linux 我用的是 ubuntu 16.04

稀疏矩阵解题数学库 - UMFPACK

1、UMFPACK 简介

UMFPACK就是求解类似于 Ax=b 这样问题的一个库,来自佛罗里达州立大学。 一般情况下A 是稀疏非对称的矩阵。UMFPACk可以对矩阵进行 LU分解(LU 分别是下三角矩阵和上三角矩阵)

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格式