反对称实矩阵正则化

反对称实矩阵正则化

之前构造了一个办法来正则化反对称实矩阵:https://www.cnblogs.com/luyi07/p/15578164.html
那个办法只是初期尝试做的,它有漏洞。只要反对称实矩阵的特征值有简并,那个办法就失败。
所以现在重新做一个办法来正则化反对称实矩阵。

1. 反对称实矩阵特征值的特点

1.1 反对称实矩阵的非0特征值一定是纯虚数

设有反厄米矩阵 K,反厄米即 K=K,可以定义

H=iK,

则有

H=iK=iK=H,

H 是厄米矩阵。众所周知,厄米矩阵的特征值是实数,即存在幺正矩阵 U 和实数对角阵 Λ, 使得

H=UΛU

那么,

K=iH=U(iΛ)U,

这说明 (iΛ) 的对角元是 K 的特征值,U 的列向量是相应的本征向量。所以 K 的非0本征值都是纯虚数。
反对称实矩阵是反厄米矩阵的特殊情况,所以反对称实矩阵的非0特征值也是纯虚数。

1.2 反对称实矩阵的非0特征值一定是两两一组,每组两个特征值互为共轭,两个特征向量也互为共轭

假设 K 有特征值 λ,有

Kz=λz,

则有

(Kz)=(Kz)=λz,

再将上式左右取厄米共轭,得到

Kz=(λz)=λz,

这说明,(λ,z) 也是一个本正对(即本征值+本征向量)。
前面证明了 λ 是纯虚数,所以 λ0 时,λλ
因此,反对称实矩阵的非零特征值一定是两两一组,每组两个特征值互为共轭。

2. 反对称实矩阵正则化

2.1 非0本征值无简并的情况

我们先讨论简单的情况,即反对称实矩阵的非0本征值没有简并,即下面的式子中 λiλj,ij.
综合前面的分析,任意反对称实矩阵 K 可以写作

K=[z1,z1,]diag[λ1,λ1,,λk,λk,0,,0][z1,z1,]

其中 z1,z1, 为正交归一基,且 Kz=λz,  Kz=λz,且 λ0,记

z=x+iy2,       x,yRn

由归一性,

zz=(xiy)(x+iy)/2=|x|2+|y|22=1,|x|2+|y|2=2.

由于 λλ, 所以 z,z 必须正交——注意,复矢量内积定义为(α,β)=αβ——即

zz=0(xiy)(x+iy)=0{xy=0,xxyy=0},

所以有

|x|=|y|=1,   xy.

另外

{zk,zk}{zl,zl}{xk,yk}{xl,yl},

所以,以下基矢是正交归一基:

{x1,y1,,xk,yk,w2k+1,,wn},

其中,w2k+1,,wn 是人为补齐的实数矢量,对应值为 0 的特征值。
这套正交归一基有如下结构:

  • {xi,yi} 构成 K 的不变子空间。
  • {w2k+1,,wn} 构成 K 的不变子空间。

所以,如果用这套正交归一基构造幺正变换,会得到块对角形式

K[x1,y1,,xk,xy,w2k+1,,wn]=[x1,y1,,xk,xy,w2k+1,,wn][[0i2λ1i2λ10],,[0i2λki2λk0],0,,0].

由于 λ1,,λk 都是纯虚数,所以这样就把 K 正则化了。

[x1,y1,,xk,xy,w2k+1,,wn]K[x1,y1,,xk,xy,w2k+1,,wn]=[[0i2λ1i2λ10],,[0i2λki2λk0],0,,0].

2.2 非0本征值有简并的情况

非0本征值有简并的时候,就存在子空间。以2重简并为例(更高的简并是同理),假设 λ 有两重简并,那么根据前面的分析,λ 自然也是2重简并。

Kz1=λz1,  Kz2=λz2,  z1z2,|z1|=|z2|=1;Kz3=λz3,  Kz4=λz3,  z3z4,|z3|=|z4|=1.K[z1,z2,z3,z4]=[z1,z2,z3,z4]diag{λ,λ,λ,λ}.zi=(xi+iyi)/2.

