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;
}

最终显示正确结果

 

 

 

 

 

posted @ 2013-02-26 23:20  liang_l  阅读(1212)  评论(0编辑  收藏  举报