Inital commit
This commit is contained in:
commit
6a8d3f76c6
2 changed files with 90 additions and 0 deletions
11
README.md
Normal file
11
README.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
|
||||||
|
# Info
|
||||||
|
|
||||||
|
These are a collection of algorhtims, not intended for practical use,
|
||||||
|
but just for learnign purposes.
|
||||||
|
|
||||||
|
|
||||||
|
# Algorhtims
|
||||||
|
|
||||||
|
- `simul.hs` - A simultaneous equation LU decomposition
|
79
simul.hs
Normal file
79
simul.hs
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
-- Info:
|
||||||
|
|
||||||
|
-- This program solves linear equation of any dimensions using LU
|
||||||
|
-- decomposition
|
||||||
|
|
||||||
|
-- To solve:
|
||||||
|
-- 3x - 4y = 0
|
||||||
|
-- 9x - 8y = 12
|
||||||
|
-- do in the repl:
|
||||||
|
-- solve [[3,-4],[9,-8]] [0,12]
|
||||||
|
|
||||||
|
-- You can use whatever size matrix
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------------
|
||||||
|
-- These are the helper functions and types --
|
||||||
|
|
||||||
|
type Mat a = [Row a]
|
||||||
|
|
||||||
|
type Row a = [a]
|
||||||
|
|
||||||
|
p_transpose :: Mat a -> Mat a
|
||||||
|
p_transpose ([]:_) = []
|
||||||
|
p_transpose x = map head x : p_transpose (map tail x)
|
||||||
|
|
||||||
|
-- Matrix sun
|
||||||
|
smult :: Fractional a => [a] -> [a] -> a
|
||||||
|
smult xs = sum . zipWith (*) xs
|
||||||
|
|
||||||
|
-- Matrix multiplication
|
||||||
|
mult :: (Fractional a) => [[a]] -> [[a]] -> [[a]]
|
||||||
|
mult ma mb = [map (smult row) mbt | row <- ma]
|
||||||
|
where mbt = p_transpose mb
|
||||||
|
|
||||||
|
---------------- LU decomposition-----------------
|
||||||
|
|
||||||
|
lu_mat :: Fractional a => [Row a] -> ([Row a], [[a]])
|
||||||
|
lu_mat [a] = ([a],[[1]])
|
||||||
|
lu_mat (xs:xss)
|
||||||
|
= (com [mat, subm], (1:(map negate facts)):(map (0:) u))
|
||||||
|
where facts = map negate $ map (/head xs) (map head xss)
|
||||||
|
mat = zipWith (\x -> zipWith (+) (map (x*) xs)) facts xss
|
||||||
|
(subm, u) = lu_mat $ map tail mat
|
||||||
|
|
||||||
|
lu :: Fractional a => [Row a] -> (Mat a, Mat a)
|
||||||
|
lu m = (p_transpose u, head m : l)
|
||||||
|
where (l,u) = lu_mat m
|
||||||
|
|
||||||
|
com :: [Mat a] -> Mat a
|
||||||
|
com [a] = a
|
||||||
|
com xs = head a : (zipWith (:) (map head (tail a)) b)
|
||||||
|
where a = head xs
|
||||||
|
b = com (tail xs)
|
||||||
|
|
||||||
|
--------------Solving system equation----------------
|
||||||
|
|
||||||
|
-- solve :: Fractional a => Mat a -> Mat a -> Mat a
|
||||||
|
-- LZ = C
|
||||||
|
--
|
||||||
|
solve a c = let (l,u) = lu a
|
||||||
|
z = solve_lower l c
|
||||||
|
x = reverse $
|
||||||
|
solve_lower (reverse $ p_transpose $ reverse $ p_transpose u)
|
||||||
|
(reverse z)
|
||||||
|
in x
|
||||||
|
|
||||||
|
-- AX = Z
|
||||||
|
solve_lower :: (Foldable t, Fractional a) => t [a] -> [a] -> [a]
|
||||||
|
solve_lower ma z = fst $ foldl
|
||||||
|
(\(mx,(zf:ze)) row ->
|
||||||
|
let (sum, (num:_)) = dropProdSum mx row
|
||||||
|
in (mx ++ [(zf-sum)/num], ze))
|
||||||
|
([],z) ma
|
||||||
|
|
||||||
|
dropProdSum :: Num a => [a] -> [a] -> (a, [a])
|
||||||
|
dropProdSum [] ys = (0, ys)
|
||||||
|
dropProdSum (x:xs) (y:ys) = (x*y + a, b)
|
||||||
|
where (a,b) = dropProdSum xs ys
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue