Вы все знаете метод Ньютона для аппроксимации корней функции, не так ли? Моя цель в этой задаче - познакомить вас с интересным аспектом этого алгоритма.
Алгоритм Ньютона сходится только для определенных, но чаще всего сложных входных значений. Если вы представляете сходимость метода для всех входных значений в комплексной плоскости, вы обычно получаете красивый фрактал, подобный этому:
Характеристики
Цель этой задачи - создать такие фракталы. Это означает, что вы получаете многочлен в качестве входных данных и должны распечатать соответствующий фрактал в виде изображения в выбранном формате в качестве выходного.
вход
Входные данные представляют собой разделенный пробелами список комплексных чисел. Они записаны в стиле <Real part><iImaginary part>
, как этот номер: 5.32i3.05
. Можно предположить, что входное число имеет не более 4 десятичных знаков и меньше 1000. Первое из них не должно быть нулем. Например, это может быть вход в вашу программу:
1 -2i7,5 23,0004i-3,8 i12 0 5,1233i0,1
Числа интерпретируются как коэффициенты полинома, начиная с наибольшей степени. В остальной части этой спецификации, входной полином называется P . Вышеуказанный вход равен этому многочлену:
f (x) = x 5 + (-2 + 7,5 i ) x 4 + (23 0004 - 3,8 i ) x 3 + 12 i x 2 + 5,1233 + 0,1 i
Входные данные могут поступать вам либо из stdin, либо из аргумента, передаваемого программе, либо из приглашения, отображаемого в вашей программе. Вы можете предположить, что входные данные не содержат начальных или конечных пробельных символов.
оказание
Вы должны визуализировать фрактал следующим образом:
- Выберите столько цветов, сколько корней P плюс дополнительный цвет для расхождения
- Для каждого числа в видимой плоскости определите, сходится ли метод, и если да, то к какому корню. Цвет точки в соответствии с результатом.
- Не печатайте линейки или другие модные вещи
- Выведите черную точку в точках, которые являются корнями полиномов для ориентации. Вы можете печатать до четырех пикселей вокруг каждого корня.
- Найдите способ выбрать видимую плоскость так, чтобы все корни были различимы и, по возможности, широко распространялись по ней. Хотя идеальное размещение выходного кадра не требуется, я оставляю за собой право отказать в принятии ответа, который выбирает кадр недопустимым образом, например. всегда в одинаковых координатах, все корни находятся в одной точке и т. д.
- Выходное изображение должно иметь размер 1024 * 1024 пикселей.
- Время рендеринга максимум 10 минут
- Использование значений с плавающей точкой одинарной точности достаточно
Выход
Выходные данные должны быть растровым графическим изображением в выбранном вами формате, читаемом стандартным программным обеспечением для операционной системы марки X. Если вы хотите использовать редкий формат, рассмотрите возможность добавления ссылки на веб-сайт, где можно загрузить для него средство просмотра.
Выведите файл на стандартный вывод. Если ваш язык не поддерживает помещение чего-либо в стандартный вывод или если вы считаете этот параметр менее удобным, найдите другой способ. В любом случае должна быть возможность сохранить сгенерированное изображение.
ограничения
- Нет библиотек обработки изображений
- Нет фрактальных библиотек
- Самый короткий код выигрывает
расширения
Если вам нравится эта задача, вы можете попытаться раскрасить точки в соответствии со скоростью сходимости или некоторыми другими критериями. Я хотел бы увидеть некоторые интересные результаты.