2016-10-10 1 views
1

최근 Numecical Recipe 제 2 판인 bandec()에서 LUDecomposition 루틴을 구현했습니다. 그것은 컴팩트 형태의 줄무늬 행렬로 루 분해를 만듭니다 (또한 L과 U를 간결한 형식으로 반환합니다). 내 질문은 어떻게 방정식 시스템을 해결할 수 있습니까?메이플 컴팩트 ludecomposition A.x = B, x는 행렬

A.x = B, x가 행렬 인 경우?

내가 사용할 수있는 루틴이 있습니까?

답변

0

당신은 "희소 줄무늬"라고 썼습니다. 줄무늬 경우에는 특별한 스파 스 솔버가 없지만 LAPACK의 (고밀도) 밴드 솔버가 사용됩니다. 저는 사실 당신의 사건일지도 모르는 작은 기회에이 글을 씁니다.

예,

restart; 
with(LinearAlgebra): 
N:=10000: 
M:=RandomMatrix(N,datatype=float[8]): 
V:=RandomVector(N,datatype=float[8]): 
infolevel[LinearAlgebra]:=1: 
X:=CodeTools:-Usage(LinearSolve(M,V)): 
    LinearSolve: using method LU 
    LinearSolve: calling external function 
    LinearSolve: NAG hw_f07adf 
    LinearSolve: NAG hw_f07aef 
    memory used=0.75GiB, alloc change=0.78GiB, cpu time=16.24s, real time=4.30s, gc time=8.00ms 
Norm(M.X-V); 
    unknown: NAG hw_f06paf 
    unknown: NAG hw_f06paf 
    Norm: calling external function 
    Norm: NAG: hw_f06raf 
             -8 
       1.06381179421077832 10 

restart; 
with(LinearAlgebra): 
N:=10000: 
B:=max(1,floor(0.005*N)): 
2*B+1; 
          101 
M:=RandomMatrix(N,shape=band[B,B],datatype=float[8]): 
V:=RandomVector(N,datatype=float[8]): 
infolevel[LinearAlgebra]:=1: 
X:=CodeTools:-Usage(LinearSolve(M,V)): 
    LinearSolve: using method LU 
    LinearSolve: calling external function 
    LinearSolve: CLAPACK hw_dgbtrf_ 
    LinearSolve: CLAPACK hw_dgbtrs_ 
    memory used=13.09MiB, alloc change=11.52MiB, cpu time=20.00ms, real time=23.00ms, gc time=0ns 
Norm(M.X-V); 
    Multiply: calling external function 
    Multiply: NAG hw_f06pbf 
    Multiply: calling external function 
    Multiply: NAG hw_f06pbf 
Norm: calling external function 
    Norm: NAG: hw_f06raf 
            -11 
       8.03126454229641240 10 
+0

안녕하세요! 예, 이것이 내 경우입니다. 감사합니다! 나는 어떤 속도도주지 않은 1000x1000 행렬을 시도했다. 실제로 느리게 갔다. 크기를 10000으로 늘릴 때만 줄무늬로 더 빨리 진행됩니다. 작은 행렬에 대해 왜 느려지는지 알고 있습니까? 매트릭스가 너무 희박하므로 항상 더 빨리 해결해서는 안됩니까? –

+0

위의 코드는 비슷한 타이밍을 보여 주며 정확하게 비교합니까? 그리고 위의 1000 개만 크기를 변경할 때? Matrices/Vectors에서 datatype = float [8]을 사용하는 것이 중요합니다. 그 infolvel 설정은 사용되는 clapack 기능을 보여 주며 밴드 케이스에서는 LAPACK의 특수 대역 -LU (packed storage)를 사용함을 나타냅니다. www.mapleprimes.com으로 게시하고 질문에 실제 워크 시트 예제를 업로드하면 디버그하기가 더 쉬워집니다. – acer

0

정규 명령 LinearAlgebra : -LinearSolve이이를 처리합니다. B이 행렬 인 경우 x이됩니다.

+0

예 그것은 잘 작동하지만 거대한 스파 스 밴드 매트릭스를 구현하기 위해 노력 해왔다. Maple이 제공하는 모든 "드문 드문 한"방법은 느리게 진행되었습니다 (이상한 일입니다!). 그래서 줄무늬 행렬이 실제로 희소하다는 사실을 이용하여 루틴을 구현하려고했습니다. –

+0

귀하의 질문과 귀하의 질문 사이에 연결이 표시되지 않습니다. ** A **의 희박성은 ** x **가 행렬인지 여부와 관련이 있습니까? –

+0

네, 죄송합니다. 분명치 않았습니다. 나는 줄무늬가있는 줄무늬 행렬 J를 가지고 있고, J = B라는 시스템을 풀고 싶습니다. 여기서 X는 행렬입니다. 이것은 LinearSolve로 할 수 있지만 대단히 느립니다. 그래서 희박성을 이용하여 LUdecomposition 코드를 구현하려고 시도했지만, 이제 LinearSolve가 수행하는 루틴 (JX = B에 해당)을 수행해야하지만 bandec()의 출력과 호환됩니다. 콤팩트 형태의 PLU 행렬 –