Алгоритми побудови (адаптивного?) Побудови функції


21

Я шукаю алгоритми для складання стандартних 2-графіків для функцій, які можуть мати або не мати особливості. Мета - написати "Mini-CAS", тому я не маю апріорних знань про типи функцій, користувачі хочуть графікувати.

Ця проблема дуже стара, тому я думаю, що в літературі повинні бути деякі стандартні алгоритми. Я одного разу не мав особливих успіхів у пошуку посилань через Google.

Я знайшов один цікавий алгоритм, а саме цей із "YACAS - Книга алгоритмів" під назвою "Адаптивна побудова функції".

Отже, коротше:

  • Чи є стандартні алгоритми?
  • Чи є тестовий набір для відомих складних для побудови функцій?
  • Які цікаві статті читати?

2
Можливо, питання краще зрозуміти з "побудовою функції" замість "малювання графіка"? Я спочатку неправильно трактував заголовок (теорія графіків).
astrojuanlu

@ Juanlu001 Дякую за пропозицію. Я змінив назву.
soegaard

Якщо ви говорите 2D, ви маєте на увазі побудову функції однієї змінної, такої як , або ви також зацікавлені у функції двох змінних ( f ( x , y ) ), показаної в 2D, наприклад, різні кольори / відтінки, що представляють різні значення? f(x)f(x,y)
Саболч

Ну, я мав на увазі побудову функції однієї змінної. Однак я також хотів би почути про алгоритми для вибору, які бали оцінювати в налаштуваннях двох змінних. Мені не так цікаво чути про кольори та затінення.
soegaard

Щодо 2D функцій, дивіться моє запитання та відповідь тут . Те, що я там робив, було досить обмеженим, і це не спрацює так добре для довільної функції. Крім того, в описі відсутні деякі важливі кроки, без яких метод не буде належним чином сходитися: мені потрібно було вставити нову точку вибірки посередині кожного краю сітки, яка зникне при наступній ретріагуляції. (продовження)
Szabolcs

Відповіді:


10

Я реалізував процедуру адаптивного відбору проб Mathematica тут на GitHub (Це єдиний файл C, підніміться до вихідного дерева для файлу заголовка). Опис рутини я знайшов у великій книзі про Mathematica дуже давно, і вже деякий час використовую варіанти цього впровадження. Це, в основному, груба лінійна вибірка над цікавить область, а потім повертається до уточнення областей високої кривизни. Можливо, якісь дуже гострі риси пропущені, але на практиці я вважаю це надзвичайно рідкісним. Цей файл також містить паралельну версію.


1
Яка книга це? Це той, кого я пов’язав? Чи знаєте ви, що саме змінюється в їх реалізації між версіями 5 та 6?
Szabolcs

1
@Szabolcs: Ні, я вважаю, що це було в розділі 4.1.3 книги . В описі застосовується дуже стара версія Mathematica. Новіші версії (можливо, починаючи з v6) виявляють вертикальні асимптоти та видаляють помилкові вертикальні лінії з графіків. Нові версії, безумовно, роблять багато складних символічних попередніх обробок для вирішення проблем із розривами, невизначеними регіонами та скороченнями галузей.
Віктор Лю

Символічна попередня обробка, про яку ви говорите, називається "виявлення виключення" в документації. Його можна вимкнути Exclusions -> Noneабо приховати структуру вашої функції Plot, визначивши її як f[x_?NumericQ] := .... Це не те, про що я мав на увазі, коли питав про зміни. Я вважаю, що в алгоритмі були деякі зміни, оскільки v5 та v6 відбирали вибірки в різних точках. Зараз я не можу перевірити v5, хоча порівняти ще раз.
Саболч

"Посібник з графіки Mathematica" містив дуже гарне обговорення проблеми. Мені особливо сподобалось, що описані також короткі надходження алгоритму.
soegaard

Я більше не можу знайти файл GitHub, він перемістився?
Андрій

12

Знання, як інші CAS роблять це, може допомогти вам.

f(x)(x(t),y(t))f(x)

  1. Почніть з регулярно розташованої сітки точок на графіці домену. (У Mathematica є параметр, який дозволяє контролювати кількість, яку потрібно прийняти PlotPoints.)

  2. (x1,f(x1)),(x2,f(x2)),(x3,f(x3))x1+x22x2+x32

  3. Якщо ми ще не досягли межі ітерації (встановленої MaxRecursionв Mathematica), повторіть етап 2.

Деякі з них обговорюються в книзі Mathematica in Action Стен Вагона, яку ви можете побачити тут у Google Books .

Я реалізував цей алгоритм раніше, щоб мати кращий контроль над тим, скільки разів оцінювалася моя дорога для обчислення функція. Ось код Mathematica для кроку 2:

nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}

subdivide1d[result_, resolution_, maxAngle_: 10] :=
  Module[
    {deriv, angle, dangle, pos, nf},
    deriv = nd[result\[Transpose]];
    angle = ArcTan[#2] & @@@ deriv;
    dangle = Differences[angle];
    pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
    pos = Union[pos, pos + 1];
    nf = Nearest[result[[All, 1]]];
    Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
  ]

7

Веб-сторінка MathWorld на графіках функцій містить посилання на кілька робіт, які здаються актуальними для побудови адаптаційних функцій. Цитування сторінки:

Хороші підпрограми для побудови графіків використовують адаптивні алгоритми, які будують більше точок у регіонах, де функція змінюється найбільш швидко (Wagon 1991, Math Works 1992, Heck 1993, Wickham-Jones 1994). Tupper (1996) розробив алгоритм [...]

З іншого боку, в Google я натрапив на папір

www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf

що пояснює, як правильно вибрати домен та інші речі. Сподіваюся, вони вам корисні.


1

Я знайшов цю тему і подумав, що я повинен поділитися сторінкою для розробника, щоб додати це до бібліотеки Julia Plots.jl. Ми спробували купу методів, щоб побачити, що дасть хороші результати, починаючи з приміток про реалізацію Mathematica. Додавши трохи обрізки, невелике збурення, щоб не починатись точно в кінцевих точках інтервалу, обмеження рекурсії та подвійний оцінювач помилок в сітці, були необхідними для того, щоб "отримати це правильно". Нитка також вказує на відкритий вихідний код для реалізації. Таким чином, це трохи змінилося, але додавання цих функцій зробило це досить надійним (згідно тестів, як показано в потоці).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.