umFPACK使用调用(一)
测试平台:VS2008
新建工程-添加源文件和头文件
main函数
#include<iostream> #include"callumfpack.h" using namespace std; //int print(int **A) int main() { //int A[2][2]={0}; //printf("%d ",A[1][1]); /*int **A=new int *[2]; for(int i=0;i<2;i++) A[i]=new int [2]; for(int i=0;i<2;i++) for(int j=0;j<2;j++) A[i][j]=0;*/ //int A[5][5]={ // {2, 3, 0, 0, 0}, // {3, 0, 4, 0, 6}, // {0,-1,-3, 2, 0}, // {0, 0, 1, 0, 0}, // {0, 4, 2, 0, 1} //}; int n=5; int **A=new int *[n]; for(int j=0;j<n;j++) A[j]= new int[n]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&A[i][j]); double b [ ] = {8., 45., -3., 3., 19.} ; double *x=new double[n]; print( A ,b, x); return 0; }
callumfpack头文件
//Data:2013-2-24 //修改了Ai Ax的类型 利用最大维数n*n来保存,可以调用正确结果 不过不知系统随机分配的值 函数没有用 //Data:2013-2-26 //调用UMFPACK包来实现求解方程组 //UMFPACK采用CSC(列压缩存储) matlab中的接口为A/b #include <stdio.h> #include <math.h> #include "umfpack.h" int print(int **A,double *b,double *x) { printf("--"); //printf("%d \n",A[1][1]); int n=5; double *null =(double *)NULL ; void *Symbolic, *Numeric ; int i,j; /* //定义矩阵A int **A=new int *[n]; for(j=0;j<n;j++) A[j]= new int[n]; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&A[i][j]); */ int *Ap=new int [n+1]; Ap[0]=0; int *Ai=new int[n*n]; for(i=0;i<n*n;i++) Ai[i]=1; double *Ax=new double[n*n]; for(i=0;i<n*n;i++) Ax[i]=1; double epsilon=0.00001; int NZnum=0;//矩阵非零元的个数 int k=0,l=0,m=0; for(j=0;j<n;j++) { for(i=0;i<n;i++) { if(abs(A[i][j])>epsilon) { Ai[l++]=i; Ax[m++]=A[i][j]; NZnum++; } } Ap[k+1]=NZnum; k++; } Ap[n]=NZnum; printf("--Ai---\n"); for (int i=0; i<n*n; i++) { printf("%d ", Ai[i]); } printf("\n"); umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, null, null); umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, null, null) ; umfpack_di_free_symbolic (&Symbolic); umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null, null); umfpack_di_free_numeric (&Numeric) ; for(i=0;i<n;i++) printf("x[%d]=%g\n", i, x[i]) ; return 0; }
最终显示正确结果