Fortran 95 ve LAPACK ile gerçek bir asimetrik matrisin matrisi üstel


10

Geçenlerde aynı çizgide eğri-Hermit matrisleri için bir soru sordum . Bu sorunun başarısından esinlenerek, kafamı birkaç saat boyunca bir duvara vurduktan sonra, gerçek asimetrik matrislerin üstel matrisine bakıyorum. Özdeğerleri ve özvektörleri bulma yolu oldukça kıvrımlı görünüyor ve korkuyorum ki kayboldum.

Arka plan: Bir süre önce teorik fizik SE hakkında bu soruyu sordum . Sonuç, ana denklemleri gerçek asimetrik matrisler olarak ifade etmeme izin veriyor. Zamandan bağımsız durumda, ana denklem bu matrisin katlanarak çözülür. Zamana bağlı durumda entegrasyon gerekir. Şu an sadece zaman bağımsızlığıyla ilgileniyorum.

Çeşitli değişmezler seyir üzerine ben çağıran gerektiğini düşünüyorum ( ? Gehrd , ? Orghr , ? Hseqr ...) ondan matrisi atmak kolay olurdu eğer belirsizdir real*8için complex*16bu rutinleri karmaşık çift sürümleri ile ve devam edin veya sopa ile real*8dizilerimin sayısını iki katına çıkarmak ve daha sonra bunlardan karmaşık bir matris yapmak vurmak.

Peki, hangi rutinleri çağırmalıyım (ve hangi sırayla) ve gerçek çift versiyonları mı yoksa karmaşık çift versiyonları mı kullanmalıyım? Aşağıda bunu gerçek çift sürümlerle yapmaya yönelik bir girişim bulunmaktadır. Özdeğerlerini ve özvektörlerini bulmakta sıkışıp kaldım L*t.

function time_indep_master(s,L,t)
  ! s is the length of a side of L, which is square.
  ! L is a real*8, asymmetric square matrix.
  ! t is a real*8 value corresponding to time.
  ! This function (will) compute expm(L*t).

  integer, intent(in)    :: s
  real*8,  intent(in)    :: L(s,s), t
  real*8                 :: tau(s-1), work(s), wr(s), wi(s), vl
  real*8, dimension(s,s) :: time_indep_master, A, H, vr
  integer                :: info, m, ifaill(2*s), ifailr(2*s)
  logical                :: sel(s)

  A = L*t
  sel = .true.

  call dgehrd(s,1,s,A,s,tau,work,s,info)
  H = A
  call dorghr(s,1,s,A,s,tau,work,s,info)
  call dhseqr('e','v',s,1,s,H,s,wr,wi,A,s,work,s,info)
  call dhsein('r','q','n',sel,H,s,wr,wi,vl,1,vr,s,2*s,m,work,ifaill,ifailr,info)

  ! Confused now...

end function

Yanıtlar:


8

İlk olarak matrisin gerçekten tamamen keyfi olup olmadığı konusunda çok sıkı düşünürdüm: Hermityanı yapacak bir dönüşüm var mı? Fizik, matrisin köşegenleştirilebilmesini garanti ediyor mu (makul şartlandırılmış bir özvektör matrisi ile)?

Gerçekten sömürülecek bir simetri olmadığı ortaya çıkarsa , standart referans olan Matrix Üstelini Hesaplamak için On dokuz Şüpheli Yolları okuyarak başlamalısınız (ve MATLAB'ın yazarı ve G & vL'nin ortak yazarı tarafından yazılmıştır) .


1
Yapabileceğim en iyi şey, asimetrik bloklarla blok çapraz matris haline getirmektir. Bu kendi içinde çok ilginç. Bu blokların çoğu ve bunları sadece analitik olarak çözebilirim. simetri olmadan kalan bloğu var. 4 × 42x24×4
qubyte

1
Bu cevabı beğendim; simetrik olmayan durum, simetrik olmayan matrislere neden olan probleminizin bir formülasyonu olup olmadığını düşünmeye değer yeterli tuzaklara sahiptir.
JM

