UMFPACK的使用

UMFPACK的使用

2008-3-25       Jingwenlai

UMFPACK是求解线性方程组AX=B的函数库。其使用也比较简单。以下先给个原UserGuide中简单的例子:

#include <iostream>

#include "umfpack.h"

using namespace std;

 

#pragma comment(lib,"libamd.lib")

#pragma comment(lib,"libatlas.lib")

#pragma comment(lib,"libf77blas.lib")

#pragma comment(lib,"libg 2c .lib")

#pragma comment(lib,"libgcc.lib")

#pragma comment(lib,"libumfpack.lib")

 

int n = 5;

int Ap[] = {0,2,5,9,10,12};

int Ai[] = {0,1,0,2,4,1,2,3,4,2,1,4};

double Ax[] = {2.0,3.,3.,-1.,4.,4.,-3.,1.,2.,2.,6.,1.};

double b[] = {8.,45.,-3.,3.,19.};

double x[5];

 

int main()

{

    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_numeric(&Symbolic);

    umfpack_di_solve(UMFPACK_A,Ap,Ai,Ax,x,b,Numeric,null,null);

    umfpack_di_free_numeric(&Numeric);

    for(int i = 0; i < n; i++)

       cout<<"x["<<i<<"]="<<x[i]<<endl;

    return 0;

}

UMFPACKTaucs一样,为节省存储空间,都采用Compressed Column Storage来存储。这种存储只需要2nnz+n+1的存储空间,而传统的二维方式存储则需要n*n的存储空间。有关Compressed Column Storage的描述请先参见以下的Compressed Row StorageCCS的介绍:

CCS实际上可以看成A^TCRS:

 

相对于TAUCS来说,UMFPACK可能较少人使用,但是,TAUCS在我看来,对求解AXB时输入A不方便,而UMFPACK除提供了如上面的例子那样的CCS格式外,还提供了另外一种称为triplet的格式作为输入,然后可以通过umfpack_triplet_to_col来将triplet格式转换成CCS格式,继而使用UMFPACK中的函数进行求解。Triplet格式可以看成(i ,j ,Aij).若一个稀疏阵有nnz个非零元素,则Ti[nnz],Tj[nnz],Tx[nnz]可以保存所有的非零元素。例,若Ti[k] = I,Tj[k] = j, Tx[k] = a,则表示Aij列为元素a

在输入完矩阵的元素并进行转换之后,用UMFPACK求解的步骤只包括三步,即SymbolicFactorization,NumericalFactorization,Solve.

本文只是对UMFPACK的简单介绍,详细的使用请参见UserGuide.

 
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值