Цель лекции: познакомиться с принципами создания в Mathematica двумерных графических объектов и работы с ними.
Сложно представить более наглядный способ представления данных, чем визуализация. Зачастую рисунки и графики скажут пользователю о предмете исследования гораздо больше, чем формулы и массивы данных. Именно поэтому разработчики Mathematica удели огромное внимание средствам визуализации и научили программу строить двух- и трёхмерные графики функций и дискретных наборов данных в виде численных массивов и т.д.
Любая математическая зависимость одной величины от другой может быть описана в Mathematica средствами двумерной графики. Именно с этими средствами мы познакомимся в данной лекции, построенной на основе книги Е. М. Воробьёва [1].
Встроенные функции Mathematica, предназначенные для работы с двумерной графикой, оканчиваются на Plot, поэтому для получения информации обо всех них непосредственно в Mathematica можно воспользоваться командой ?*Plot — рис. 6.1. Если мы сравним таблицу графических функций в ячейке Out[1] на рис. 6.1 с полученной аналогичным способом таблицей в книге Е. М. Воробьёва [1, с. 70], мы увидим, что в таблице в настоящей лекции содержится значительно больше функций. Поскольку данный курс писался с использованием пакета Mathematica более поздней версии, приведённое сравнение оказывается как нельзя лучшей наглядной иллюстрацией того, насколько динамично развивается Mathematica, ширится её функциональная палитра, растут возможности.
Безусловно, в рамках одной лекции мы не успеем познакомиться со всеми функциями, представленными на рисунке 6.1. Но мы и не ставим это своей задачей. Мы разберём функции, которые используются в Mathematica гораздо чаще других, а также, ввиду своей универсальности, могут взять на себя выполнения задач, для которых имеются свои узкоспециализированные функции.
(рис 6.1) Функции Mathematica для создания двумерной графики
Все указанные на рис. 6.1 функции имеют чётко определённую структуру. Они имеют два обязательных аргумента и один необязательный. Первый обязательный аргумент есть выражение Mathematica, которое определяет зависимость (или зависимости), которую (которые) требуется построить. Второй аргумент, итератор, определяет аргументы функций и пределы их изменения. В трехмерном случае указываются два итератора. Необязательные аргументы графических функций — опций. Опциям присвоены значения по умолчанию, но если возникает необходимость, пользователь может задавать им собственные значения. Опции определяют стиль оформления, дополнительные параметры и элементы рисунков для повышения их большей наглядности и информативности.
Первая функция, с которой мы познакомимся в настоящей лекции, являющаяся также наиболее часто используемой при работе с графикой, — это функция Plot. Заданная в простейшем виде Plot[func,{x,xmin,xmax}] она строит зависимость функции func от аргумента x, меняющегося в пределах от xmin до xmax. При помощи этой функции можно строить зависимости от одного аргумента сразу нескольких функций, для чего в качестве первого аргумента следует указать их список в виде {func1,func2,...}. В примере In[1] на рис. 6.2 мы построили на одном графике зависимости тригонометрической функции $$Sin[2*x]$$ и параболы $$(x+1)^2$$ от меняющегося в пределах от -1 до 3 аргумента x, а также параллельную оси абсцисс прямую, характеризующую постоянное значение Pi.
Подробней о функции Plot см. книги Е. М. Воробьёва [1, с. 71, 76–77] и А. Н. Прокопени и А. В. Чичурина [5, с. 43–46].
По умолчанию Mathematica рисует все графики сплошными линиями одинаковой толщины, различаются только цвета: график первой в списке функции строится синим, второй — фиолетовым, третий — бежевым и т.д. Для того чтобы различать графики, используется специальная опция, которая, как и все опции графических функций, задаётся при помощи правил преобразования в виде PlotStyle->{{set1},{set2},...}, где set1,set2,... — набор графических директив (отличительных свойств) для графика с соответствующим номером 1,2,.... Под графическими директивами понимаются выражения, влияющие на характеристики графических объектов. Директивами могут выступать толщина линии, тип линии (линия может быть сплошная, штриховая, точечная и т.д.), цвет. В примере In[2] построим те же графики, что и в In[1], но изобразим их отличным друг от друга образом: первый график сделаем пунктирным при помощи директивы Dashed, красным при помощи Red и зададим при помощи директивы Thickness[d] относительную толщину линии d равную, например, 0.01; второй график сделаем зелёным, Green, штрихпунктирным, DotDashed, и более тонким (0.006); третий график оставим сплошным, не задавая для типа линии никаких дополнительных директив, но сделаем его синим, Blue, и самым тонким из трёх (0.002). Сравнение примеров Out[1] и Out[2] даёт яркое представление влияния опции PlotStyle на возвращаемое функцией Plot изображение.
Если опция PlotStyle задана в виде одномерного списка, PlotStyle->{dir1,dir2,...}, то каждая директива, независимо от её типа, будет относиться только к зависимости с соответствующим номером. Т.е., внешний вид первого графика будет определяться только директивой dir1, второго — только директивой dir2 и т.д.
Если для какого-то графика не нужно указывать дополнительных директив, то на месте соответствующего элемента вложенного списка в опции PlotStyle указывается пустой список {}.
Если в опции PlotStyle указан только один набор графических директив (PlotStyle задана как вложенный список, содержащий только один элемент), то он относится ко всем графикам. Так в примере In[3] на рис 6.2 мы сделали линии всех графиков красными, штриховыми, толщины 0.01.
Подробней об опции PlotStyle см. книги Е. М. Воробьёва [1, с. 76–77] и А. Н. Прокопени и А. В. Чичурина [5, с. 50–51].
(рис 6.2) Функция Plot для построения функции одной переменной
Е. М. Воробьёв [1, с. 77] отмечает, что к построению графиков функций возможны два подхода, "две стратегии". Первый подход заключается в том, что сначала определяются характерные точки графика, а затем вычисляются функции в этих точках. Именно этим подходом обычно пользуется Mathematica.
Во втором подходе сначала получается наиболее простое приближение для функции в заданном интервале, а затем вычисляются приближённые значения в некотором наборе точек из этого интервала. Заставить программу вторым путём можно, применив к вычисляемому выражению func функцию Evaluate[func]. Она вынуждает программу вычислять выражение func даже в случае, если оно является аргументом функции, атрибуты которой устанавливают, что это выражение должно оставаться невычисленным. Наглядно представим действие этой функции. В качестве функции для визуализации, как и Е. М. Воробьёв [1, с. 79], возьмём полином Чебышева. На рис. 6.3 построим графики первых десяти полиномов Чебышева, при этом в примере In[1] обойдёмся без функции Evaluate[func], а в примере In[2] применим её к полиномам. Как мы видим, в первом случае Mathematica изобразила графики всех зависимостей одним цветом, то есть, при вычислении она считала точки всех зависимостей принадлежащими одному графику. Во втором случае графики зависимостей для всех полиномов различны, поскольку, согласно второму подходу, Mathematica сначала определилась с функциями, зависимости которых будет строить, и только потом вычислила их значения в некоторых точках интервала. Таким образом, все зависимости рассматривались программой в отдельности друг от друга.
(рис 6.3) Функция Evaluate: изменение подхода к построению графиков
Зачастую требуется строить не зависимость функции от её аргумента, а зависимость одной функции от другой, зависящей от того же аргумента, то есть, строить параметрическую зависимость. Для этого в Mathematica имеется функция ParametricPlot. Её описание полностью совпадает с описанием функции Plot за исключением следующего момента: для построения графика одной зависимости первый аргумент задаётся в виде списка {funcarg,func}, при этом при построении значения функции funcarg откладываются по оси абсцисс, а func — по оси ординат; при построении графиков нескольких зависимостей аргумент задаётся в виде вложенного списка {{funcarg1,func1},{funcarg2,finc2},...}. На рис. 6.4 мы приводим параметрическую зависимость $$sin(3x)$$ от $$cos(4x)$$, характеризующую поведение точки, совершающей одновременно два гармонических колебания в двух взаимно перпендикулярных направлениях — прочерчивающей так называемые фигуры Лиссажу (см. похожий пример в работе Е. М. Воробьёва [1, с. 79]).
Подробней о функции ParametricPlot см. книги Е. М. Воробьёва [1, с. 79] и А. Н. Прокопени и А. В. Чичурина [5, с. 55–56].
(рис 6.4) Построение графиков параметрических зависимостей при помощи функции ParametricPlot
В примере на рис. 6.4 мы снова воспользовались опцией PlotStyle, сделав линии на графике красными при помощи уже известной нам директивы Red и толстыми при помощи директивы Thickness[0.03].
Кроме того, мы проиллюстрировали тот факт, что если в списке директив, относящихся к одному и тому же изображению, содержатся директивы, противоречащие друг другу (в нашем случае это директивы Thickness[0.001] и Thickness[0.03], устанавливающие разную толщину линий), то при построении применяется та, которая указана в списке последней (Thickness[0.03]).
Подробней об описанных директивах см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 50–51].
С другими опциями двумерных графических функций мы познакомимся в следующем пункте настоящей лекции.
Если функция задана не в декартовых, а в полярных координатах, то адекватно изобразить её позволит функция PolarPlot[r,{teta,tetamin,tetamax}], где r — характеризующий кривую радиус, зависящий от угла teta; угол меняется в пределах от tetamin до tetamax. Если требуется изобразить несколько кривых, то в качестве первого аргумента указывается список радиусов, описывающих кривые, {r1,r2,...}. Внешний вид генерируемых этой функцией рисунков можно менять при помощи опций, аналогичных опциям функций Plot и ParametricPlot. На рис. 6.5 приведён пример построения зависимости в полярных координатах при помощи функции PolarPlot.
Подробней о функции PolarPlot см. Е. М. Воробьёва [1, с. 76].
(рис 6.5) Визуализация непрерывной зависимости в полярных координатах
Внешний вид изображений, получаемых при помощи двумерных графических функций, может изменяться в зависимости от желания пользователя. В этом ему помогают дополнительные аргументы функций — опции. Все опции задаются в виде подстановок, т.е., как Opt->val, где Opt — заголовок опции, а val — задаваемое значение (А. Н. Прокопеня и А. В. Чичурин [5, с. 45]).
С одной из опций, меняющих способ отображения линий графиков, PlotStyle, мы уже познакомились выше. В данном пункте уделим внимание другим графическим опциям.
Очень часто, в зависимости от поведения изображаемых зависимостей, координаты пересечения осей на рисунке находятся не в точке (0,0). Чтобы самостоятельно установить эти координаты (причём не обязательно в точке (0,0)), используется опция, задаваемая в виде AxesOrigin->{x0,y0}.
Опция GridLines набрасывает на рисунок сетку вертикальных и горизонтальных линий. По умолчанию координатная сетка на рисунке отсутствует. При задании опции в виде GridLines->Automatic линии выходят из точек координатных осей с координатными отметками. Однако положение линий можно определить самостоятельно, задав опцию в виде GridLines->{{gridx1,gridx2,...},{gridy1,gridy2,...}}, где gridx1,gridx2,... указывают положение линии по оси абсцисс, а gridy1,gridy2,... — по оси ординат. Значениями gridx и gridy могут быть не только обычные числа, соответствующие координатам на осях, но и списки {n,Directive[d1,d2,...]}, где обязательный аргумент n задаёт положение линии, а d1,d2,... есть директивы, которые следует применить к этой линии (цвет, тип, толщина и др.).
Как было отмечено выше, Mathematica, строя графики непрерывных зависимостей, вычисляет значения функции всего в нескольких точках. Число точек, в которых изначально вычисляется значение функции, можно задавать самостоятельно при помощи опции PlotPoints. Принцип, по которому определяется количество точек построения, описывает Е. М. Воробьёв [1, с. 79]. По умолчанию их количество равно 25. Однако если угол между последовательными сегментами превосходит некоторое заданное программой значение, то производится дробление интервала между соседними точками, и, таким образом, число точек, в которых вычисляется функция, автоматически увеличивается.
При использовании так называемого адаптивного алгоритма вычисления функции в нескольких точках приводит к уменьшению времени вычислений, но может привести к уменьшению точности. Если точностью пренебрегать нельзя, то следует задать следующую опцию: Method->{Compiled->False}.
На рисунке 6.6 мы построили квадратичную параболу. В примере In[1] мы не использовали никаких дополнительных опций. В примере In[2] мы изменили цвет и толщину линии графика при помощи опции PlotStyle->{Green,Thick,Dashed}, перенесли начало координат в точку (0,0), задав AxesOrigin->{0,0}, при помощи опции GridLines->{{6,8,{10,Directive[Red,Dashed,Thickness[0.01]]},12,14},{10,20,30}} набросили на рисунок сетку, изменив цвет, толщину и тип одной из её линий, а также попутно повысили до ста число точек, в которых вычисляется функция, опцией PlotPoints->100 и отказались от ускорения построения графика за счёт уменьшения точности при помощи опции Method->{Compiled->False}.
Подробней об опциях AxesOrigin и GridLines см. книги Е. М. Воробьёва [1, с. 77–78] и А. Н. Прокопени и А. В. Чичурина [5, с. 52].
(рис 6.6) Влияние специфических опций функций Plot и ParametricPlot на изображение
Опция AspectRatio определяет отношение высоты двумерного рисунка к его ширине. По умолчанию ей задано значение 1/GoldenRatio, где GoldenRatio есть именованная константа, "золотое сечение", приближённо равное 1.61803. Пользователь может присвоить опции любое численное значения, руководствуясь необходимостью.
При помощи опции Axes можно указывать на рисунке или убирать с него координатные оси. Если опции присвоено значение True (оно же задаётся по умолчанию), то будут нарисованы все оси. Если присвоено значение False, то осей на рисунке не будет вовсе. Если опция задана как список Axes->{axx,axy}, то выражение axx определяет наличие на рисунке оси абсцисс, а axy — оси ординат, причём axx и axy могут принимать значения True и False.
Если оси всё-таки были сохранены на рисунке, то может пригодиться опция AxesStyle, которая позволяет управлять способом изображения осей. При помощи графических директив можно задавать относительную толщину осей, используя Thickness[d], насыщенность линии GrayLevel[d], цвет в разных цветовых координатах RGBColor[d1,d2,...] и Hue[d1,d2,...], длину последовательных участков прерывистой линии Dashing[d1,d2,...], причём d1,d2,... заключены в интервале от 0 до 1.
Опция AxesStyle не оказывает влияния на внешний вид рисунка, если Axes->False.
Mathematica самостоятельно расставляет координатные отметки на осях, однако если пользователя автоматическая расстановка не устраивает, он может расставить их самостоятельно при помощи опции Ticks->{{x1,x2,..},{y1,y2,...}}, где x1,x2,.. и y1,y2,... указывают координаты отметок на осях абсцисс и ординат, соответственно. Один из внутренних списков можно заменить на Automatic, тогда по этой оси расстановка отметок будет автоматической. Когда осей на рисунке нет (в случае Axes->False), опция Ticks никакого действия на рисунок не оказывает.
Опция AxesLabel позволяет подписать оси: задаётся также в виде списка {Xname,Yname}, где Xname,Yname названия осей абсцисс и ординат, соответственно. В случае если Axes->False, опция AxesLabel никаких надписей на рисунке не сделает.
Дать название всему рисунку можно при помощи опции PlotLabel.
По умолчанию все рисунки строятся на белом фоне, однако цветом фона можно управлять при помощи опции Background. Цвет задаётся в одной из трёх цветовых схем: для дисплеев это RGB[d1,d2,d3] (красный, синий, зелёный) и Hue[h,s,b] (h — обязательный параметр, определяющий положение цвета в цветовой Hue-палитре, s — насыщенность, b — яркость цвета; h, s, b находятся на отрезке от 0 до 1), а для цветных принтеров CMY[d1,d2,d3,d4] (синий, пурпурный, жёлтый, чёрный). Можно также определить серый цвет фона и менять его относительную интенсивность, задав опцию в виде Background->GrayLevel[d], где d может меняться в пределах от 0 до 1, при этом d=0 устанавливает черный фон, d=1 — белый фон.
Опция ColorOutput позволяет "подогнать" цветовые директивы под конкретное графическое устройство. Так установка ColorOutput->GrayLevel раскрашивает изображение в оттенки серого.
Опция TextStyle позволяет задать тип и размер шрифта текста на рисунке.
На рис. 6.7 мы построили параметрическую зависимость 2*Sin[v] от 3*Cos[v]. При этом в примере In[1] мы обошлись автоматическим заданием всех опций. В примере In[2] мы задали отношение высоты к ширине рисунка как обратную экспоненту при помощи опции AspectRatio->1/E, изменили цвет и толщину осей, задав опцию AxesStyle->{{Thick,RGBColor[0.9,0,0.8]},{Thick,Green}}, задали собственные отметки на оси абсцисс Pi/2, 0 и -Pi/2, оставив автоматическое задание отметок по оси ординат, Ticks->{{0,Pi/2,-Pi/2},Automatic}, сделали надписи по осям, AxesLabel->{"Ось абсцисс","Ось ординат"}, и подписали весь рисунок, PlotLabel->"Рисунок", увеличили шрифт надписей на рисунке и изменили их цвет, TextStyle->{16,Blue}, а также сделали фон рисунка светло серым, Background->GrayLevel[0.9].
Подробней об опциях AspectRatio, ColorOutput и опциях управления координатными осями см. книги Е. М. Воробьёва [1, с. 72–74] и А. Н. Прокопени и А. В. Чичурина [5, с. 51–52].
(рис 6.7) Изменение внешнего вида рисунка при помощи опций. Пример 1
Опция, заданная в виде Frame->True, заключает рисунок в прямоугольную рамку. Каждую сторону этой рамки, по часовой стрелке, начиная с нижней стороны, можно подписать при помощи опции FrameLabel->{"side1","side2","side3","side4"}. По умолчанию надписи side1 и side3 располагаются горизонтально, а side2 и side4 — вертикально (и читаются снизу вверх). Расположить все надписи горизонтально позволяет опция RotateLabel->False. Если опция задана в виде FrameLabel->"label", то надпись label помещается возле левой стороны рамки. Опция FrameStyle выполняет те же функции по отношению к рамке, что и опция AxesStyle — к осям. Опция FrameStyle не оказывает влияния на внешний вид рисунка, если Frame->False.
Опция может быть задана в виде Frame->{{bleft,bright},{bupper,blower}}, где bleft,bright,bupper и blower определяют присутствие левой, правой, верхней и нижней границ рамки, соответственно. Эти аргументы могут принимать только значения True или False (соответственно, наличие или отсутствие линии).
Опция Frame->{uplow,lefrig} определяет наличие (отсутствие) одновременно верхней и нижней или правой и левой границ рамки.
Если задана опция в виде Frame->True, то координатные отметки ставятся не на осях, а на сторонах рамки. Самостоятельно задать расстановку отметок на рамке можно опцией FrameTicks, действие которой аналогично действию опции Ticks для осей. Аналогично, когда рамки на рисунке нет (в случае Frame->False), опция FrameTicks не оказывает влияния на рисунок.
Для выбора области графика зависимости, которая будет отображаться на рисунке, имеется опция PlotRange. По умолчанию отображается наиболее характерная для зависимости часть графика, а нехарактерные регионы игнорируются. Если присвоить её значение All, то будут отображаться все значения. Выбрать область отображения самостоятельно можно, задав опцию в виде PlotRange->{{xmin,xmax},{ymin,ymax}}, где {xmin,xmax},{ymin,ymax} определяют границы по осям абсцисс и ординат, соответственно, в которых будет построен график.
На рис. 6.8 мы построили кубическую параболу $$(w-5)^3+10$$. В примере In[1] мы обошлись автоматическим заданием всех опций. В примере In[2] мы построили график в заданных границах, PlotRange->{{2,8},{-10,30}}, заключили рисунок в прямоугольную рамку, Frame->True, и избавились от координатных осей, Axes->False, подписали все стороны прямоугольной рамки, FrameLabel->{"низ","лево","верх","право"}, и поменяли цвет её линий, FrameStyle->{{Red},{Green},{Blue},{Magenta}}, самостоятельно задали положение координатных отметок на стороне рамки вдоль оси абсцисс, FrameTicks->{{Automatic,None},{{2,5,8},None}}.
Подробней об опции PlotRange и опциях управления рамкой см. книги Е. М. Воробьёва [1, с. 73–75] и А. Н. Прокопени и А. В. Чичурина [5, с. 51–52].
(рис 6.8) Изменение внешнего вида рисунка при помощи опций. Пример 2
На рисунках особым образом можно выделять не только линии графиков, но и целые области. Для этого используется опция Filling. Если на рисунке построен только один график, то опции можно задать следующие значения: Axis, Top, Bottom, некоторое численное значение.
В In[1] на рис. 6.9 несколько раз построим одну и ту же кривую, задавая при каждом построении различные значения опции Filling. При задании опции в виде Filling->Axis заполняется цветом область между линией графика и осью абсцисс (верхнее левое изображение в Out[1] на рис. 6.9), Filling->Тop — область выше графика, а Filling->Bottom — область ниже графика (верхнее правое и нижнее левое изображения, соответственно), при задании опции некоторого значения n, Filling->n, цветом заполняется область между линией графика и прямой, параллельной оси абсцисс, соответствующей значению n (нижнее правое изображение).
(рис 6.9) Выделение области на рисунке с одним графиком
Если на одном рисунке изображены графики сразу нескольких зависимостей, к областям, ограниченным линиями этих графиков можно применять ещё более избирательное выделение. На рис. 6.10 мы построили графики двух функций одной и той же переменной. Задав опции в виде Filling->Axis (верхнее левое изображение на рис. 6.10), мы заполнили цветом область между линиями графиков и осью абсцисс, при этом области под разными графиками заполняются разными цветами, а область перекрытия областей заполняется суперпозицией этих цветов. Опция в виде Filling->{2->Axis} заполняет цветом только область под линией графика второй (в списке аргумента) функции (верхнее правое изображение). При задании Filling->{1->{2}} (левое нижнее изображение) заполняет область между графиками функций под номерами 1 и 2. Цвет заполнения областей, безусловно, можно выбирать самостоятельно. Для этого мы задали опцию в виде Filling->{1->{{2},{Green,Red}}} (нижнее правое изображение), и теперь область между кривыми будет заполняться зелёным цветом, если первая кривая находится под второй, и красным — наоборот, когда первая кривая находится над второй.
Безусловно, возможна более гибкая настройка оформления областей на рисунках, но ввиду её специфичности оставим эту тему за пределами нашего рассмотрения в рамках настоящего курса.
Подробней об опциях заполнения областей между графиками см. книгу В. П. Дьяконова [2, с. 445–448].
(рис 6.10) Выделение области на рисунке с одним графиком
Функция DiscretePlot, которую мы рассмотрим следующей, является некоторым промежуточным звеном между функциями визуализации непрерывных зависимостей и функциями визуализации дискретного набора данных. Заданная в простейшем виде DiscretePlot[expr,{i,imax}], она визуализирует значения выражения expr при i, принимающем значения от 1 до nmax с шагом 1. Таким образом, expr представляет собой некоторую функцию от i, но i принимает дискретные значения.
Указанный вторым аргументом итератор может быть задан в иной форме. При {i,imin,imax} значение i меняется от imin до imax с шагом 1, а при {i,imin,imax,di} — с шагом di.
На рис. 6.11 приведён пример построения дискретного набора значений функции Cos[n] для n, принимающего значения от 0 до 4*Pi. В In[1] на рисунке слева мы ограничились стандартными шагом изменения переменной n, равным единице, а на рисунке справа уменьшили шаг на порядок.
Для того чтобы дискретная зависимость была более наглядной, построенные точки можно соединить, указав опцию Joined->True. В примере In[2] на рис. 6.11 мы перестроили оба рисунка In[1], соединив построенные точки. Если на рисунке справа действительно изображена весьма правдоподобная косинусоида, то угловатые айсбергоподобные пеньки на рисунке слева вызывают некоторое недоумение. Дело в том, что по умолчанию Mathematica соединяет соседние точки отрезками прямой. Именно поэтому при малом количестве построенных точек линия оказывается ломаной. Однако можно заставить Mathematica соединять точки гладкими кривыми — сплайнами. При этом порядок r кривых можно задать самостоятельно при помощи опции InterpolationOrder->r. В примере In[3] на левом рисунке мы соединили линии кривыми второго порядка, задав InterpolationOrder->2. При построении правого рисунка в In[3] мы воспользовались уже известной нам опцией Filling. Если мы вновь обратим внимание на построенные нами на рис. 6.11 изображения, то мы увидим, что области между построенными изображениями и осью абсцисс заполнены цветом. Если точки соединены линиями, то заполнено всё пространство под кривой, а от отдельно стоящих точек к оси абсцисс проведена нормаль. Опция Filling->False отключает автоматическое закрашивание областей под построенными изображениями.
(рис 6.11) Визуализация дискретных зависимостей при помощи функции DiscretePlot
Итак, мы научились визуализировать аналитически заданные функции одной переменной. Однако аналитический вид зависимости не всегда может быть известен. Зависимость может быть задана дискретным набором данных, в виде списка. Для визуализации заданных таким образом зависимостей используется функция ListPlot. Обязательным аргументом функции должен быть список, описывающий множество точек зависимости. Список может быть одномерным, list1={y1,y2,...}, вложенным в виде матрицы, list2={{x1,y1},{x2,y2},...}: в первом случае графически будет представлено множество точек с координатами {i,yi} (пример In[1] на рис. 6.12), а во втором — с координатами {xi,yi} (пример In[2], в котором мы также изменили диаметр ddot точек на графике при помощи директивы PointSize[ddot]).
Если внутренние списки аргумента функции ListPlot содержат больше двух элементов, list3={{y11,y12,...},{y21,y22,...},...} ,то все они рассматриваются как отдельные наборы данных. Так в примере In[3] на рис. 6.12 заданный таки способом вложенный список был визуализирован как три отдельные зависимости: именно поэтому соответствующие им точки имеют разные цвета.
Список можно формировать непосредственно при обращении к графической функции при помощи рассмотренных нами в лекции 3 функций, например, Table.
(рис 6.12) Визуализация дискретных зависимостей при помощи функции ListPlot
Если рисунок с отдельно стоящими точками недостаточно нагляден, точки можно соединить между собой в том порядке, в каком они указаны в списке. Делается это заданием уже знакомой нам опции Joined->True (ср. правый и левый рисунки в примере In[1] на рис. 6.13). Безусловно, линия, соединяющая отдельно стоящие точки дискретной зависимости, получается ломаной. Сделать график сглаженным позволяет ещё одна известная нам опция InterpolationOrder->n. В примере In[2] мы интерполировали зависимость, заданную в предыдущем примере, кривыми третьего порядка.
(рис 6.13) Соединение точек дискретных зависимостей
ListPlot также позволяет изображать на одном рисунке сразу несколько зависимостей, при этом в качестве аргумента следует указать зависимости в виде списка {list1,list2,...}. В примере In[1] на рис. 6.14 мы визуализировали распределение Пуассона для трёх различных значений среднего. При этом, точки только двух графиков из трёх мы соединили линиями, Joined->{True,False,True}, и интерполировали квадратичными сплайнами, InterpolationOrder->2. Кроме того, мы включили заполнение областей между линиями графиков и осями Filling->Axis. Как мы видим, области под графиками, точки которых соединены, заполнены полностью. Что касается оставшегося графика, то заполнение области под ним ограничилось лишь проведением нормалей из этих точек к оси абсцисс.
(рис 6.14) Визуализация нескольких дискретных зависимостей
Для дискретных данных также имеется функция построения зависимости в полярных координатах — ListPolarPlot[r,{teta,tetamin,tetamax}], где r — характеризующий кривую радиус, зависящий от угла teta; угол меняется в пределах от tetamin до tetamax. Функция также позволяет изобразить несколько кривых, задав первый аргумент в виде {r1,r2,...}. Пример использование функции ListPolarPlot приведён на рис. 6.15.
Подробней о функциях визуализации дискретных зависимостей см. книги Е. М. Воробьёва [1, с. 80–81] и А. Н. Прокопени и А. В. Чичурина [5, с. 56–58].
(рис 6.15) Визуализация дискретной зависимости в полярных координатах
Пусть мы построили один или несколько двумерных графиков. В процессе работы с изображением может возникнуть ситуация, когда графический стиль изображения следует изменить. Однако вычисления, связанные с построением графиков, могут быть весьма ресурсоёмкими. Поэтому Mathematica позволяет изменить стиль изображения без повторного вычисления зависимости: для этих целей в программе имеется функция Show. Заданная в форме Show[pict] она заново рисует ранее построенный рисунок pict с прежними установками, ничего в рисунке не меняя. Для того чтобы изменить установки графических опций, при которых был построен рисунок, следует задать функцию в виде Show[pict,option1->val1,option2->val2,...]: каждой опции option задаётся значение val.
В примере In[1] на рис. 6.16 при помощи функции Plot мы построили график некоторой функции x^2*Sin[3*x] от переменной x. При построении мы избавились от меток на осях, Ticks->None, а на график набросили координатную сетку, GridLines->Automatic. В примере In[2] мы решили перестроить наш рисунок, воспользовавшись функцией Show, и вернули метки на координатные оси, Ticks->All, от линий сетки избавились, GridLines->None, а на экран вывели лишь центральную область изображения, PlotRange->{{-5,5},{-25,25}}.
(рис 6.16) Изменение стиля уже построенных рисунков
Выражение Show[plot1,plot2,...] при вычислении объединяет несколько графиков в один, причём функции для построения рисунков не обязательно должны быть одинаковыми. Согласование по координатам происходит автоматически. На рис. 6.17 мы совместили на одном рисунке графики, построенные в отдельности друг от друга при помощи функций Plot и ListPolarPlot.
Подробней о функции Show см. книгу Е. М. Воробьёва [1, с. 87–88].
(рис 6.17) Совмещение нескольких двумерных рисунков на одном
По большому счёту, изображения, создаваемые функциями Plot, ListPlot и остальные им подобные, конструируются из точек, связанных друг с другом линиями, а особенности представления изображений задаются опциями, которые либо имеют значения по умолчанию, либо явно заданы пользователем. Для того чтобы проникнуть в "таинство" построения графиков, воспользуемся подходом С. Мангано [11, с. 238], а именно, познакомимся с внутренним представлением функции Plot при построении некоторой зависимости.
Построим в качестве примера (In[1] на рис. 6.18) зависимость математической функции Cos[x] от её аргумента x, на отрезке от 0 до 2*Pi, для чего зададим функцию в виде Plot[Cos[x],{x,0,2*Pi}]. Чтобы узнать, в каком виде Mathematica обрабатывает эту функцию, применим к ней InputForm. Внутренние данные представляют собой вложенный список с достаточно большим количеством элементов. Чтобы не загромождать экран, воспользуемся функцией Short[expr,n], которая выводит данные выражения expr в сокращённой форме на n строк. В примере In[2] мы выводим внутреннюю форму функции Plot[Cos[x],{x,0,2*Pi}] в сокращённом виде на 10 строк. В Out[2] мы видим, что рисунок состоит из последовательности координат (или точек на плоскости), лежащих на одной линии Line. Для семи точек координаты показаны, а для 384 остальных скрыты, "384". Цвет линии графика задан как Hue[0.67,0.6,0.6]. Последний элемент в списке Out[2], {"6"}, указывает на остальные использованные при построении опции, которые в данном примере оказались опущены. Используемый для построения рисунка конструктивный элемент Line (линия), с которым мы познакомились в предыдущем примере, является графически примитивом. Под графическими примитивами понимаются минимальные графические объекты, которые составляют рисунок.
(рис 6.18) Внутреннее представление встроенной функции построения двумерного графика
Таким образом, все рисунки, строящиеся в Mathematica, состоят из графических примитивов.
В двумерной графике используются такие примитивы, как точка (point), линия (line), прямоугольник (rectangle), многоугольник (polygon), дуга (circle), диск (disk), текст (text).
Точка — это выражение вида Point[{x,y}], где х и у — декартовы координаты точки на плоскости.
Линия — это ломаная линия, состоящая из отрезков прямых, последовательно соединяющих точки: Line[{{x1,y1},{x2,y2},...}]. Используя именно этот примитив, Mathematica построила рисунок в Out[1] на рис. 6.18.
Графический примитив многоугольник, задаваемый функцией Polygon[{{x1,y1},{x2,y2},...}], представляет собой многоугольник с заполнением, ограниченный замкнутой ломаной линий, проходящей через точки {x1,y1},{x2,y2},....
Частный случай многоугольника — прямоугольник. Для создания прямоугольника, стороны которого параллельны осям координат, в Mathematica имеется специальный примитив Rectangle[{xleftdown,уleftdown},{xrightup,yrightup}], где {xleftdown,уleftdown} — координаты левого нижнего угла, а {xrightup,yrightup} — правого верхнего.
Примитив Circle[{x,y},r] рисует окружность радиуса r с центром в точке {x,y}.
За изображение дуги окружности отвечает тот же примитив, но с расширенным набором аргументов: Circle[{x,y},r,{ang1,ang2}], где первый аргумент {x,y} указывает координаты центра окружности, которой принадлежит дуга, второй аргумент r — радиус окружности, а {ang1,ang2} — полярные углы, обозначающие начальную и конечную точку дуги.
Тот же примитив, заданный в следующем виде Circle[{x, y},{rx,ry}], рисует эллипс с полуосями rx и ry и с центром всё в той же точке {x,y}
Полностью закрашенный круг получается при помощи примитива Disk[{x,y},r].
Другой графический примитив Text[expr,{x,y}], где expr — некоторое выражение, выводит печатную форму выражения expr и центрирует его относительно точки {x,y}.
Если мы введём выражения для задания примитивов в окно ввода в Mathematica и запустим вычисления, то наши ожидания увидеть на экране рисунок, не оправдаются. Для того чтобы превратить примитив в рисунок на экране, нужно применить к нему функцию Graphic.
Подробней о двумерных графических примитивах Mathematica см. в книгах Е. М. Воробьёва [1, с. 92–96] и Ч. Гетца и Дж. Хелмстедт [9, с. 28–35].
На рисунке 6.19 мы при помощи примитивов схематично изобразили человечка. Лицо и глаза мы построили при помощи примитива Disc, нос, ручки и ножки — при помощи примитива Line, рот — примитива Circle, тело — Rectangle, узор на маечке — Point, юбочку — Polygon. Также мы подписали наш рисунок, Text[Style["Человечек",25,Orange],{9,4}], изменив стиль текста при помощи функции Style.
(рис 6.19) Построение двумерных изображения при помощи графических примитивов
Однако на рисунке 6.19 не все примитивы изображены одинаковым образом: в нашем примере они отличаются друг от друга цветом и толщиной линии. С директивами для изменения цвета мы уже познакомились выше: RGBColor[d1,d2,...] и Hue[d1,d2,...], равно как и с директивой изменения относительной толщины линии Thickness[d].
Другие директивы для работы с графическими примитивами следующие.
PointSize[r] — определяет относительный размер точки как круга радиуса r. При этом r есть отношении радиуса к полной ширине рисунка.
Директива Dashing[{rl,r2,...}] представляет линию в виде последовательности отрезков длины r1, r2 и т.д., которые повторяются периодически. Этой директивой можно преобразовывать сплошную линию в штриховую или штрихпунктирную.
Для того чтобы директива была применена к некоторому примитиву, она должна ставиться перед этим примитивом. Чтобы ограничить действие директивы на один или несколько примитивом, нужно заключить эту директиву и требуемые примитивы в фигурные скобки. Если на примитив действует сразу несколько директив, то все они должны стоять перед этим примитивом.
В примере In[1] на рис. 6.20 мы изобразили последовательно отрезок линии Line[{{0,0},{2,2}}], заполненный круг Disk[{2,1},1/2] и ещё один отрезок Line[{{2,0},{4,2}}]. При этом мы не использовали дополнительных графических директив. В примере In[2] на том же рисунке мы поставили впереди всех примитивов директивы изменения цвета на красный Red, изменили тип линий на штриховой Dashing[{0.05,0.1}]. Поскольку мы не использовали дополнительных фигурных скобок, то указанные директивы оказались применены ко всем примитивам. В примере In[3] мы применили директиву изменения типа линии на штриховой только к первому примитиву, заключив оба этих объекта в фигурные скобки, а "покрасили" только второй примитив, переместив директиву Red в соответствующее место и также заключив оба объекта в фигурные скобки.
(рис 6.20) Порядок применения графических директив к графическим примитивам
Что касается очерёдности изображений, вызываемых применением примитивов: сверху оказывается изображение того примитива, который указан в графической функции позже. На рис. 6.21 мы изобразили накладывающиеся друг на друга красный квадрат Red,Rectangle[{0,0},{2,2}] и зелёный круг Green,Disk[{2,1},1]. В примере In[1] последним мы указали примитив Disk[{2,1},1], потому круг оказался на переднем плане. В примере In[2] мы поменяли примитивы местами, поэтому на переднем плане оказался квадрат.
(рис 6.21) Порядок отображения примитивов на рисунке
Под графическими директивами понимаются выражения, влияющие на характеристики графических объектов.
Под графическими примитивами понимаются минимальные графические объекты, которые составляют рисунок.
В данной лекции мы познакомились с основными встроенными функциями Mathematica для визуализации зависимостей одной величины от другой. В частности мы научились строить графики непрерывных функций одной переменной, дискретных зависимостей одной величины от другой, мы научились визуализировать параметрические зависимости. Мы научились совмещать графики зависимостей, построенные различными способами, на одном рисунке. Мы познакомились с основными опциями графических функций и научились с их помощью изменять внешний вид рисунков. Мы познакомились с двумерными графическими примитивами, правилами их задания и применения. Мы познакомились с графическими директивами и научились применять их в сочетании с опциями графических функций и правилами задания примитивов для изменения внешнего вида изображений.
Joined и InterpolationOrder? Каким образом они задаются?RGBColor, Hue, Thickness, PointSize, Dashing? Какие аргументы они содержат?0 до 50. Перенесите пересечение координатных осей в точку с координатами (-2500,2500). Удалите с рисунка координатные оси и заключите изображение в рамку.0 до 10 с шагом 0.2 при помощи функции DiscretePlot.
Постройте такую же зависимость при помощи функции ListPlot. Для этого предварительно при помощи функции Table создайте список, содержащий значения переменной x и соответствующие им значения функции $$f(x)$$.
Задайте опции Joined, InterpolationOrder и Filling так, чтобы
Disk, создайте 7 вложенных кругов с одними координатами центра и радиусами от 1 до 7. Пользуясь соответствующими директивами, окрасьте их в цвета радуги.
(рис 6.22) Иллюстрация к упражнению 6.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.