Алгоритмы построения (адаптивных?) Функций


21

Я ищу алгоритмы для рисования стандартных 2d-графиков для функций, которые могут иметь или не иметь особенности. Цель состоит в том, чтобы написать «Мини-CAS», поэтому у меня нет априорных знаний о типах функций, которые хотят видеть пользователи.

Эта проблема очень старая, поэтому я предполагаю, что в литературе должно быть несколько стандартных алгоритмов. На этот раз у меня не было большого успеха в поиске ссылок через Google.

Я нашел один интересный алгоритм, а именно этот, из «YACAS - Книги алгоритмов» под названием «Адаптивное построение функций».

Итак, вкратце:

  • Есть ли стандартные алгоритмы?
  • Существует ли набор тестов для известных сложных для построения функций?
  • Какие интересные статьи читать?

2
Может быть, вопрос будет лучше понят с «построением графика» вместо «рисования графика»? Сначала я неверно истолковал название (теория графов).
astrojuanlu

@ Juanlu001 Спасибо за предложение. Я изменил название.
Soegaard

Когда вы говорите 2D, вы имеете в виду построение функции с одной переменной, такой как , или вас также интересует функция с двумя переменными ( f ( x , y ) ), показанная в 2D с различными цветами / оттенками, представляющими разные значения? е(Икс)е(Икс,Y)
Сабольч

Ну, я имел в виду построение функции одной переменной. Тем не менее, я также хотел бы услышать об алгоритмах для выбора, какие точки оценивать в настройках с двумя переменными. Мне не очень интересно слышать о цветах и ​​затенении.
Soegaard

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

Ответы:


10

Я реализовал адаптивную процедуру выборки Mathematica здесь, на GitHub (это один файл C, перейдите в исходное дерево для файла заголовка). Я нашел описание рутины в большой книге по Mathematica давным-давно, и уже некоторое время использую варианты этой реализации. Он в основном делает грубую линейную выборку в интересующей области, а затем возвращается для уточнения областей высокой кривизны. Возможно, что некоторые очень острые черты отсутствуют, но на практике я нахожу это чрезвычайно редким. Этот файл также содержит параллельную версию.


1
Какая это книга? Это тот, кого я связал? Знаете ли вы, что именно меняется в их реализации между версиями 5 и 6?
Сабольч

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

Символическая предварительная обработка, о которой вы говорите, в документации называется «обнаружение исключения». Его можно отключить, либо Exclusions -> Noneскрыв структуру вашей функции Plot, определив ее как f[x_?NumericQ] := .... Это не то, о чем я говорил, когда спрашивал об изменениях. Я полагаю, что в алгоритм были внесены некоторые изменения, поскольку v5 и v6 выполняли выборку в разных точках. Прямо сейчас я не могу проверить на v5, хотя, чтобы сравнить снова.
Сабольч

«Графический справочник Mathematica» содержал очень хорошее обсуждение проблемы. Мне особенно понравилось, что также были описаны недостатки алгоритма.
Soegaard

Я больше не могу найти файл GitHub, он переехал?
Андрей

12

Знание того, как другие CAS делают это, может вам помочь.

е(Икс)(Икс(T),Y(T))е(Икс)

  1. Начните с равномерно распределенной сетки точек в области построения. (В Mathematica есть параметр, чтобы контролировать, сколько взять, называется PlotPoints.)

  2. (Икс1,е(Икс1)),(Икс2,е(Икс2)),(Икс3,е(Икс3))Икс1+Икс22Икс2+Икс32

  3. Если мы еще не достигли предела итерации (установленного MaxRecursionв Mathematica), повторите процедуру с шага 2.

Часть этого обсуждается в книге Стэна Вагона "Математика в действии", которую вы можете увидеть здесь в Google Книгах .

Я реализовал этот алгоритм раньше, чтобы лучше контролировать, сколько раз оценивалась моя дорогостоящая функция для вычисления. Вот код 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). Таппер (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.