广义特征值问题,即Ax=
Bx,
在Matlab中,使用eig()求解一般特征值问题和广义特征值。[V,D] = eig(A,B,flag), A和B时方阵,flag用来选择算法,'qz'表示选择使用QZ算法。
也可以直接调用qz()来求解,[AA,BB,Q,Z,V] = qz(A,B,flag), flag 表示使用复数或实数计算,默认取值为复数。
在Lapack中,有四个函数都是用来求解广义特征值的,
?GEGS Computes the generalized eigenvalues, Schur form, and left and/or right Schur vectors for a pair of non-symmetric matrices.
?GGES Computes the generalized eigenvalues, Schur form, and left and/or right Schur vectors for a pair of non-symmetric matrices.
?GEGV Computes the generalized eigenvalues, and left and/or right generalized eigenvectors for a pair of non-symmetric matrices.
?GGEV Computes the generalized eigenvalues, and left and/or right generalized eigenvectors for a pair of non-symmetric matrices.
区别在于前两个分解之后会输出舒尔形式,后两个则输出广义特征向量。而且gegs和gegv都被gges和ggev代替。两个都会用QZ分解求解广义特征值。
LAPACK也给出了QZ分解的函数dhgeqz,但要求输入H,T矩阵,对于一般的方阵,可以使用dgghrd将输入的方阵A,B变换成H,T矩阵。
下面给出这四个函数的原型和测试程序。
#include <iostream>
#include <iomanip>
#include <cmath>
#include <complex>
using namespace std;
typedef complex<double> dcomplex_t;
//lapacke headers
#include "lapacke.h"
#include "lapacke_config.h"
#include "lapacke_utils.h"
extern "C" {
lapack_int LAPACKE_dggev( int matrix_order, char jobvl, char jobvr,
lapack_int n, double* a, lapack_int lda, double* b,
lapack_int ldb, double* alphar, double* alphai,
double* beta, double* vl, lapack_int ldvl, double* vr,
lapack_int ldvr );
lapack_int LAPACKE_dgges( int matrix_order, char jobvsl, char jobvsr, char sort,
LAPACK_D_SELECT3 selctg, lapack_int n, double* a,
lapack_int lda, double* b, lapack_int ldb,
lapack_int* sdim, double* alphar, double* alphai,
double* beta, double* vsl, lapack_int ldvsl,
double* vsr, lapack_int ldvsr );
lapack_logical selectg(const double* AR,const double* AI,const double* B){
if(fabs(
LAPACK与Matlab中的广义特征值问题与QZ分解解析

本文探讨了在Matlab和LAPACK中解决矩阵广义特征值问题的方法,重点介绍了QZ分解。在Matlab中,eig()函数用于一般和广义特征值计算,而LAPACK提供了多个函数如dhgeqz、dgges等处理广义特征值问题。文章通过实例展示了函数的使用,并提到了Matlab与LAPACK在QZ分解结果上的差异。
最低0.47元/天 解锁文章
1558

被折叠的 条评论
为什么被折叠?



