Вы все знаете метод Ньютона для аппроксимации корней функции, не так ли? Моя цель в этой задаче - познакомить вас с интересным аспектом этого алгоритма.
Алгоритм Ньютона сходится только для определенных, но чаще всего сложных входных значений. Если вы представляете сходимость метода для всех входных значений в комплексной плоскости, вы обычно получаете красивый фрактал, подобный этому:
Характеристики
Цель этой задачи - создать такие фракталы. Это означает, что вы получаете многочлен в качестве входных данных и должны распечатать соответствующий фрактал в виде изображения в выбранном формате в качестве выходного.
вход
Входные данные представляют собой разделенный пробелами список комплексных чисел. Они записаны в стиле <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. Если вы хотите использовать редкий формат, рассмотрите возможность добавления ссылки на веб-сайт, где можно загрузить для него средство просмотра.
Выведите файл на стандартный вывод. Если ваш язык не поддерживает помещение чего-либо в стандартный вывод или если вы считаете этот параметр менее удобным, найдите другой способ. В любом случае должна быть возможность сохранить сгенерированное изображение.
ограничения
- Нет библиотек обработки изображений
- Нет фрактальных библиотек
- Самый короткий код выигрывает
расширения
Если вам нравится эта задача, вы можете попытаться раскрасить точки в соответствии со скоростью сходимости или некоторыми другими критериями. Я хотел бы увидеть некоторые интересные результаты.
Ответы:
Питон,
827777 символовНаходит границы отображения (и корни), находя точки сходимости для группы случайных выборок. Затем он рисует график, вычисляя точки сходимости для каждой начальной точки и используя хеш-функцию для получения случайных цветов для каждой точки сходимости. Посмотрите очень внимательно, и вы можете увидеть отмеченные корни.
Вот результат для примера полинома.
источник
Ява,
1093 1058 10991077 символовВвод аргументов командной строки - например, запустить
java F 1 0 0 -1
. Выходные данные выводятся на стандартный вывод в формате PPM (растровое изображение ASCII).Масштаб выбирается с использованием Фудзивары, связанной с абсолютным значением комплексных корней многочлена; Затем я умножаю это ограничение на 1,5. Я настраиваю яркость по степени сходимости, поэтому корни будут в самых ярких участках. Поэтому логично использовать белый цвет, а не черный, чтобы отметить приблизительное расположение корней (что обходится мне в 41 символ за что-то, что даже нельзя сделать «правильно». Если я маркирую все точки, которые сходятся в пределах 0,5 пикселей от себя затем некоторые корни выходят немаркированными, если я помечаю все точки, которые сходятся с точностью до 0,6 пикселей от себя, то некоторые корни получаются помеченными более чем на один пиксель, поэтому для каждого корня я отмечаю первую встреченную точку, которая сходится с точностью до 1 пикселя от себя ).
Изображение для примера полинома (преобразуется в png с помощью GIMP):
источник
x^6-9x^3+8
тщательно спроектированную, выбрав корни и затем используя Wolfram Alpha, чтобы упростить полином. Хорошо, я обманул, поменяв местами оттенки в GIMP.Python, 633 байта
После ускорения и украшения (756 байт)
График ниже для функции Ньютона Фрактал log (z).
источник
;
. Кроме того, удалите все возможные места.matplotlib
здесь), поэтому нет гарантии, что он все еще работает.