fortran使用MKL函數庫計算矩陣指數

計算矩陣指數,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

還有就是階數過大,在求逆矩陣那一塊如有必要,也可進行適當修改

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章