최근 Numecical Recipe 제 2 판인 bandec()에서 LUDecomposition 루틴을 구현했습니다. 그것은 컴팩트 형태의 줄무늬 행렬로 루 분해를 만듭니다 (또한 L과 U를 간결한 형식으로 반환합니다). 내 질문은 어떻게 방정식 시스템을 해결할 수 있습니까?메이플 컴팩트 ludecomposition A.x = B, x는 행렬
A.x = B, x가 행렬 인 경우?
내가 사용할 수있는 루틴이 있습니까?
최근 Numecical Recipe 제 2 판인 bandec()에서 LUDecomposition 루틴을 구현했습니다. 그것은 컴팩트 형태의 줄무늬 행렬로 루 분해를 만듭니다 (또한 L과 U를 간결한 형식으로 반환합니다). 내 질문은 어떻게 방정식 시스템을 해결할 수 있습니까?메이플 컴팩트 ludecomposition A.x = B, x는 행렬
A.x = B, x가 행렬 인 경우?
내가 사용할 수있는 루틴이 있습니까?
당신은 "희소 줄무늬"라고 썼습니다. 줄무늬 경우에는 특별한 스파 스 솔버가 없지만 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
정규 명령 LinearAlgebra : -LinearSolve이이를 처리합니다. B이 행렬 인 경우 x이됩니다.
예 그것은 잘 작동하지만 거대한 스파 스 밴드 매트릭스를 구현하기 위해 노력 해왔다. Maple이 제공하는 모든 "드문 드문 한"방법은 느리게 진행되었습니다 (이상한 일입니다!). 그래서 줄무늬 행렬이 실제로 희소하다는 사실을 이용하여 루틴을 구현하려고했습니다. –
귀하의 질문과 귀하의 질문 사이에 연결이 표시되지 않습니다. ** A **의 희박성은 ** x **가 행렬인지 여부와 관련이 있습니까? –
네, 죄송합니다. 분명치 않았습니다. 나는 줄무늬가있는 줄무늬 행렬 J를 가지고 있고, J = B라는 시스템을 풀고 싶습니다. 여기서 X는 행렬입니다. 이것은 LinearSolve로 할 수 있지만 대단히 느립니다. 그래서 희박성을 이용하여 LUdecomposition 코드를 구현하려고 시도했지만, 이제 LinearSolve가 수행하는 루틴 (JX = B에 해당)을 수행해야하지만 bandec()의 출력과 호환됩니다. 콤팩트 형태의 PLU 행렬 –
안녕하세요! 예, 이것이 내 경우입니다. 감사합니다! 나는 어떤 속도도주지 않은 1000x1000 행렬을 시도했다. 실제로 느리게 갔다. 크기를 10000으로 늘릴 때만 줄무늬로 더 빨리 진행됩니다. 작은 행렬에 대해 왜 느려지는지 알고 있습니까? 매트릭스가 너무 희박하므로 항상 더 빨리 해결해서는 안됩니까? –
위의 코드는 비슷한 타이밍을 보여 주며 정확하게 비교합니까? 그리고 위의 1000 개만 크기를 변경할 때? Matrices/Vectors에서 datatype = float [8]을 사용하는 것이 중요합니다. 그 infolvel 설정은 사용되는 clapack 기능을 보여 주며 밴드 케이스에서는 LAPACK의 특수 대역 -LU (packed storage)를 사용함을 나타냅니다. www.mapleprimes.com으로 게시하고 질문에 실제 워크 시트 예제를 업로드하면 디버그하기가 더 쉬워집니다. – acer