Программирование решателя матрицы haskell для обучения, логические ошибки времени выполнения - PullRequest
0 голосов
/ 08 января 2019

Я серьезно изучал Хаскель уже около полутора недель и черпал вдохновение в занятиях по линейной алгебре, чтобы сделать решатель матриц. Первым шагом является создание определяющей функции, но я хотел пройти лишнюю милю и создать функцию, которая могла бы решать матрицы более высокой размерности (4x4, 5x5 и т. Д.).

Я очень горжусь тем, что у меня есть, учитывая, что это все, что я выучил, и я смог устранить все ошибки, с которыми я столкнулся до этого момента, благодаря компилятору Haskell. Однако именно в этот момент я в растерянности. Код ниже будет скомпилирован в GHCI без проблем:

elerem :: Int -> [a] -> [a]
elerem x xs = init first ++ sec
    where
     first = fst split
     sec   = snd split
     split = splitAt x xs

neglist :: Num a => [a] -> [a]
neglist (x:y:rest) = x:(negate y):(neglist rest)
neglist [x] = [x]

determin :: (Num a, Enum a) => [[a]] -> a
determin xf
    |length (head xf) /= length xf = 0
    |(length xf == 2) && (length (head xf) == 2) = cofactor xf
    |otherwise = sum (zipWith (*) (neglist (head xf)) (sizedown xf))
        where
         sizedown xf = [(determin (cut (tail xf) 1)), (determin (cut (tail xf) 2))..(determin (cut (tail xf) (length xf)))]
         cut xf x = map (elerem x) xf
         cofactor xf = head (head xf) * last (last xf) - head (last xf) * last (head xf)

И из моего тестирования пока успешно работает с матрицей 2x2 и некоторыми, но не всеми, матрицами 3x3. Поскольку я на самом деле не получаю никаких сообщений об ошибках, я не уверен, где именно я ошибся в коде, все, что я вижу, это то, что мой код не дает те же ответы, что матричные калькуляторы в Интернете.

Моя единственная подсказка заключается в том, что при запуске с матрицы идентификаторов 3x3 мой код выполняет очень очевидный ответ 1. Изменение значений элементов в матрице идентификаторов также изменяет ответ на правильный, за исключением первого значения (или столбцов). второй и третьей матрицы (или строки). Похоже, что первый намеренно путает ответы, а последний игнорируется при расчете и рассматривается как 0. Я чувствую, что решить эту проблему будет сложнее, чем обычно, из-за отсутствия полезных сообщений об ошибках, и я еще не достаточно опытен, чтобы представить себе процесс расширения функций, выполняющийся в моей голове, чтобы найти точный центр проблемы. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

В ответ на мой последний комментарий с матрицей, которая давала определитель 732 вместо правильного ответа 723, я обнаружил ответ сам. Кажется, что (длина xf - 1) неверна, просто (длина xf) приемлема. Спасибо всем за помощь!

0 голосов
/ 08 января 2019

Проблема в том, что .. только генерирует арифметическую последовательность на основе вычисленного результата параметров.

В частности,

[(f 1), (f 2) .. (f 5)]

не совпадает с

[(f 1), (f 2), (f 3), (f 4), (f 5)]

, вместо этого он равен

let a=f 1; b=f 2; c=f 5 in [a,b..c]

Попробуйте сами с какой-нибудь нелинейной функцией, например f x = x*x.

Для генерации [(f 1), (f 2), (f 3), (f 4), (f 5)] вы можете использовать map f [1..5] или составить список [f i | i <- [1..5]].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...