Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Бесконечная система уравнений для МНК
- system s = zip (matrix s) (column s) where
- matrix = iterate tail . foldr1 (zipWith (+)) . map (\(x,y) -> iterate (*x) 1)
- column = foldr1 (zipWith (+)) . map (\(x,y) -> iterate (*x) y)
- -- Сведение бесконечной системы к треугольному виду (первый шаг гаусса)
- triangle (eq:eqs) = (eq : triangle (map (sub eq) eqs)) where
- sub eq1@(a1:as, ae) eq2@(b1:bs, be) = (zipWith f as bs, f ae be) where
- f a b = b - a * b1 / a1
- -- Вычисление иксов (второй шаг гаусса)
- calcX n = foldr calc [] . take n where
- calc (a:as, b) xs = ((b - sum (zipWith (*) as xs)) / a : xs)
- -- метод наименьших квадратов
- mnk n = reverse . calcX n . triangle . system
- -- пример работы
- *Main> mnk 3 [(1,4),(2,1),(3,0),(4,1),(5,4)]
- [1.0,-6.0,9.0]
Advertisement
Add Comment
Please, Sign In to add comment