CSDN博客

img coolend

用sparselib库解稀疏矩阵线性方程组

发表于2004/12/28 23:08:00  2000人阅读

下面用GMRES(Generalized Minimum Residual Method)
演示用sparselib解线性方程组。
在matlab里可以用以下的命令,
GMRES(A,B,RESTART,TOL,MAXIT);
类似得在vc++中可以这样:

#include <cstdlib>
#include <iostream>
#include "compcol_double.h"
#include "mvvtp.h"
#include "mvblasd.h"
#include "ilupre_double.h"
#include "gmres.h"
#include "spblas.h"
#include "mvm.h"
//#include MATRIX_H
//using namespace std;

int main(void)
{
   double val[] = {10, 3, 3, 9, 7, 8, 4, 9, 8, 7, 7, 9, -2, 5, 9, 2, 3, 13, -1};
   int row_ind[] = {0, 1, 3, 1, 2, 4, 5, 2, 3, 2, 3, 4,  0, 3, 4, 5, 1, 4,  5};
   int col_ptr[] = {0, 3, 7, 9, 12, 16, 19};

   int maxit = 150;                     // maximum iteration
   int nUnknown = 6;                    // unknown, the size of Jacobi
   int nNonZero = 19;                   // nonZero values in the matrix
   int results;
   int restart = 10;                    // restart iterations
   double tol = 1.e-6;                  // convergence tolerance

   CompCol_Mat_double  Jacobi(nUnknown, nUnknown, nNonZero, val, row_ind, col_ptr);
   //cout << Jacobi;
   CompCol_ILUPreconditioner_double M(Jacobi); // construct preconditioner

   MATRIX_double H(restart+1, restart, 0.0);   // storage for upper Hessenberg H;
   VECTOR_double xi(nUnknown, 0);
   VECTOR_double rhs(nUnknown);

   for(int i=0; i<nUnknown; i++)     rhs(i) =i+1;

/**********************************************************************
*      maxit AND tol WILL BE CHANGED AFTER ONE CALL OF GMRES,        **
*      SO FOR NEXT CALL, YOU SHOULD RESTORE THE OLD VALUE OF THEM    **
***********************************************************************/
   results = GMRES(Jacobi, xi, rhs, M, H, restart, maxit, tol); // call solver

   cout << "GMRES flag = " << results << endl;
   cout << "Iterations performed: " << maxit << endl;
   cout << "Tolerance achieved :" << tol << endl;
   for (i = 0; i < nUnknown; i ++){
     cout <<"xi["<<i<<"]="<<xi[i]<<"/n";
   }
   return results;
}


运行结果:
xi[0]=  0.248096
xi[1]=  0.705373
xi[2]=-1.49092
xi[3]= 1.64009
xi[4]= 0.740481
xi[5]=-1.69755
注意这里的稀疏矩阵用Harwell-Boeing格式存储,
    10     0     0     0    -2     0
     3     9     0     0     0     3
     0     7     9     7     0     0
     3     0     8     7     5     0
     0     8     0     9     9    13
     0     4     0     0     2    -1

具体可以参考
I.S. Duff,R.G.Grimes,and J.G.Lewis,Sparse matrix test problems,ACM Trans.Math.Soft

用上万阶sparse matrix测试发现结果满意。但是美中不足的是当在MFC里调用该库时link时冲突,一时也没找到解决的办法。

0 0

相关博文

我的热门文章

img
取 消
img即使是一小步
也想与你分享
打开
img