2.2.1 xi,yi 这两个矢量正交归一

假设其对应的特征值是 μ,则有

Kzi=μzi,    Kzi=μzi,    zizi

因此有

(zi,zi)=12(|xi|2|yi|2+2ixiyi)=0,    |xi|=|yi|,xiyi.

另外有归一化条件

(zi,zi)=12(|x|2+|y|2)=1,

所以有

|xi|=|yi|=1,xiyi.

2.2.2 x1,y1,x2,y2正交

z1z2,这是我们知道的;另外,由于 z2 对应 λ,所以也有 z1z2;所以,自然有 z1{x2,y2}

另外,z1z2z1z2;由于 z2 对应 λ,所以也有 z1z2;所以,有 z1{x2,y2}

而前面已经分析得到 z1z1,所以有 {x1,y1}{x2,y2}

这样可以分析得到 {x1,y1,x2,y2}是一组正交归一实数基,张成一个不变子空间;类似地,{x3,y3,x4,y4}也是一组正交归一实数基,也可以张成同一个不变子空间。x3 不一定等于 x1x2

对于反对称实矩阵的这个不变子空间,取 {x1,y1,x2,y2} 这组基,即在这个子空间内完成正则化:

K[x1,y1,x2,y2]=[x1,y1,x2,y2][[0i2λ1i2λ10],[0i2λ2i2λ20]].

3. 数值验证

根据上面的理论推导,我们得到结论:只要能把反对称实矩阵 K 对角化,就能通过实正交变换把它正则化,变为实数正则矩阵。
如何对角化反对称实矩阵呢?GSL 有现成的函数,只是要稍微变一下。

3.1 反对称实矩阵 厄米复数矩阵

反对称实矩阵 K 只要乘上 i,就是一个厄米矩阵:

H=iKH=H.

3.2 GSL库函数:对角化厄米复数矩阵

通过翻阅 GSL 的文档,可以发现 gsl_eigen_hermv 函数,可以对角化复数厄米矩阵。所以我写了个函数做这个,如下。

#include<gsl/gsl_complex.h>
#include<gsl/gsl_complex_math.h>
#include<gsl/gsl_math.h>
#include<gsl/gsl_eigen.h>

#include<complex>

/*
 * GSL_eigen_hermv: given complex Hermitian matrix H[], get eigenvalues eig[] and eigenvectors eigvec[]
 * in respec to eig[i], its eigenvector is eigvec[i*n + x ], x = 0,...,n-1
 */
void GSL_eigen_hermv( int n, complex<double> * H, double * eig, complex<double> * eigvec ){

        gsl_eigen_hermv_workspace * w = gsl_eigen_hermv_alloc( n );

        gsl_matrix_complex * A = gsl_matrix_complex_alloc( n, n );
        for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                        gsl_matrix_complex_set( A, i, j, gsl_complex_rect( H[i*n+j].real(), H[i*n+j].imag() ) );
        gsl_matrix_complex * evec = gsl_matrix_complex_alloc( n, n );
        gsl_vector * eval = gsl_vector_alloc( n );

        cout<< " gsl_eigen_herm returns "<< gsl_eigen_hermv( A, eval, evec, w );
        cout<<", it seems 0 means OK. \n";

        gsl_eigen_hermv_sort( eval, evec, GSL_EIGEN_SORT_ABS_ASC );

        for(int i=0;i<n;i++){

                double eval_i = gsl_vector_get( eval, i ); eig[i] = eval_i;
                cout<<" eigenvalue = "<<eval_i<<endl;
                gsl_vector_complex_view evec_i = gsl_matrix_complex_column( evec, i );
                gsl_vector_complex_fprintf( stdout, &evec_i.vector, "%g");

                for(int j=0;j<n;j++){
                       gsl_complex x = gsl_matrix_complex_get( evec, j, i );
                        eigvec[i*n+j].real( GSL_REAL(x) ); eigvec[i*n+j].imag( GSL_IMAG(x) );
                }

        }

        gsl_eigen_hermv_free( w );
        gsl_matrix_complex_free( A );
        gsl_vector_free( eval );
        gsl_matrix_complex_free( evec );
}

