Я ищу алгоритмы для рисования стандартных 2d-графиков для функций, которые могут иметь или не иметь особенности. Цель состоит в том, чтобы написать «Мини-CAS», поэтому у меня нет априорных знаний о типах функций, которые хотят видеть пользователи.
Эта проблема очень старая, поэтому я предполагаю, что в литературе должно быть несколько стандартных алгоритмов. На этот раз у меня не было большого успеха в поиске ссылок через Google.
Я нашел один интересный алгоритм, а именно этот, из «YACAS - Книги алгоритмов» под названием «Адаптивное построение функций».
Итак, вкратце:
- Есть ли стандартные алгоритмы?
- Существует ли набор тестов для известных сложных для построения функций?
- Какие интересные статьи читать?
algorithms
visualization
soegaard
источник
источник
Ответы:
Я реализовал адаптивную процедуру выборки Mathematica здесь, на GitHub (это один файл C, перейдите в исходное дерево для файла заголовка). Я нашел описание рутины в большой книге по Mathematica давным-давно, и уже некоторое время использую варианты этой реализации. Он в основном делает грубую линейную выборку в интересующей области, а затем возвращается для уточнения областей высокой кривизны. Возможно, что некоторые очень острые черты отсутствуют, но на практике я нахожу это чрезвычайно редким. Этот файл также содержит параллельную версию.
источник
Exclusions -> None
скрыв структуру вашей функцииPlot
, определив ее какf[x_?NumericQ] := ...
. Это не то, о чем я говорил, когда спрашивал об изменениях. Я полагаю, что в алгоритм были внесены некоторые изменения, поскольку v5 и v6 выполняли выборку в разных точках. Прямо сейчас я не могу проверить на v5, хотя, чтобы сравнить снова.Знание того, как другие CAS делают это, может вам помочь.
Начните с равномерно распределенной сетки точек в области построения. (В Mathematica есть параметр, чтобы контролировать, сколько взять, называется
PlotPoints
.)Если мы еще не достигли предела итерации (установленного
MaxRecursion
в Mathematica), повторите процедуру с шага 2.Часть этого обсуждается в книге Стэна Вагона "Математика в действии", которую вы можете увидеть здесь в Google Книгах .
Я реализовал этот алгоритм раньше, чтобы лучше контролировать, сколько раз оценивалась моя дорогостоящая функция для вычисления. Вот код Mathematica для шага 2:
источник
Веб-страница MathWorld на функциональных графиках содержит ссылки на несколько статей, которые, как представляется, имеют отношение к адаптивному построению функций. Цитирование страницы:
С другой стороны, в Google я наткнулся на бумагу
www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf
это объясняет, как правильно выбрать домен и другие вещи. Я надеюсь, что они полезны для вас.
источник
Я нашел эту тему и подумал, что должен поделиться страницей с разработчиками, чтобы добавить ее в библиотеку Julia Plots.jl. Мы попробовали несколько методов, чтобы увидеть, что даст хорошие результаты, начиная с заметок по реализации Mathematica. Добавление некоторого сокращения, небольшого возмущения, которое не начиналось точно в конечных точках интервала, предела рекурсии и оценки ошибки двойной сетки - все это было необходимо, чтобы «все было правильно». Поток также указывает на открытый исходный код для реализации. Так что потребовалось немного доработать, но добавление этих функций сделало его довольно надежным (согласно тестам, как показано в теме).
источник