Експоненція матриці реальної асиметричної матриці з Fortran 95 і LAPACK


10

Нещодавно я задав запитання по тим же принципам для косо-ермітських матриць. Натхнений успіхом цього питання, і після удару головою об стіну пару годин, я дивлюся на матричний експонент реальних асиметричних матриць. Шлях до пошуку власних значень та власних векторів здається досить складним, і, боюся, я заблукав.

Передумови: Деякий час тому я задав це питання теоретичній фізиці СВ. Результат дозволяє мені сформулювати майстерні рівняння як реальні асиметричні матриці. У незалежному від часу випадку головне рівняння вирішується шляхом експоненції цієї матриці. У залежності від часу це потребує інтеграції. Мене зараз хвилює лише незалежність від часу.

Після дивлячись на різних підпрограма я думаю , що я повинен називати ( ? Gehrd , ? Orghr , ? Hseqr ...) не ясно , якщо було б простіше кинути матрицю з real*8до complex*16і продовжити складні подвійні версії цих процедур, або дотримуйтесь real*8і прийміть удвічі подвоєну кількість моїх масивів і складаючи складну матрицю з них пізніше.

Отже, які підпрограми я повинен дзвонити (і в якому порядку) і чи слід використовувати реальні подвійні версії або складні подвійні версії? Нижче наводиться спроба зробити це з реальними подвійними версіями. Я застряг у пошуку власних значень та власних векторів 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

Відповіді:


8

Я б спершу подумав дуже важко про те, чи дійсно матриця є абсолютно довільною: чи є якась трансформація, яка зробила б її ермітією? Чи гарантує фізика, що матриця повинна бути діагоналізованою (з розумно обумовленою матрицею власного вектора)?

Якщо виявиться, що насправді не існує жодної симетрії для експлуатації, то слід почати з читання дев'ятнадцяти сумнівних способів обчислення матричної експоненціалі , що є стандартним посиланням (і написане автором MATLAB та співавтором G & vL) .


1
Найкраще, що я можу зробити, - це перетворити його на блок діагональної матриці з асиметричними блоками. Це саме по собі дуже цікаво. Більшість цих блоків - це , і я можу їх просто вирішити аналітично. Залишився блок не може використовуватись. 4 × 42×24×4
квіте

1
Мені подобається ця відповідь; несиметричний випадок має достатню кількість підводних каменів, які варто розглянути, чи може бути формулювання вашої проблеми, яке призводить до симетричних матриць замість несиметричних.
JM

@ MarkS.Everitt: Здається, ви майже там ... наскільки великі матриці? ~ 36 х 36 знову?
Джек Поульсон

У цьому випадку , але існує ймовірність того, що вона буде до . 36 × 3616×1636×36
квіте

2
@ MarkS.Everitt: Отже, ваша проблема зараз ефективно полягає лише в тому, як виставити матриці 4x4. Цього недостатньо, щоб асимптотичний аналіз не мав значення, тому відповідь повністю залежатиме від значень. Я не можу сказати більше, якщо ви не перекладете пов'язаний пост з фізики в лінійну алгебру (що таке супер-оператор?!?).
Джек Поульсон

7

На основі того, що сказав Джек, стандартний підхід, який, здається, використовується в програмному забезпеченні (наприклад, EXPOKIT, згаданий у вашому попередньому запитанні), полягає в масштабуванні та вирівнюванні з подальшим наближенням Паде (Методи 2 і 3) або методами підпростори Крилова (Метод 20). Зокрема, якщо ви дивитесь на експоненціальні інтегратори, ви захочете розглянути методи підпростору Крилова та подивитися статті про експоненціальні інтегратори (деякі посилання згадуються разом із методом 20 у статті Moler & van Loan).

Якщо ви пекла, нахилені до використання власних векторів, подумайте про використання трикутних систем власних векторів (метод 15); оскільки ваша матриця може бути недіагоналізованою, такий підхід може бути не найкращим, але це краще, ніж намагатися обчислити власні вектори та власні значення безпосередньо (тобто метод 14).

Зведення до форми Гессенберга не є хорошою ідеєю (метод 13).

Мені не видно, чи вам краще подавати справжню чи складну арифметику, оскільки складна арифметика Fortran є швидкою, але може переповнювати / переповнювати (див. "Наскільки краще насправді компілятори Fortran?" ).

Ви можете сміливо ігнорувати Методи 5-7 (методи, що базуються на вирішенні ODE, неефективні), методи 8-13 (дорогі), метод 14 (обчислення власних векторів великих матриць важко без спеціальної структури та схильних до числових помилок у невмовно обумовлених випадках) і Спосіб 16 (обчислення Йорданового розкладання матриці чисельно нестабільне). Методи 17-19 складніші у здійсненні; зокрема, Методи 17 та 18 потребують більшого читання. Спосіб 1 - це резервний варіант для масштабування та зменшення розмірів, якщо наближення Паде не працює добре.

Bj

Bj=γjI+Ej,

де - середнє значення власних значень діагональної матриці го блоку. Таке розкладання зробить майже нільпотентним, що підвищить точність експоненціальних обчислень матриці. Цей трюк обговорюється на сторінці 26 версії папери Moler & van Loan, до якої звернувся Джек. j E jγjjEj


1
Прихильно, але люди, які впровадили ЛАПАК, не наївні щодо складної арифметики, особливо зважаючи на весь час, який Кахан вкладав у її аналіз. Однак він все-таки повинен обчислювати реальну арифметику, якщо це зберігає флопи; вартість перетворення пізніше просто проти всієї щільної лінійної алгебри. O ( n 3 )O(n2)O(n3)
Джек Поульсон

Без сумніву, вони знають, що роблять; Я не переживаю за реалізацію LAPACK. Я більше здивований поведінці компілятора Fortran.
Джефф Оксберрі

2
Так, компілятор може бути більшою проблемою, ніж добре написаний LAPACK. Виявити, що ваша програма вийшла з ладу, може бути неприємно лише тому, що реалізація абсолютного значення та поділу, використовуваного компілятором, потрапила в групу ...
JM

-1

У мене є проста підпрограма Fortran, яка обчислює показник довільної матриці. Я перевірив це проти команди Matlab, і це добре. Він заснований на масштабуванні та квадраті. Я написав це кілька років тому.

Мені б хотілося уточнити іншу підпрограму, як-от ті, які я завантажую з gams.nist.gov. Але поки не пощастило.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.