計算矩陣指數,matlab直接可以用expm,但是fortran筆者瞭解到MKL好像還沒有子程序直接可以使用
閒暇之餘,給出一個求矩陣指數的fortran代碼僅供參考
代碼如下,如有必要,讀者爲了以後的方便也可將下面代碼直接封裝
program test_expm
use lapack95
implicit none
integer, parameter :: n = 3
integer :: i, info, ipiv(n)
real :: a(n,n), wr(n), wi(n), vr(n,n), vl(n,n)
real :: temp(n,n)
a = reshape([1, 1, 0, 0, 0, 2, 0, 0, -1],shape(a))
a = transpose(a)
call geev(a, wr, wi, vl, vr, info)
write(*,*) '特徵值爲:'
write(*,'(*(f10.4))') wr
write(*,*) '特徵向量爲:'
do i = 1, n
write(*,'(*(f10.4))') vr(i,:)
end do
if (info == 0) then
write(*,*) '特徵值與特徵向量計算成功!'
else
write(*,*) '特徵值與特徵向量計算失敗!'
end if
write(*,*)
write(*,*) '開始計算矩陣指數......'
temp = 0.
forall( i = 1:n ) temp(i,i) = exp(wr(i))
vr = vl
call getrf(vr, ipiv)
call getri(vr, ipiv) !// 求特徵向量的逆矩陣
!// 計算矩陣指數
a = matmul(matmul(vl,temp),vr)
write(*,*) '矩陣A的矩陣指數爲:'
do i = 1, n
write(*,'(*(f10.4))') a(:,i)
end do
end program test_expm
執行結果如下
特徵值爲:
1.0000 0.0000 -1.0000
特徵向量爲:
1.0000 -0.7071 0.4082
0.0000 0.7071 -0.8165
0.0000 0.0000 0.4082
特徵值與特徵向量計算成功!
開始計算矩陣指數......
矩陣A的矩陣指數爲:
2.7183 1.7183 1.0862
0.0000 1.0000 1.2642
0.0000 0.0000 0.3679
如有必要,讀者可與matlab結果檢驗一下。
要注意的地方:如果所求矩陣階數較大,比如幾千階,程序中的matmul函數建議更換爲MKl中的gemm計算
具體可參考https://blog.csdn.net/chd_lkl/article/details/94437455
還有就是階數過大,在求逆矩陣那一塊如有必要,也可進行適當修改