然后写了个测试主函数,使用 GSL 文档上的实数对称阵测试例子,进行测试。

int main(){

        double data[] = { 0.0 , 1/2.0, 1/3.0, 1/4.0,
-1/2.0, 0.0, 1/4.0, 1/5.0,
-1/3.0, -1/4.0, 0.0, 1/6.0,
-1/4.0, -1/5.0, -1/6.0, 0.0 };

        complex<double> * H = new complex<double> [ 4*4 ];
        complex<double> x; x.real(0); x.imag(1);
        cout<<" x = "<< x <<endl;
        for(int i=0;i<16;i++) H[i] = data[i] * x ;

        cout<<" H : "<<endl;
        for(int i=0;i<4;i++){
                for(int j=0;j<4;j++)cout<<H[i*4+j]<<"   "; cout<<endl;
        }

        double * eig = new double [ 4 ];

        complex<double> * eigvec = new complex<double> [ 4*4 ];

        GSL_eigen_hermv( 4, H, eig, eigvec );

        cout<<" eig: "; for(int i=0;i<4;i++)cout<<eig[i]<<","; cout<<endl;
        cout<<" eigvec: "<<endl;
        for(int i=0;i<4;i++){
                for(int j=0;j<4;j++)cout<<eigvec[i*4+j]<<","; cout<<endl;
        }

        return 0;
}

命名为 test_complex_Hermitian.cpp,进行编译运行

g++ test_complex_Hermitian.cpp -lgsl -lgslcblas
./a.out

得到结果

 x = (0,1)
 H : 
(0,0)   (0,0.5)   (0,0.333333)   (0,0.25)   
(-0,-0.5)   (0,0)   (0,0.25)   (0,0.2)   
(-0,-0.333333)   (-0,-0.25)   (0,0)   (0,0.166667)   
(-0,-0.25)   (-0,-0.2)   (-0,-0.166667)   (0,0)   
 gsl_eigen_herm returns 0, it seems 0 means OK. 
 eigenvalue = 0.1075
-0.334421 0
0.375581 0.194331
-0.234738 -0.515822
-0.438178 0.442903
 eigenvalue = -0.1075
-0.334421 0
0.375581 -0.194331
-0.234738 0.515822
-0.438178 -0.442903
 eigenvalue = -0.736432
0.623027 0
0.2016 0.529653
-0.126 0.40367
-0.2352 0.237736
 eigenvalue = 0.736432
0.623027 0
0.2016 -0.529653
-0.126 -0.40367
-0.2352 -0.237736
 eig: 0.1075,-0.1075,-0.736432,0.736432,
 eigvec: 
(-0.334421,0),(0.375581,0.194331),(-0.234738,-0.515822),(-0.438178,0.442903),
(-0.334421,0),(0.375581,-0.194331),(-0.234738,0.515822),(-0.438178,-0.442903),
(0.623027,0),(0.2016,0.529653),(-0.126,0.40367),(-0.2352,0.237736),
(0.623027,0),(0.2016,-0.529653),(-0.126,-0.40367),(-0.2352,-0.237736),

与 GSL 文档上的参考结果一致。

3.3 自编函数:正则化反对称实矩阵

根据前面的理论推断,对于给定的反对称实矩阵 K,我们可以如下正则化:

  • 对角化 H=iK
  • H 的所有本征对——即(本征值,本征矢)这样的对——按本征值的绝对值降序重排
  • 取所有特征值小于0的特征矢量,录用其实部向量、虚部向量:

