포트란 95와 LAPACK을 갖는 스큐-헤르 미트 행렬의 행렬 지수


11

몇 가지 양자 역학 시뮬레이션을 위해 포트란 95에 집중하고 있습니다. 솔직히 옥타브에 의해 망쳐 졌으므로 당연히 행렬 지수를 취했습니다. 크기가 인 (작고 ) skew- Hermitian 행렬이 주어지면 LAPACK을 사용하여이 문제를 해결하는 가장 효율적인 방법은 무엇입니까? LAPACK95 래퍼를 사용하지 않고 LAPACK을 직접 호출합니다.n36n×n


2
행렬 지수 자체가 필요합니까, 아니면 행렬 지수에 벡터를 곱해야합니까?
Paul

@Paul : 죄송합니다. 전에 이걸 보지 못했습니다. 아니요, 전체 매트릭스가 필요합니다.
qubyte

누군가이 질문을 왜 내려 놓을까요? 공감할 경우 의견에 이유를 남겨주세요! 아마도 이런 식으로 질문을 개선 할 수있을 것입니다.
qubyte

우리는 DGPADM에 의존 하지만 Jack Poulson은 더 나은 방법이있을 수 있다고 말합니다.
Mike Dunlavey

답변:


16

스큐-헤르 미트 (Skeh-Hermitian) 행렬의 행렬 지수는 계산하기가 저렴합니다.

가정 당신의 스큐 - 에르 미트 행렬, 다음입니다 A는 에르 미트, 그리고를 통해 zheevd 과 친구 당신은 분해를 얻을 수 있습니다AiA

iA=UΛUH,

여기서 는 단일 고유 벡터 행렬이고 Λ 는 실수와 대각선입니다. 그리고 사소하게UΛ

A=U(iΛ)UH.

당신은 일단 Λ를 , 그것은 계산에 용이UΛ

exp(A)=exp(U(iΛ)UH)=Uexp(iΛ)UH

먼저 고유 값을 지수화하고 zcopy 를 통해 를 설정 하고 지수 고유 값으로 각 열에 대해 zscal 을 실행 하여 B : = B exp ( i Λ ) 를 수행 하고 결과를B:=UB:=Bexp(iΛ)

exp(A):=BUH

zgemm을 통해 .


감사! 나는 거기 명백한 속임수를 놓친 . 내가 필요로하는 특정 LAPACK 서브 루틴에 나를 넣었으므로 추가로 감사드립니다. 나는 이것을 아직 올바른 것으로 표시하지 않을 것입니다 (먼저 테스트하고 싶습니다). i
qubyte

1
서두르지 마. 나는 실제로 그것을 전에 구현 했으므로 꽤 확신합니다 :-)
Jack Poulson

이것은 내가 모든 곳에서 사용하는 마법의 코드 중 하나가 될 것입니다. 그 가치가있는 것에 대해, 나는 아무도 볼 수없는 주석 줄에 감사를 표할 것입니다.
qubyte

2
@JackPoulson : 잘 들었습니다. 이것은 가상의 숫자 (고유 값 이외)를 믿지 않는 전공을 고르기 위해 얻는 것입니다.
Geoff Oxberry

1
@ JackPoulson : 그것은 아름답게 작동합니다. 다시 한 번 감사드립니다. 특히 zscal 비트입니다. 나는 다른 서브 루틴에서 나머지 코드의 대부분을 가졌지 만 이것은 간과했던 것입니다.
qubyte

5

전화를 사용 중이므로 쉽게 연결할 수 없으며 나중에 링크를 추가합니다. 아마도 "19 매트릭스 지수를 계산하는 모호한 방법 19", Fortran 라이브러리 EXPOKIT, 매트릭스 지수를 계산하기위한 Krylov 방법에 대한 Jitse Niesen의 논문, 그리고 매트릭스 지수에 대한 Nick Higham의 최근 논문 중 일부를보고 싶을 것입니다. 행렬 지수보다 행렬 지수와 벡터의 곱이 필요한 것이 더 일반적이며, Krylov 방법이 도움이 될 수 있습니다. 설명 한 것과 같은 작고 밀도가 높은 행렬의 경우 Padé 방법이 더 좋을 수 있지만 ODE의 수치 적분을 위해 지수 방법 내에서 Krylov 방법을 사용하면 많은 성공을 거두었습니다.


