Я пытаюсь реализовать метод Ньютона-Рафсона на Haskell, и до сих пор мне удавалось заставить его работать с помощью функции iterate
, но проблема в том, что он повторно настраивает бесконечный список из-за характера функции итерации, поэтому я Я ищу способ остановить цикл, когда значение, полученное в итерации, попадает в заданную погрешность и возвращает указанное значение
Я просмотрел некоторые сообщения в блогах и даже некоторые вопросы здесь, но я довольно новичок в haskell и не полностью разбираюсь в синтаксисе, поэтому для меня сейчас очень сложно читать примеры кода или документацию.
Определения f(x) и g(x) (производной) не имеют значения:
newton x0 = iterate step x0
where step xn = xn - ((f xn)/(g xn))
В настоящее время я работаю, беря первые элементы заданного списка, используя take 4 $ newton 3.5
в приглашении GHCi, но список, возвращаемый iterate
, бесконечен, поэтому я не могу использовать для него хвостовую функцию.
Моя идея состоит в том, чтобы установить где-то константу, margin = 0.0001
или что-то в этом роде, и когда последняя итерация функции newton отстает от поля, функция iterate
останавливается, и у меня есть окончательный результат
takeWhile
. - person n. 1.8e9-where's-my-share m.   schedule 19.05.2019iterate
, бесконечен, поэтому я не могу использовать для него хвостовую функцию. Почему бы и нет?tail
отлично работает с бесконечными списками. - person melpomene   schedule 19.05.2019newton
с другими функциями и полями, вам может быть полезно передатьf
,g
иmargin
в качестве аргументов. - person duplode   schedule 19.05.2019until
? - person oisdk   schedule 19.05.2019