xk=zk+zk2,yk=zkzk2i.

  根据前面的理论分析,这些实部、虚部向量一定是正交归一的。

  • 补齐正交归一基。即补齐 w2k+1,wn。这可以自己写一个函数,给定 m 个正交归一基,补齐剩下 nm 个正交归一基。

  • 最后,得到新的实数正交归一基以后,用这些基做正交变换,得到 K 的正则形式。

写出来的代码如下:


void printmtx( int n, double * U ){
        for(int i=0;i<n;i++){
                for(int j=0;j<n;j++) cout<<U[i*n+j]<<"  "; cout<<endl;
        }
}

void RandomNormal(int n, double * v){
        double y=0;
        for(int i=0;i<n;i++){
                v[i] = ((double)rand())/RAND_MAX ;
                y += v[i] * v[i];
        }
        for(int i=0;i<n;i++)
                v[i] /= sqrt(y);
};

void PickOut( int n, double * x, double * y ){
        double innerproduct = 0; // inner product
        for(int i=0;i<n;i++) innerproduct += x[i] * y[i];
        for(int i=0;i<n;i++) x[i] -= innerproduct * y[i];
}

void Normalize( int n, double * x ){
        double y = 0; for(int i=0;i<n;i++) y += x[i] * x[i]; y = sqrt(y);
        for(int i=0;i<n;i++) x[i] /= y;
}

// Given U[0], U[1], ..., U[m-1] are ortho-normal, find the other n-m bases, so that U[0], ..., U[n-1] are complete and ortho-normal
void complete_orthonormal_basis( int n, int m, double * U ){
        int count = m; double * y = new double [n];
        while( count < n ){
                for(int i=0;i<n;i++) y[i] = 0; double normy = 0;
                while (normy < 1E-4){
                        RandomNormal( n, y );
                        for(int i=0;i<count;i++) PickOut( n, y, U+i*n);
                        normy = 0; for(int i=0;i<n;i++) normy += y[i] * y[i];
                }
                Normalize(n, y); for(int i=0;i<n;i++) U[count * n + i] = y[i];
                count ++;
        }
}

/*
 * ARMC: transform an Anti-Real-Matrix into Canonical form
 * 
 * M = U^\top Mcanonical U
 */
void ARMC( int n, double * M, double * U, double * Mcanonical ){

        complex<double> * H = new complex<double> [ n*n ];
        complex<double> x; x.real(0); x.imag(1);
        for(int i=0;i<n*n;i++) H[i] = M[i] * x ;

        double * eig = new double [ n ];

        complex<double> * eigvec = new complex<double> [ n*n ];

        GSL_eigen_hermv( n, H, eig, eigvec );

        double * xtemp = new double [n]; double * ytemp = new double [n];

        int count = 0;
        for(int i=0;i<n;i++){
                if( eig[i] < 0 && fabs(eig[i]) > 1E-10 * fabs(eig[0]) ){ // 1E-10 * fabs(eig[0]) is used as zero (small enough)
                        for(int j=0;j<n;j++){
                                xtemp[j] = eigvec[i*n+j].real() * sqrt(2);
                                ytemp[j] = eigvec[i*n+j].imag() * sqrt(2);
                                U[count*n+j] = xtemp[j]; U[(count+1)*n+j] = ytemp[j];
                        }
                        count+=2;
                }
        }

        if( count < n ) complete_orthonormal_basis( n, count, U );

        // UM
        double * UM = new double [ n*n ];
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
                double x = 0;
                for(int k=0;k<n;k++) x += U[i*n+k] * M[k*n+j];
                UM[i*n+j] = x;
        }
        // Mcanonical = (UM) * U^\top 
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
                double x = 0;
                for(int k=0;k<n;k++) x += UM[i*n+k] * U[j*n+k];
                Mcanonical[i*n+j] = x;
        }
        delete [] xtemp; delete [] ytemp;
        delete [] UM; delete [] eigvec; delete [] eig; delete [] H;
}

测试:

加了几行测试输出代码,正则化 12*12 反对称阵:

