#fortran90 #numerical-methods #lapack #julia
#фортран90 #численные методы #lapack #джулия
Вопрос:
У меня есть программа, написанная на Fortran и в Julia, в одном из случаев у меня есть симметричные матрицы, и я получаю результаты, более или менее похожие с обеими программами. Когда я переключаюсь на случай, когда у меня есть эрмитовы матрицы, программа на Julia и программа на Fortran дают мне разные данные. Я бы предположил, что, возможно, разница связана с процедурой диагонализации, которую я использую в Fortran:
ZHEEVD(..)
в то время как в Julia я просто использую:
eig(matrix)
Первое, что я замечаю, это то, что ZHEEVD
исправляет первую строку матриц собственных векторов на действительные числа (без мнимой части), в то время как eig
исправляет последнюю строку на действительные числа.
Есть идеи, как преодолеть эти крошечные различия? Есть еще информация, которая может быть полезна при работе со встроенными функциями линейной алгебры julia?
Ответ №1:
Копаясь в методах Julia ( @less
макрос очень удобен для этого), вы обнаружите, что в конечном итоге он вызывает LAPACK.syevr!
метод, который в Complex128
случае является оболочкой для ZHEEVR
метода LAPACK (прокрутите немного вниз, чтобы увидеть фактическое определение).
Если вы предпочитаете продолжать использовать ZHEEVD
, вы можете получить доступ к нему через ccall
интерфейс: смотрите раздел руководства по вызову кода C и Fortran. Приведенные выше обертки LAPACK должны содержать множество примеров (LAPACK поставляется как часть OpenBLAS, которая включена в Julia, поэтому вам не нужно устанавливать что-либо еще).