zoukankan      html  css  js  c++  java
  • 在VS中用CLAPACK解决广义特征值问题

    CLAPACK是LAPACK的C语言接口。LAPACK的全称是Linear Algebra PACKage,是非常著名的线性代数库。LAPACK是用Fortran写的,为了方便C/C++程序的使用,就有了LAPACK的C接口库CLAPACK。


    现在通过使用CLAPACK中的一个函数dggev_解广义特征值问题来学习一下使用的方法。


    平台:vs05


    步骤:

    1.下载 clapack-3.2.1-CMAKE.tgz并解压缩.

    2.下载 CMAKE 并安装.

    3.使用 CMAKE

    1)打开CMAKE-gui

    2)将Source目录指向你的CLAPACK-3.2.1-CMAKE文件夹

    3)将Bulid目录指向你准备存放生成文件的文件夹

    4)点击configure, 选择vs05作为你的编译器

    5)你需要再次点击configure直到所有选项都变成白色.

    6)点击generate, 将会生成Visual Studio 需要的项目和工程文件, 这就完成了

    7)查看"build"指向的文件夹,打开CLAPACK.sln

    8)激活"ALL_BUILD"工程,就可以组建(bulid)出所需要的所有的库文件了


    编译完成后,找到libf2c.lib blas.liblapack.lib tmglib.lib。这些都是你自己编写程序时需要调用的库。另外,在lapack-3.2.1-CMAKE.tgz解压的文件夹\INCLUDE中的包含了这些库的头文件。


    4.头文件

    头文件就是.h文件。存放在\INCLUDE中。在自己的工程里加入这个目录就行了。程序中主要调用的头文件是f2c.h和clapack.h。

    注意:包含时应如下:

    #include <f2c.h>

    //因为程序是C++,而CLAPACKf2c程序转换的C语言版本,所以在此处用extern关键字调用

    关于extern "C",详细如:http://blog.csdn.net/silyvin/article/details/8984885

    extern"C"

    {

    #include <clapack.h>

    }


    在本次项目中,直接声明函数即可:

    http://www.mathkeisan.com/UsersGuide/man/dggev.html


    typedef long int integer;
    typedef double doublereal;
    extern "C" int dggev_(char *jobvl, char *jobvr, integer *n, doublereal *
    							a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, 
    							doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, 
    							doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, 
    							integer *info);


    5.库文件

    库文件就是我们前面编译生成的那些lib文件了。

    vs配置,属性——链接器——输入——附加依赖性:libf2cd.lib blasd.lib lapackd.lib tmglibd.lib


    6.其他配置

    详细见:http://wenku.baidu.com/view/acb2cf966bec0975f465e2f1.html


    7.算例

    http://wenku.baidu.com/view/392a333887c24028915fc3b7.html第42页算例测试库及函数

    函数如下:

    void func2()
    {
    	char JOBU = 'V';
    	char JOBVT = 'V';
    	integer INFO = 1111;
    	    integer N = 2;    
    		int const nn = 4;
    		int const n2 = 2;
    		double A[nn] = {2.0,1.0,1.0,3.0};   
    		double B[nn] = {2.0,1.0,1.0,1.0};    
    		double vl[nn];
    		double vr[nn];
    		double alphar[n2];    
    		double alphai[n2];    
    		double beta[n2];    
    
    	 double wk[201];
    	   integer   LWORK = 201;
    
    	dggev_(&JOBU, &JOBVT, &N, A, &N, B, &N, alphar, alphai, beta, vl, &N, vr, &N,wk, &LWORK, &INFO);
    	printf("%d\n", INFO);		// 返回码
    	for(int i=0; i<n2; ++i)
    		printf("%lf\n", alphar[i] / beta[i]);
    
    	for(int i=0; i<4; ++i)
    	{
    		printf("%lf\n", vr[i]);
    	}
    
    }

    其中 alphar / beta 为特征值

    vr依次放着所有特征值所对应的特征向量

    输出:

    第一个0为返回码,0则说明调用正确

    特征值为 1 , 5

    相应的特征向量为 {1,0},{-0.5,1}

    解析解:



    参考:

    http://zh.wikipedia.org/wiki/LAPACK
    http://icl.cs.utk.edu/lapack-for-windows/lapack/#lapacke
    http://www.netlib.org/lapack/

    在windows下使用LAPACK
    http://www.cnblogs.com/longdouhzt/archive/2012/04/20/2459753.html

    LAPACK++翻译
    http://blog.csdn.net/liuming_hz/article/details/7060525

    LAPACK函数介绍
    http://www.doc88.com/p-468115439653.html
    http://wenku.baidu.com/view/caffedd53186bceb19e8bb3b.html
    http://wenku.baidu.com/view/45b5b9d176a20029bd642d32.html
    http://www.mathkeisan.com/UsersGuide/man/dsbgv.html

    质量矩阵 刚度矩阵 正定?
    http://jpkc.nwpu.edu.cn/jp2009/04/oldsite/wlkc2/dd04/4-2.htm

    DSBGV详解
    http://blog.sina.com.cn/s/blog_60f8483a0100pz1e.html
    http://www.mathkeisan.com/UsersGuide/man/dsbgv.html
    http://www.cnblogs.com/Frandy/archive/2011/07/16/LAPACK_QZ_dgeev.html

    走进lapack
    http://www.cnblogs.com/xunxun1982/archive/2010/05/12/1734001.html

    CLAPACK
    http://icl.cs.utk.edu/lapack-for-windows/clapack/index.html#running
    http://www.cnblogs.com/FengYan/archive/2012/07/20/2597141.html





  • 相关阅读:
    time 模块学习
    day 14 自定义模块,常用模块 time .datetime ,time 模块
    day 13 课后作业
    day 12 课后作业
    day 11课后作业
    树状数组最值
    hdu 1059 Dividing bitset 多重背包
    XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship
    最长公共子序列板/滚动 N^2
    Uva 10635
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106891.html
Copyright © 2011-2022 走看看