0 0.0582782 0.0809623 0 0.242372 0.148711 0.0747338 0.1232 0.00109344 0.0352467 0.142309 0.0586949
-0.0582782 0 0 0.0809623 0.130991 0.0181291 0.141333 0.00607454 0.146359 -0.0488136 0.16139 0.00949629
-0.0809623 -0 0 -0.0582782 0.0488136 0.146359 -0.00607454 0.141333 -0.0181291 0.130991 -0.00949629 0.16139
-0 -0.0809623 0.0582782 0 0.0352467 -0.00109344 0.1232 -0.0747338 0.148711 -0.242372 0.0586949 -0.142309
-0.242372 -0.130991 -0.0488136 -0.0352467 0 0.17432 0.165275 0.123782 0.257831 0 0.0425534 0.19093
-0.148711 -0.0181291 -0.146359 0.00109344 -0.17432 0 -0.0727708 0.068801 0 0.257831 -0.098141 0.235799
-0.0747338 -0.141333 0.00607454 -0.1232 -0.165275 0.0727708 0 0 0.068801 -0.123782 -0.151594 -0.00598481
-0.1232 -0.00607454 -0.141333 0.0747338 -0.123782 -0.068801 -0 0 0.0727708 0.165275 -0.00598481 0.151594
-0.00109344 -0.146359 0.0181291 -0.148711 -0.257831 -0 -0.068801 -0.0727708 0 -0.17432 -0.235799 -0.098141
-0.0352467 0.0488136 -0.130991 0.242372 -0 -0.257831 0.123782 -0.165275 0.17432 0 0.19093 -0.0425534
-0.142309 -0.16139 0.00949629 -0.0586949 -0.0425534 0.098141 0.151594 0.00598481 0.235799 -0.19093 0 0
-0.0586949 -0.00949629 -0.16139 0.142309 -0.19093 -0.235799 0.00598481 -0.151594 0.098141 0.0425534 -0 0

得到

  U: 
-0.0303352  -0.323071  0.284728  -0.475271  -0.0864182  0.457386  0.0200367  0.146637  0.0431553  -0.472297  -0.32487  -0.136787  
0  0.0853881  -0.0450322  -0.214972  -0.176651  0.184243  -0.378003  0.260995  -0.432414  0.502859  -0.339272  0.336687  
-0.521628  -0.240866  -0.25917  0.0276394  -0.223088  0.138885  0.241166  0.137526  0.492668  0.151539  0.0141235  0.435819  
0  -0.158371  -0.210943  0.0125017  -0.652812  -0.411771  -0.177369  -0.352668  0.0206277  -0.125337  -0.363139  -0.175236  
0.511228  -0.15273  0.308259  -0.156083  -0.122579  -0.0502583  0.0552624  0.0744275  0.528361  0.515782  -0.0123233  -0.156335  
0  0.3574  0.375394  -0.348846  -0.290007  -0.182507  0.524695  -0.205627  -0.191796  -0.0316432  0.116331  0.351185  
0.382172  0.468555  -0.263858  0.20879  -0.181767  0.0407166  0.1573  0.501511  0.187118  -0.31478  -0.256712  0.101154  
0  0.128064  0.285378  0.466648  -0.483729  0.560618  -0.151918  -0.163847  -0.0286619  0.00655211  0.286129  -0.0587596  
-0.527576  0.533958  0.158684  -0.0908641  0.0293914  -0.00837181  -0.0171707  0.0710162  0.194925  0.195811  -0.241528  -0.512025  
0  -0.281206  -0.169889  0.181609  -0.120986  0.103253  0.630479  0.19511  -0.409262  0.255714  -0.0895545  -0.396615  
-0.203072  -0.222936  0.490404  0.236063  -0.141072  -0.453226  -0.142712  0.571527  -0.0960864  -0.12135  0.125592  0.027982  
0  0.0658956  -0.351698  -0.471816  -0.289534  -0.00879994  -0.150812  0.266751  -0.0387136  -0.02785  0.635374  -0.256072  
 U * U^+ : 
