Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 7th, 2012  |  syntax: Haskell  |  size: 0.93 KB  |  hits: 23  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. -- Бесконечная система уравнений для МНК
  2. system s = zip (matrix s) (column s) where
  3.     matrix = iterate tail . foldr1 (zipWith (+)) . map (\(x,y) -> iterate (*x) 1)
  4.     column = foldr1 (zipWith (+)) . map (\(x,y) -> iterate (*x) y)
  5.  
  6. -- Сведение бесконечной системы к треугольному виду (первый шаг гаусса)
  7. triangle (eq:eqs) = (eq : triangle (map (sub eq) eqs)) where
  8.     sub eq1@(a1:as, ae) eq2@(b1:bs, be) = (zipWith f as bs, f ae be) where
  9.         f a b = b - a * b1 / a1
  10.  
  11. -- Вычисление иксов (второй шаг гаусса)
  12. calcX n = foldr calc [] . take n where
  13.     calc (a:as, b) xs = ((b - sum (zipWith (*) as xs)) / a : xs)
  14.  
  15. -- метод наименьших квадратов
  16. mnk n = reverse . calcX n . triangle . system
  17.  
  18. -- пример работы
  19. *Main> mnk 3 [(1,4),(2,1),(3,0),(4,1),(5,4)]
  20. [1.0,-6.0,9.0]