-- Glasgow Haskell 0.403 : BLAS ( Basic Linear Algebra System ) -- ********************************************************************** -- * * -- * FILE NAME : vblldecomp.hs DATE : 5-3-1991 * -- * * -- * CONTENTS : LL decomposition method for variable bandwidth matrix * -- * * -- ********************************************************************** module VBlldecomp(vblldecomp, vbllsolution, vbllsolution') where import Basics import Vector import VBmatrix vblldecomp :: Vbm Float -> Vbm Float -- L[i,i] = sqrt(A[i,i] - ***) -- where -- *** = SUM [ L[i,k]*L[i,k] | k <- [1..i-1] ] -- L[i,j] = (A[i,j] - ***) / L[j,j] -- where -- *** = SUM [ L[i,k]*L[j,k] | k <- [1..j-1] ] vbllsolution :: Vbm Float -> Vec Float -> Vec Float -- Solve equation system, the variable bandwidth matrix is -- undecomposed, ie it is the original matrix. vbllsolution' :: Vbm Float -> Vec Float -> Vec Float -- Solve equation system, the variable bandwidth matrix is decomposed. vblldecomp mA = m where m = makevbmat (boundvbmat mA) (diagadrvbm mA) f f (i,j) = if (i == j) then sqrt ( vbmatsub mA (i,i) - sum ( map ( \ k -> vbmatsub m (i,k) * vbmatsub m (i,k) ) [(fstclvbmat mA i) .. (i-1)] ) ) else ( vbmatsub mA (i,j) - sum ( map ( \ k -> (vbmatsub m (i,k) * vbmatsub m (j,k) ) ) [ (k0 i j) .. (j - 1)] ) ) / ( vbmatsub m (j,j) ) k0 i j = if ( (fstclvbmat mA i) >= (fstclvbmat mA j) ) then (fstclvbmat mA i) else (fstclvbmat mA j) vbllsolution a b = fst (backwarding ( forwarding (b, vblldecomp a) ) ) vbllsolution' a' b = fst (backwarding ( forwarding (b, a') ) ) forwarding ( b, mVB ) = (b',mVB) where b' = makevec n f n = boundvec b f i = ( vecsub b i - sum [(vbmatsub mVB (i,j)) * (vecsub b' j) | j<-[l i..i-1] ] ) / (vbmatsub mVB (i,i)) l i = fstclvbmat mVB i backwarding ( b, mVB ) = (b',mVB) where n = boundvec b b' = makevec n f f i = ( vecsub b i - sum [( vbmatsub mVB (j,i) ) * ( vecsub b' j ) | j <- ( validj i [i+1..n] ) ] ) / (vbmatsub mVB (i,i)) validj i (j:js) = if ( i >= fstclvbmat mVB j ) then j : (validj i js) else validj i js validj i [] = []