1   0   0   0   0   0   0   0   0   0   0   0   
0   1   0   0   0   0   0   0   0   0   0   0   
0   0   1   0   0   0   0   0   0   0   0   0   
0   0   0   1   0   0   0   0   0   0   0   0   
0   0   0   0   1   0   0   0   0   0   0   0   
0   0   0   0   0   1   0   0   0   0   0   0   
0   0   0   0   0   0   1   0   0   0   0   0   
0   0   0   0   0   0   0   1   0   0   0   0   
0   0   0   0   0   0   0   0   1   0   0   0   
0   0   0   0   0   0   0   0   0   1   0   0   
0   0   0   0   0   0   0   0   0   0   1   0   
0   0   0   0   0   0   0   0   0   0   0   1   
 Mcanonical: 
0  0.707073  0  0  0  0  0  0  0  0  0  0  
-0.707073  0  0  0  0  0  0  0  0  0  0  0  
0  0  0  0.707073  0  0  0  0  0  0  0  0  
0  0  -0.707073  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0.00687151  0  0  0  0  0  0  
0  0  0  0  -0.00687151  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0.00687151  0  0  0  0  
0  0  0  0  0  0  -0.00687151  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0.000784735  0  0  
0  0  0  0  0  0  0  0  -0.000784735  0  0  0  
0  0  0  0  0  0  0  0  0  0  0  0.000784735  
0  0  0  0  0  0  0  0  0  0  -0.000784735  0  

另外测试本征值有 0 的反对称实矩阵

0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 -0 0 -0.0582782 0.0488136 0.146359 -0.00607454 0.141333 -0.0181291 0.130991 -0.00949629 0.16139
-0 -0.0 0.0582782 0 0.0352467 -0.00109344 0.1232 -0.0747338 0.148711 -0.242372 0.0586949 -0.142309
-0.0 -0.0 -0.0488136 -0.0352467 0 0.17432 0.165275 0.123782 0.257831 0 0.0425534 0.19093
-0.0 -0.0 -0.146359 0.00109344 -0.17432 0 -0.0727708 0.068801 0 0.257831 -0.098141 0.235799
-0.0 -0.0 0.00607454 -0.1232 -0.165275 0.0727708 0 0 0.068801 -0.123782 -0.151594 -0.00598481
-0.0 -0.0 -0.141333 0.0747338 -0.123782 -0.068801 -0 0 0.0727708 0.165275 -0.00598481 0.151594
-0.0 -0.0 0.0181291 -0.148711 -0.257831 -0 -0.068801 -0.0727708 0 -0.17432 -0.235799 -0.098141
-0.0  0.0 -0.130991 0.242372 -0 -0.257831 0.123782 -0.165275 0.17432 0 0.19093 -0.0425534
-0.0 -0.0 0.00949629 -0.0586949 -0.0425534 0.098141 0.151594 0.00598481 0.235799 -0.19093 0 0
-0.0 -0.0 -0.16139 0.142309 -0.19093 -0.235799 0.00598481 -0.151594 0.098141 0.0425534 -0 0

得到

 U: 
0  0  -0.395163  0.44073  -0.117531  -0.441911  -0.0208166  -0.124056  0.0612319  0.544158  0.214009  0.281114  
0  0  0  0.250065  0.0198452  -0.378119  0.244911  -0.395889  0.300962  -0.484856  0.237043  -0.442196  
0  0  -0.245674  -0.172487  -0.641937  0.0870772  0.146768  -0.022326  0.518727  -0.15687  -0.33935  0.243605  
0  0  0  -0.0782339  -0.39862  -0.335716  -0.428845  -0.264016  -0.472958  -0.00912163  -0.394059  -0.299347  
0  0  -0.552342  0.318859  0.166778  -0.0159522  -0.0533873  0.348302  -0.28037  -0.548004  -0.17742  0.174987  
0  0  0  0.503196  -0.131035  0.432106  -0.493068  0.169037  0.311836  0.101262  0.0183059  -0.404213  
0  0  -0.422101  -0.332344  0.452347  0.132859  -0.41161  -0.499227  0.248035  0.00468517  -0.0690757  0.0643759  
0  0  0  -0.108948  0.342077  -0.437731  0.0463857  0.432066  0.346534  0.211698  -0.490304  -0.292186  
0  0  -0.547941  -0.30591  -0.144001  0.193388  0.320104  0.132951  -0.185184  0.226694  0.229868  -0.537939  
0  0  0  0.369557  0.165698  0.328366  0.462741  -0.392692  -0.145453  0.193199  -0.545663  -0.0598417  
0  1  0  0  0  0  0  0  0  0  0  0  
1  0  0  0  0  0  0  0  0  0  0  0  
 U * U^+ : 
