■LU Decompositionのプログラミング: 正方行列の場合■
有限要素法のソフトで生成される剛性マトリクスは、メモリーを節約するためにバンドマトリクス化されています。
それに伴い三角行列分解のアルゴリズムにも多少の手を入れる必要があります。
まず、ここでは、正方マトリクスを三角行列分解を行う方法を紹介します。後ほどバンドマトリクスの三角行列分解
を紹介します。
正方マトリクスの場合、プログラムにすると三角行列分解は以下のサブプログラムで計算できます。 Webサイトに掲載されているCholesky分解法の解説書をベースにプログラムしてみました。
SUBROUTINE DECOMP ( MXN, NNODE, A ) IMPLICIT REAL*8(A-H,O-Z) DIMENSION A(MXN,MXN) C------- COMPUTATION OF L(I,J) C-------I = 1 DO J = 2, NNODE A(1,J) = A(1,J)/A(1,1) END DO C------ I >= 2 DO I = 2 , NNODE SUM = 0.D0 DO M = 1, I-1 SUM = SUM + A(M,I)**2*A(M,M) END DO A(I,I) = A(I,I) - SUM DO J = I+1, NNODE SUM = 0.D0 DO M = 1, I-1 SUM = SUM + A(M,I)*A(M,J)*A(M,M) END DO A(I,J) = (A(I,J)-SUM)/A(I,I) END DO END DO C ----------- PUT ZERO INTO LOWER [A] DO I = 1 , NNODE DO J = 1, I-1 A(I,J) = 0.D0 END DO END DO RETURN END元のマトリクス[A]を上のプログラムに送ると、上半分の[A]には[L]Tが入り、 [A]の対角要素には、[D]が入ります。下半分の[A]には、ゼロが入っています。 NNODEは、マトリクス[A]のサイズを示します。MXNは、[A]のメモリー宣言のための整数です。
上のサブプログラムを用いて連立方程式を解く方法を紹介します。まず、[A]{x}={B}の[A]と{B}を読み込みます。 次に、[L]と[D]を次の行で計算します。これが、連立方程式の計算を行う第1ステップになります。
CALL DECOMP ( MXN, NNODE, A )
すると、[A]の上半分には[L]Tが、対角には[D]が入ります。したがって、 計算しなければならない連立方程式は[L][D][L]T{x}={B}でしたね。 そして、[D][L]T{x}={x'}と置き、[L][D][L]T{x}={B} は、[L]{x'}={B}で書けました。 {x'}は代入法で得られるということでしたよね。 下がそのプログラムです。そして、{x'}の計算結果は、{B}に入ります。
DO I = 2 , NNODE SUM = 0.D0 DO J = 1, I-1 SUM = SUM + A(I,J)*B(J) END DO B(I) = B(I) - SUM END DOまだ[D][L]T{x}={x'}の計算が残っていますので、今度は[L]T{x}={x"}と置くでしたね。 すると、[D]{x"}={x'}になりますから、{x"}は間単に計算できます。下がそうです。{x"}の計算結果も{B}に入ります。
DO I = 1 , NNODE B(I) = B(I) / A(I,I) END DOそして、最後の[L]T{x}={x"}を代入法で計算すると、目的の{x}が計算されます。以下を見てください。 結果は、{B}に入ります。
DO I = NNODE-1, 1, -1 SUM = 0.D0 DO J = I+1 , NNODE SUM = SUM + A(I,J)*B(J) END DO B(I) = B(I) - SUM END DO同じマトリクス[A]を用い違った{B}で何度も連立方程式を解く場合は、この方法が有効です。
BACK | NEXT |
---|
Menu | LU Decompo | Stiff | 3D Solid | 3D Fluid | Eigen&Lanczos | Sound Eigen | Solid Eigen | Solid Axisym |