Ви всі знаєте метод Ньютона для наближення коренів функції, чи не так? Моя мета в цьому завданні - познайомити вас із цікавим аспектом цього алгоритму.
Алгоритм Ньютона сходиться лише для певних, але найбільше складних вхідних значень. Якщо ви зобразите конвергенцію методу для всіх вхідних значень над складною площиною, ви зазвичай отримуєте такий прекрасний фрактал:
Технічні умови
Мета цього завдання - генерувати такі фрактали. Це означає, що ви отримуєте поліном як вхідний і маєте роздрукувати відповідний фрактал у вигляді зображення у форматі, який ви обрали як вихід.
Вхідні дані
Вхід - це розділений пробілом список складних чисел. Вони записані в стилі <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. Якщо ви хочете скористатися рідкісним форматом, подумайте про додавання посилання на веб-сайт, де можна завантажити його для перегляду.
Виведіть файл у stdout. Якщо у вашій мові не підтримується додавання чогось до stdout або якщо ви вважаєте цей варіант менш зручним, знайдіть інший спосіб. Будь-яким способом має бути можливість зберегти створене зображення.
Обмеження
- Немає бібліотек обробки зображень
- Немає фрактальних генеруючих бібліотек
- Виграє найкоротший код
Розширення
Якщо вам подобається це завдання, ви можете спробувати розфарбувати точки відповідно до швидкості конвергенції чи за іншими критеріями. Я хотів би побачити кілька цікавих результатів.