@ MarkS.Everitt: Neredeyse orada görünüyorsun ... matrisler ne kadar büyük? ~ 36 x 36 tekrar mı?
Jack Poulson

Bu durumda , ancak kadar çıkma olasılığı . 36 × 3616x1636x36
qubyte

2
@ MarkS.Everitt: Sorununuz şimdi etkili bir şekilde 4x4 matrislerin nasıl üstlenileceği. Bu, asimptotik analizin ilgisiz olması için yeterince küçüktür, bu nedenle cevap tamamen değerlere bağlı olacaktır. Bağlantılı fizik postanızı doğrusal cebire (süperoperatör nedir?!?) Çevirmedikçe artık gerçekten söyleyemem.
Jack Poulson

7

Jack'in söylediklerini geliştirmek için, yazılımda kullanıldığı düşünülen standart yaklaşım (önceki sorunuzda bahsedilen EXPOKIT gibi) ölçeklendirme ve kareleme, ardından Padé yaklaşımı (Yöntem 2 ve 3) veya Krylov altuzay yöntemleri (Yöntem 20). Özellikle, üstel entegratörlere bakıyorsanız, Krylov altuzay yöntemlerini dikkate almak ve üstel entegratörlerle ilgili makalelere bakmak isteyeceksiniz (Moler ve van Kredi belgesinde Yöntem 20 ile birlikte bazı referanslardan bahsedilmektedir).

Eğer özvektörleri kullanmak konusunda eğildiyseniz, özvektörlerin üçgen sistemlerini kullanmayı düşünün (Yöntem 15); matrisiniz köşegenleştirilemeyebileceğinden, bu yaklaşım en iyi olmayabilir, ancak özvektörleri ve özdeğerleri doğrudan hesaplamaya çalışmaktan daha iyidir (yani, Yöntem 14).

Hessenberg formuna indirgemek iyi bir fikir değildir (Yöntem 13).

Fortran kompleks aritmetik hızlı, ama taşma / Yetersizlik olabilir, çünkü daha iyi gerçek veya karmaşık aritmetik ile servis olup olmayacağı bana belli değil (bkz "daha iyi Fortran derleyicileri gerçekten Ne kadar?" ).

Yöntem 5-7'yi (ODE çözücü tabanlı yöntemler verimsiz), Yöntem 8-13 (pahalı), Yöntem 14'ü (büyük matrislerin özvektörlerini hesaplamak özel bir yapı olmadan zordur ve koşulsuz durumlarda sayısal hataya eğilimlidir) güvenle göz ardı edebilirsiniz. ve Yöntem 16 (bir matrisin Ürdün ayrışmasının hesaplanması sayısal olarak kararsızdır). Metotlar 17-19, uygulanması daha zordur; özellikle, Yöntem 17 ve 18 daha fazla okuma gerektirir. Yöntem 1, Padé yaklaşımları iyi çalışmazsa ölçeklendirme ve kareleme için geri alma seçeneğidir.

Bj

Bj=γjben+Ej,

γjjEj


1
Ö(n2)Ö(n3)

Kuşkusuz ne yaptıklarını biliyorlar; LAPACK'in uygulanmasından endişe etmiyorum. Fortran derleyici davranışı hakkında daha fazla şaşırdım.
Geoff Oxberry

2
Evet, derleyici iyi yazılmış LAPACK'ten daha çok sorun olabilir. Programınızın yalnızca derleyici tarafından kullanılan mutlak değer ve bölme uygulamaları botch edildiğinden dolayı başarısız olduğunu bulmak rahatsız edici olabilir ...
JM

-1

Rasgele bir matrisin üssünü hesaplayan basit bir Fortran altyordam var. Matlab komutuna karşı kontrol ettim ve sorun yok. Ölçekleme ve kare alma üzerine kuruludur. Birkaç yıl önce yazdım.

Gams.nist.gov'den indirdiğim gibi başka bir altyordam yapmak istiyorum. Ama henüz şans yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.