diff --git a/task3/01lu/.gitignore b/task3/01lu/.gitignore new file mode 100644 index 0000000..c368d45 --- /dev/null +++ b/task3/01lu/.gitignore @@ -0,0 +1,2 @@ +.stack-work/ +*~ \ No newline at end of file diff --git a/task3/01lu/01lu.cabal b/task3/01lu/01lu.cabal new file mode 100644 index 0000000..42b1612 --- /dev/null +++ b/task3/01lu/01lu.cabal @@ -0,0 +1,22 @@ +cabal-version: 1.12 + +-- This file has been generated from package.yaml by hpack version 0.35.2. +-- +-- see: https://github.com/sol/hpack + +name: 01lu +version: 0.0.0 +build-type: Simple + +executable 01lu-exe + main-is: Main.hs + other-modules: + Paths_01lu + hs-source-dirs: + app + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N + build-depends: + base >=4.7 && <5 + , easyplot + , hmatrix + default-language: Haskell2010 diff --git a/task3/01lu/app/Main.hs b/task3/01lu/app/Main.hs new file mode 100644 index 0000000..44a9cd1 --- /dev/null +++ b/task3/01lu/app/Main.hs @@ -0,0 +1,60 @@ +module Main where + +import Numeric.LinearAlgebra as LA +import Graphics.EasyPlot + +data TriangType = Up | Low | None deriving Show + +a n = build (n, n) $ gen n :: Matrix Double + +gen n x y | x == (fromIntegral $ n - 1) = 1 + | x == y = 1 + | x < y = -1 + | x > y = 0 + +luGet a = case lu a of + (l, u , p, s) -> (p, ((l, Low), (u, Up))) + +solveTriang (a, t) f = case t of + Up -> let rs = toRows a in + calcu (cols a) (reverse rs) f + Low -> let rs = toRows a in + calcl (cols a) rs f + None -> error "Not triang" + +calcu nrs rs f = calc' rs 0 [] where + calc' [] n us = us + calc' (r:rs) n us = calc' rs (n + 1) (ui : us) where + ui = (fi - (subVector 0 n $ vector us) <.> (subVector (nrs - n) n r)) / ri where + fi = f `atIndex` (nrs - n - 1) + ri = (r `atIndex` (nrs - n - 1)) + +calcl nrs rs f = calc' rs 0 [] where + calc' [] n us = reverse us + calc' (r:rs) n us = calc' rs (n + 1) (ui : us) where + ui = (fi - ((subVector 0 n $ vector $ reverse us) <.> (subVector 0 n r))) / ri where + fi = f `atIndex` n + ri = r `atIndex` n + +-- Для вычисления числа обусловенности +norm1 = maximum . map (sum . map abs) . toLists +norm2 = norm1 . tr +norm3 m = sqrt $ maximum $ map magnitude $ toList $ eigenvalues $ m LA.<> (tr m) + +mu norm m = norm m * (norm $ inv m) + +collectDots norm 1 = [(0, mu norm (a 1))] +collectDots norm n = (fromIntegral n, mu norm (a n)) : collectDots norm (n - 1) + +main :: IO () +main = do + -- Пример решения системы n = 5 + let m = a 5 + let f = vector $ take 5 $ repeat 1 + let v = vector $ solveTriang (fst $ snd $ luGet m) f + let u = solveTriang (snd $ snd $ luGet m) v + --print u :: Vector R + + let dots = collectDots norm1 100 + plot X11 $ Data2D [Title "norm1", Style Lines] [] dots + print dots diff --git a/task3/01lu/graph.png b/task3/01lu/graph.png new file mode 100644 index 0000000..9a5bd5b Binary files /dev/null and b/task3/01lu/graph.png differ diff --git a/task3/01lu/package.yaml b/task3/01lu/package.yaml new file mode 100644 index 0000000..50bf0b4 --- /dev/null +++ b/task3/01lu/package.yaml @@ -0,0 +1,26 @@ +name: 01lu + +dependencies: +- base >= 4.7 && < 5 +- hmatrix +- easyplot + +ghc-options: +- -Wall +- -Wcompat +- -Widentities +- -Wincomplete-record-updates +- -Wincomplete-uni-patterns +- -Wmissing-export-lists +- -Wmissing-home-modules +- -Wpartial-fields +- -Wredundant-constraints + +executables: + 01lu-exe: + main: Main.hs + source-dirs: app + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N diff --git a/task3/01lu/stack.yaml b/task3/01lu/stack.yaml new file mode 100644 index 0000000..aa89bc5 --- /dev/null +++ b/task3/01lu/stack.yaml @@ -0,0 +1,68 @@ +# This file was automatically generated by 'stack init' +# +# Some commonly used options have been documented as comments in this file. +# For advanced use and comprehensive documentation of the format, please see: +# https://docs.haskellstack.org/en/stable/yaml_configuration/ + +# Resolver to choose a 'specific' stackage snapshot or a compiler version. +# A snapshot resolver dictates the compiler version and the set of packages +# to be used for project dependencies. For example: +# +# resolver: lts-3.5 +# resolver: nightly-2015-09-21 +# resolver: ghc-7.10.2 +# +# The location of a snapshot can be provided as a file or url. Stack assumes +# a snapshot provided as a file might change, whereas a url resource does not. +# +# resolver: ./custom-snapshot.yaml +# resolver: https://example.com/snapshots/2018-01-01.yaml +resolver: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/21/14.yaml + +# User packages to be built. +# Various formats can be used as shown in the example below. +# +# packages: +# - some-directory +# - https://example.com/foo/bar/baz-0.0.2.tar.gz +# subdirs: +# - auto-update +# - wai +packages: +- . +# Dependency packages to be pulled from upstream that are not in the resolver. +# These entries can reference officially published versions as well as +# forks / in-progress versions pinned to a git hash. For example: +# +extra-deps: + - easyplot-1.0@sha256:3fec6ccf425b370ab668eb342bc4cd92777880653e27a982db7b225fd007cb2b,1936 +# - acme-missiles-0.3 +# - git: https://github.com/commercialhaskell/stack.git +# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# +# extra-deps: [] + +# Override default flag values for local packages and extra-deps +# flags: {} + +# Extra package databases containing global packages +# extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true +# +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: ">=2.7" +# +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 +# +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] +# +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor diff --git a/task3/01lu/stack.yaml.lock b/task3/01lu/stack.yaml.lock new file mode 100644 index 0000000..bbb928e --- /dev/null +++ b/task3/01lu/stack.yaml.lock @@ -0,0 +1,20 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/lock_files + +packages: +- completed: + hackage: easyplot-1.0@sha256:3fec6ccf425b370ab668eb342bc4cd92777880653e27a982db7b225fd007cb2b,1936 + pantry-tree: + sha256: a5de94b54a51732bf70a601fca8c905fe074ecf870ea573db36d53a3bbb282f4 + size: 219 + original: + hackage: easyplot-1.0@sha256:3fec6ccf425b370ab668eb342bc4cd92777880653e27a982db7b225fd007cb2b,1936 +snapshots: +- completed: + sha256: 60e54c1ba3c1e7163acf6dafa9d56b2d3b23f88a31ad53a1c9d888f32561f8da + size: 639819 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/21/14.yaml + original: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/21/14.yaml