감사. 나는 19 가지의 모호한 방법을 알고 있으며 , 또한 추방하지만, 함께 일하는 사람들 중 일부는 업계에 종사하고 있으므로 저작권상의 이유로이를 피하고 싶습니다. LAPACK / BLAS로 이미 구현하고 있기 때문에 이미 이러한 라이브러리에 연결되어 있습니다. 그래도 한가지; 행렬 지수 자체가 필요합니다. 나는 양자 프로세스 단층 촬영의 변형을 연구하고 있으며 문제의 프로세스는 매트릭스로 구현됩니다. 나중에이 행렬 지수와 결합하여 적분기를 다루겠습니다.
qubyte

1

복잡한 고유 해법은 수학적으로 정확하지만 필요한 것보다 많은 작업을 수행합니다. 불행히도, 내가 설명하려는 개선 된 접근법은 LAPACK 호출로 구현할 수 없습니다.

RC Ward와 LJ Grey, ACM Trans를보십시오. 수학. 부드러운. 4, 278, (1978). TOMS 알고리즘 530에서 사용할 수 있고 netlib에서 다운로드 할 수있는 소프트웨어에 대해 설명합니다. 스큐 대칭 행렬 과 같이 인수 분해하는 방법을 설명합니다.X

X=UDUT

여기서 는 실제 직교하고 D 는 실제 비대칭이며 블록 대각선입니다. 대각선 서브 블록은 2 × 2 또는 1 × 1 입니다. 블록 대각선이므로 각 서브 블록을 개별적으로 지수화 할 수 있습니다. 1 × 1 블록 제로되어 EXP ( 0 ) = 1, 그 사소한 그래서. 2 × 2 서브 블록으로 완료UD2×21×11×1exp(0)=12×2

exp(0tt0)=(costsintsintcost)

원하는 지수 행렬은 다음과 같습니다.

exp(X)=Uexp(D)UT

나는이 방법을 양자 화학 코드에서 수십 년 동안 사용해 왔으며 관련된 소프트웨어에 전혀 문제가 없었습니다.


@Ron Shepard 님, 안녕하세요. Computational Exchange SE에 오신 것을 환영합니다. 두 번째와 세 번째 방정식을 편집 할 수 있습니까? 이해하기가 조금 어렵습니다.
nicoguaro

0

행렬 지수에 벡터를 곱한 값만 있으면이 포트란 서브 루틴을 사용할 수 있습니다. 다음을 계산합니다.

(eA)v

여기서 v는 벡터이고 A는 규칙적인 은자 행렬입니다. EXPOKIT 라이브러리 의 서브 루틴입니다.

그렇지 않으면 서브 루틴 을 고려할 수 있습니다. 서브 루틴은 일반적인 복잡한 행렬 A에서 작동합니다.


그것은 포트란 라이브러리에 대한 참조처럼 보이지 않습니다.
Geoff Oxberry

@GeoffOxberry : 포트란 서브 루틴을 포함하도록 다시 작성했습니다
Paul

@Paul : 좋지 않아요. 내가하고있는 일은 공정 단층 촬영의 모든 매트릭스 변형입니다. 또한 왜곡 -Hermitian!
qubyte

답변을 다시 작성해 주셔서 감사하지만 편집 내역을 바탕으로 답변을 완전히 변경하고 시간순으로 내 초기 답변의 요소를 취한 다음 링크를 추가 한 것으로 보입니다.
제프 옥스 베리

@GeoffOxberry : 반대로 ... 내 결과는 당신과는 별개이지만 내 대답을 다시 쓸 기회를 갖기 전에 게시했습니다 :)
Paul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.