1   0   0   0   0   0   0   0   0   0   0   0   
0   1   0   0   0   0   0   0   0   0   0   0   
0   0   1   0   0   0   0   0   0   0   0   0   
0   0   0   1   0   0   0   0   0   0   0   0   
0   0   0   0   1   0   0   0   0   0   0   0   
0   0   0   0   0   1   0   0   0   0   0   0   
0   0   0   0   0   0   1   0   0   0   0   0   
0   0   0   0   0   0   0   1   0   0   0   0   
0   0   0   0   0   0   0   0   1   0   0   0   
0   0   0   0   0   0   0   0   0   1   0   0   
0   0   0   0   0   0   0   0   0   0   1   0   
0   0   0   0   0   0   0   0   0   0   0   1   
 Mcanonical: 
0  0.680657  0  0  0  0  0  0  0  0  0  0  
-0.680657  0  0  0  0  0  0  0  0  0  0  0  
0  0  0  0.553307  0  0  0  0  0  0  0  0  
0  0  -0.553307  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0.00614115  0  0  0  0  0  0  
0  0  0  0  -0.00614115  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0.00304889  0  0  0  0  
0  0  0  0  0  0  -0.00304889  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0.000424323  0  0  
0  0  0  0  0  0  0  0  -0.000424323  0  0  0  
0  0  0  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0  0  0 

通过了测试。

4. 应用

4.1 原子核配对结构系数正则化

核子配对定义为,

P^=12αβpαβc^αc^β,

其中 p 是对结构系数,是一个反对称矩阵。如果对单粒子基做一个幺正变换,

c^α=αc^αUαα,

其中 UU=UU=1, 则逆变换为

c^α=αc^αUαα.

那么集体对产生算符 P^ 可以写作

P^=12αβpαβαβUααUββc^αc^β=12αβ(αβUααpαβUββ)c^αc^β=12αβ(UpU)αβc^αc^β.

换言之,在新的单粒子基下,新的对结构系数是 p=UpU, 或 p=UpU

根据前面的分析,对于给定实数矩阵 p,总可以找到实数正交阵 U,使得 p=UpU 是正则形式。
U[i][] 表示第 i 个新基矢在原基矢下的坐标。

4.2 从 Hartree-Fock 波函数得到 M-scheme 配对

如果体系有 2n 个同类核子,定义

P^=P^12++P^2n1,2n,

其中

P^12=c^1c^2,   ,   P^2n1,2n=c^(2n1)c^(2n),

c^i 代表 Hartree-Fock 的单粒子基,在球形基下的展开为

c^α=αc^αUαα.

那么,P^ 的凝聚

(P^)n=(P^12++P^2n1,2n)n=n!P^12P^2n1,2n|0,

是一个 Slater Determinant,即 Hartree-Fock 波函数。

所以,如果定义 canonical form 的集体对

p=[(0110), , (0110), 0, , 0].

然后,根据 4.1 中的论述,这个集体对转回球形基,会得到 p=UpU

P^=12αβpαβc^αc^β.

posted on   luyi07  阅读(329)  评论(1编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
历史上的今天:
2020-05-13 输入输出重定向

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示