Fortran lapack求数组的特征值,特征向量 | 您所在的位置:网站首页 › milk改为复数形式 › Fortran lapack求数组的特征值,特征向量 |
call zgeev('V', 'V', n, arr, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
这个函数是求矩阵的特征值,且结果是双精度复数的情况,具体可以查MKL的官方文档。 如果是单精度复数就要用cgeev,其中的参数也是将双精度改为单精度即可。 其中的参数, “V”,“V”:分别代表是否求矩阵的左特征向量还是右特征向量。选择“N”代表不求,其中有特征向量和Matlab的eig函数是一致的。 n:整数,数组arr的阶 arr:待求矩阵,如果结果是复数,就要把双精度的arr转换成复数形式。如: arr_cmlx = cmplx(arr,0.0d0) lda:整数,至少大于n w:双精度复数,特征值,大小为(n) vl:双精度复数,左特征向量,大小为(n,n) ldvl:整数,至少大于n vr:双精度复数,右特征向量,大小为(n,n) ldvr:整数,至少大于n work:整数,大小为2n lwork: 整数,至少大于2n rwork: 整数,至少大于2n。一般来说写2n没毛病,不过lwork,rwork具体的设置放上文档截图 info:整数,如果为0说明求解成功,如果为负数,比如-3代表第三个参数你设置的不对,-4代表第四个以此类推。如果是正数,如1,代表第一个特征值为0,解是奇异的,2代表第二个,以此类推。下面放一个例子,可以直接运行试试。 program program use lapack95 implicit none integer, parameter :: n = 3 ! 矩阵大小 integer :: i, j, info, lda, ldvl, ldvr, lwork, rwork, work(2*n) complex*16 :: arr(n,n), w(n) complex*16 :: vl(n,n), vr(n,n) ! 初始化复数矩阵 arr = reshape([(1.0, 2.0), (3.0, 4.0), (5.0, 6.0), & (7.0, 8.0), (9.0, 10.0), (11.0, 12.0), & (13.0, 14.0), (15.0, 16.0), (17.0, 18.0)], [n, n]) lda = n ldvl = n ldvr = n lwork = 2*n rwork = 2*n ! 调用LAPACK库中的zgeev函数求解复数矩阵的特征值 call zgeev('V', 'V', n, arr, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info) ! 打印特征值 do i = 1, n print *, "Eigenvalue ", i, ": ", w(i) end do ! 打印特征向量 do i = 1, n do j = 1, n write(*, '(F10.7,A,F10.7,A,2X)', advance='no') real(vr(i,j)), "+", aimag(vr(i,j)), "i" end do write(*,*) ! 换行 end do end program输出如下: Eigenvalue 1 : (29.4359959090198,32.2251550243328) Eigenvalue 2 : (-2.43599590901985,-2.22515502433279) Eigenvalue 3 : (-4.037373503902555E-016,-5.245388153875226E-016) 0.4594184+ 0.0083891i 0.8864625+ 0.0000000i -0.4082483+ 0.0000000i 0.5701955+ 0.0041945i 0.2481004+-0.0080782i 0.8164966+ 0.0000000i 0.6809727+ 0.0000000i -0.3902616+-0.0161565i -0.4082483+ 0.0000000i 下面是相同matlab的结果: 29.435995909019830 +32.225155024332800i -2.435995909019847 - 2.225155024332794i -0.000000000000000 - 0.000000000000001i 0.459418381369183 + 0.008389093159843i 0.886462489565377 + 0.000000000000000i -0.408248290463862 + 0.000000000000000i 0.570195542494289 + 0.004194546579922i 0.248100428415959 - 0.008078242749363i 0.816496580927726 + 0.000000000000000i 0.680972703619395 + 0.000000000000000i -0.390261632733458 - 0.016156485498726i -0.408248290463863 + 0.000000000000000i 可以看到结果可以算是一致的。 |
CopyRight 2018-2019 实验室设备网 版权所有 |