c++ - 使用 LAPACK 计算无限带状矩阵的特征值

标签 c++ lapack eigenvalue

我是 C++ 的新手,正在尝试弄清楚如何使用 LAPACK 来查找无限带状矩阵(非谐波振荡器问题)的特征值。我知道我正在正确计算矩阵,因为我检查了值并且它们都匹配。但是,我不确定我是否正确地将值传递给子例程,或者我是否混淆了一些东西,因为返回的特征值不是我所期望的。我正在使用 dsbtrd 子例程来计算它。这是手册:http://www.netlib.org/lapack/explore-html/d0/d62/dsbtrd_8f.html

关于我可能哪里出错的任何想法?

#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
using namespace std;

//SUBROUTINE DSBTRD( VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO )

extern "C" {
  void dsbtrd_(const char *vect, const char *uplo, int *n, int *kd, double *ab, int *ldab, double d[], double e[], double *q, int *ldq, double work[], int *info);
}

#define MAX 14

int main(){
    // Values needed for dsbtrd
    const char *vect = "V";
    const char *uplo = "U";
    int n;
    int ldab = MAX;
    int ldq = MAX;
    int info;
    double ab[MAX][ldab];
    double d[MAX];
    double e[MAX];
    double q[MAX][ldq];
    double work[MAX];

    //other values needed
    int i,j,delta;
    double eps;
    double a[MAX][MAX];
    double g[MAX][MAX];

    //Read in value of eps and n
    cout <<"Enter epsilon: \n";
    cin >> eps;
    cout << "Epsilon = " << eps << "\n";

    cout <<"Enter n: \n";
    cin >> n;
    cout << "n = " << n << "\n";

    if(n >= MAX){
         cerr << "n is great than max \n";
     }

     //Build matrix g
     for(j = 0; j < n; j++){
         for(i = 0; i < n; i++){
             int m = min(i,j);

             if(i == j){
                 g[i][j] = 1.5*(pow(m,2) + m +.5);
             }else if( i == j + 2 || i == j - 2){
                 g[i][j] = (m + 1.5)*sqrt((m+1)*(m+2));
             }else if(i == j + 4 || i == j -4){
                 g[i][j] = .25*sqrt((m+1)*(m+2)*(m+3)*(m+4));
             }else{
                 g[i][j] = 0;
             }
         }
    }

    //Build the starting matrix a
    //row i, column j

    for(j = 0; j < n; j++){
        for(i = 0; i < n; i++){
            if(i == j){
                delta = 1;
            }else{
                delta = 0;
            }

            a[i][j] = (i + .5)*delta + eps*g[i][j];
        }
    }

    //Build the matrix ab
    // ab(kd+1+i-j,j) = a(i,j) for max(1,j-kd)<=i<=j
    int kd = n - 1;

    for(j = 1; j <= n; j++){
        for(i = max(1,j-kd); i <= j; i++){
            ab[j-1][kd+i-j] = a[j-1][i-1];
        }
    }

    //Solve for eigenvalues
    dsbtrd_(vect, uplo, &n, &kd, &ab[0][0], &ldab, d, e, &q[0][0], &ldq, work, &info);

    //Check for success
    if(info == 0)
    {
        //Write answer
        for(i = 0; i < n; i++){
            cout << "Eigenvalue " << i << ": " << d[i] << "\n";
        }
    }
    else
    {
        //Write error
        cerr << "dsbtrd returned error " << info << "\n";
    }
    return info;
}

最佳答案

DSBTRD 不计算特征值。它将矩阵简化为三对角形式;您正在拉出生成的三对角矩阵的主对角线并假装它们是特征值,但实际上它们不是。

您需要在生成的三对角形式上调用 DSTERF(或其他几个例程之一)以获得特征值。

有关更多详细信息,请咨询 LAPACK User's Guide .

关于c++ - 使用 LAPACK 计算无限带状矩阵的特征值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217177/

相关文章:

osx-lion - 如何使用加速框架进行矩阵求逆运算?

algorithm - 求小一般复矩阵最大特征对的高效算法

c++ - 如何找到OpenCV中最低特征值对应的特征向量?

c - xGEHRD 和 xHSEQR 例程中 WORK 数组的维数在特征值计算中是否应该相等?

c++ - 加密文本文件的简单方法

c++ - 如何设置QSerialPort打开的串口低延迟

c++ - 为什么我在尝试此 OpenGL 教程时得到 "r300 FP: Compiler Error:"?

c - 静态链接 LAPACK

java - 用java获取特征值PCA

c++ - map 中具有指针类型的 Const Boost 变体