При построении графиков по математическим формулам, особенно если они заданы в полярных координатах или в параметрической форме в окрестностях некоторых точек они могут существенно искажаться. Обычно это происходит вблизи точки O с координатами 0;0, потому что ошибка округления в районе этой точки имеет такой же порядок или даже выше, что и значения функции. Но есть и вторая причина этого — для некоторых функций 0 является пограничной точки, то есть с одной стороны нуля, как правило, с положительной функция определена, а с другой, как правило отрицательной — неопределенна. Примером такой функции является квадратный корень.
В некоторых случаях это преодолевается с помощью математических выкладок, чтобы на всем промежутке функция была определена. Хотя этот способ имеет ряд недостатков:
Не является универсальным
Не для всех функций дает желаемый результат
Бывает чрезвычайно сложно найти требуемые уравнения функции.
Но мы все‑таки рассмотрим этот теоретический способ на примере построения кривой Лемниската Бернулли, которая очень напоминает лежащую восьмерку или знак бесконечности.
Как известно, Лемниската Бернулли в полярных координатах имеет следующее уравнения:
Для построения программы была использована программа моей разработки, написанная на языке C# по технологии NET WPF, использующая две сторонних библиотеки mXparser и OxyPlot. На данный момент программа может строить графики явных функций и кривые, заданные параметрическими уравнениями.
Любое уравнение кривой в полярных координатах можно записать в декартовых в параметрической форме. Пусть функция задана в полярных координатах следующем уравнением:
где ρ — полярный радиус, а φ‑полярный угол
Тогда данное уравнение можно записать в декартовой системе координат можно записать в параметрической форме следующим образом:
Однако надо помнить компьютер строит любое изображение в декартовой системе координат. Даже если мы не переводим явно преобразование полярные координаты в декартовые, то внутри программы такое преобразование все равно происходит. И это может вызвать артефакты на графике.
Но прежде запишем для Лемнискаты Бернулли параметрические уравнения для декартовой системы координат:
Ниже приводится график, который построен по этим формулам по 100 точкам:

Вместо лемнискаты Бернулли мы получили какую‑то гантелеобразную кривую.
При увеличение числа точек до 200 мы видим, что кривая стала намного плавнее и больше похожа на лемнискату Бернулли. Но если присмотреться, то в районе начала координат не наблюдается пересечение линий.

Можно и дальше увеличивать число точек, и наш график будет все ближе и ближе приближаться к истинной лемнискате Бернулли, но это увеличивает объемы требуемых расчетов для построения графиков и требуемую память для хранения массива точек в ОЗУ.
Но мы можем поступить хитрее и разработать принципиально другую математическую модель для данной кривой, которая будет лишена указанных недостатков. Но для этого нам придется сделать несколько математических выкладок.
Прежде, чем выполнить их запишем уравнение лемнискаты Бернулли в полярных координатах немного в другом виде:
И соответственно в декартовой системе координат оно запишется следующей системой параметрических уравнений:
или
Если сложить уравнения в последней системе, то получим:
или
Чтобы исключить из последнего выражения переменную φ, используем формулы перевода декартовых координат в полярные:
Подставив эти формулы в последнее уравнение лемнискаты Бернулли и сделав несложные арифметические преобразования получим уравнение данной кривой в декартовой системе координат:
Данное уравнение является неявным уравнением Лемнискаты Бернулли. Из него довольно сложно вывести зависимость одной декартовой координаты от другой. Чтобы это легче было сделать, сделаем следующую подстановку y=x·t
Данное уравнение легко решить относительно x:
И соответственно для у мы получим:
Последние два выражения определены, если t принадлежит отрезку [-1;1]
Они являются параметрическими уравнениями правой половины лемнискаты Бернулли. Чтобы построить левую половину достаточно x взять со знаком минус.
Данная математическая модель лучше исходной по следующим причинам:
Мы избавились от тригонометрических функций, которые являются основным источником ошибки округления.
Свели отрезок аргумента к отрезку [-1;1];
Данный график был построен по последней математической модели.

Данная кривая наиболее похожа на лемнискату Бернулли.
Комментарии (4)

belch84
26.09.2026 23:18Вместо того, чтобы искать какую-то специфичную параметризацию, нужно искать особые точки: экстремумы, точки перегиба, самопересечения и прочее. И дальше рисовать сегменты между особыми точками наивным подходом.
Обе приведенные параметризации обладают тем недостатком, что содержат особые точки. Именно это приводит к необходимости составлять кривую из кусков различных кривых - (в первом случае это две кривые на разных интервалах изменения параметра, а во втором - просто две разные кривые для одного и того же интервала параметров). Совет строить кривые из кусков является универсальным, но именно для лемнискаты существует единое представление, позволяющее построить всю кривую целиком для одного интервала параметра :
Такое представление не имеет особенностей и является наиболее простым. Насчет точности вычисления тригонометрических функций - не думаю, что это имеет какое-то значение. На рисунке показана лемниската, построенная по приведенному мной представлению с использованием 100 точек, а на отдельном кадре - половинка, построенная с помощью рационального представления из статьи (красным, тоже по 100 точкам). Мне кажется, что они не очень сильно отличаются. Про эконимию времени судить не берусь, возможно, что рациональное представление действительно быстрее

Лемниската Бернулли
cpud47
Вообще говоря, конечная формула более подвержена погрешностям, чем исходный вариант. Банально
прям классический кандидат на catastrophic cancellation. С другой стороны, косинус можно посчитать довольно точно. С корнем, конечно, будет потеря точности, но он в обоих вариантах присутствует. И разумеется потеря точности с корнем не такая сильная, как в случае catastrophic cancellation.
Реальная причина, почему график стал лучше в том, что Вы разбили кривую на два лепестка. У кривой есть особая точка в (0, 0) и по сути Вы искусственно добавили контрольную точку, чтобы корректно обработать эту особенность.
Аналогичного результата можно добиться если в исходном подходе просто к списку точек взять и добавить точки
.
И это собственно показывает путь к рисованию произвольных кривых. Вместо того, чтобы искать какую-то специфичную параметризацию, нужно искать особые точки: экстремумы, точки перегиба, самопересечения и прочее. И дальше рисовать сегменты между особыми точками наивным подходом.
Melamed69 Автор
Но числа
и
является иррациональным. И в исходной модели вам пришлось вычислять когда
причем в исходной модели есть на данном интервале, когда исходная модель не определена, так как под корнем получается отрицательное число. Это когда
и
В полученной модели область определения не дробится. Это пожалуй существенный факт
cpud47
Не очень понимаю, к чему это. Я не говорю, что Ваш метод плохой сам по себе. Я лишь говорю, что он не решает проблемы, которую Вы же сами и обозначили: как нарисовать кривую на компьютере.
Точнее сказать, в данном конкретном случае он её решает, но это вопрос чисто совпадения, а не общей закономерности. В общем случае нужно идти через анализ кривой, как я писал выше.
P.S. ну неопределена и неопределена — это же исходная постановка задачи. Если она так исходно была поставлена, значит скорее всего, это никого особо не волнует.