中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Web开发 > JavaScripts > 综合文章
用sparselib库解稀疏矩阵线性方程组
作者:佚名 时间:2005-02-18 11:03 出处:互连网 责编:chinaitpower
              摘要:用sparselib库解稀疏矩阵线性方程组

下面用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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有