ГлавнаяСтатьиСПО и программирование → Построение 2D графиков в wxMaxima на примерах

Построение 2D графиков в wxMaxima на примерах

24 января 2013 года
Ключевые слова: wxMaxima , Linux


В этой заметке кратко описано построение простых 2-мерных графиков при помощи свободной системы компьютерной алгебры Maxima [1].

Основу системы образуют три стандартные программы: maxima — математическое ядро с интерфейсом командной строки; wxMaxima — графический интерфейс пользователя и gnuplot — мощная утилита для построения научных графиков.

Построение графиков осуществляет команда plot2d с аргументами в виде списков функций, координат и необязательных опций построения:

plot2d ( [ f1 , f2] , [ x , xmin , xmax ] , [y , ymin , ymax] , [ опция 1 ] , [ опция 2 ], [ и т.д.] )

График выводится новом окне средствами утилиты gnuplot. Чтобы построить нескольких графиков внутри документа wxMaxima служит другая команда wxplot2d с теми же опциями.
Функции f могут быть:
- явными выражениями вида f(x);
- зависящими от параметра вида [ parametric , x(t) , y(t) , [t, tmin, tmax] ];
- дискретным набором точек [ discrete , point_list ]

Виды функций и примеры их графиков.

Явная функция в прямоугольных координатах.

Нарисуем графики функций десятичного логарифма, косинуса, тангенса и кубического корня на отрезке от 0 до 2,5π:

(%i1)
/* Определим десятичный логарифм через натуральный */
log10(x) := log(x)/log(10) $

(%i2)
/* Строим графики */
plot2d( [ log10(x) , cos(x) , tan(x) , x^(1/3) ] , [ x , 0 , 2.5*%pi ] , [ y , -2, 3 ] ) $

По умолчанию цвета графиков из списка функций следующие: 1 - синий (blue), 2 - красный (red), 3 - зеленый (green), 4 - пурпурный (magenta), 5 - черный(black), 6 - голубой (cyan). При большем числе графиков их цвета циклически повторяются.

Явная функция в полярных координатах.

Для построения надо определить связь между полярными радиусом r и углом φ и использовать опцию gnuplot set polar:
(%i1)
r(ph) := sin(4*ph);

(%i2)
plot2d( [ r(ph) ] , [ ph , 0 , 2*%pi ] , [ x , -1 , 1 ] , [ y , -1 , 1 ] , [ gnuplot_preamble , "set polar" ] );


Кусочно-линейная функция

Может быть задана при помощи оператора if then else вида:
if условие1 then выражение1 else выражение2

Например построим графики функции $$y= \begin{cases} 8,(x<-2)\\ -x^3,(-2 \leq x<0)\\ x^3,(x \geq 2) \end{cases} $$
и функции $$sin(5x)-1$$ :

(%i1)
f(x) := if x<-2 then 8
else if x<0 then -x^3
else x^3 $

g: sin(5*x)-1 $
plot2d( [ g , f ] , [ x , -5 , 2 ] , [ y , -3 , 10 ] );

Функция заданная параметрически

Cтроится при помощи опции parametric. Построим фигуру Лиссажу внутри окружности. Уравнение окружности $$x=5cos(t) , y=5sin(t)$$
Уравнение фигуры $$x=3cos(4t) , y=3sin(3t) $$

(%i1)
plot2d( [
[ parametric , 3*cos(4*t) , 3*sin(3*t) , [ t , -10 , 10 ] , [ nticks , 300 ] ],
[ parametric , 5*cos(t) , 5*sin(t) , [ t , -%pi , %pi ] ]
] ,
[ x , -8 , 8 ] , [ y , -8 , 8 ] , [ gnuplot_preamble , "set size ratio 1" ] ) $

Здесь использованы две необязательные опции. Первая - nticks задает число точек графика. Опция программы gnuplot set size ratio 1 устанавливает одинаковые масштабы по осям графика, в противном случае вместо окружности рисуется эллипс.

Дискретные функции.

Для вывода дискретных данных служит опция discrete. Данные можно задавать либо в виде 2-х отдельных списков аргументов [ xi ] и значений [ yi ] , либо в виде вложенного списка с координатами точек [ xi , yi ]

(%i1)
xlist : [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] $
ylist : [ 0 , 2 , 2.6 , 3 , 2.5 , 2 , 1.8 ] $
xy : [ [ 1 , -1 ] , [ 2 , 1 ] , [ 3 , 1.6 ], [ 4 , 2 ] , [ 5 , 1.5 ] , [ 6 , 1 ] , [ 7 , 0.8 ] ] $

(%i2)
plot2d( [ [ discrete , xlist , ylist ] , [ discrete , xy ] ] , [ style , points , linespoints ] ,
[ gnuplot_term , "png size 300 , 200" ] , [ gnuplot_out_file , "data.png" ] );

Опция style выбирает строить ли графики в виде линий, точек или линий с точками. Опция gnuplot_term с выбранными параметрами сохраняет изображение в графическеский файл формата png размером 300 на 200 пикселов, gnuplot_out_file задает имя файла.

Чтение и запись данных в файл.

Для записи списка данных в файл служит функция write_data(список, ''адрес'', разделитель). Разделителем может быть запятая - comma, вертикальная черта - pipe , точка с запятой - semicolon и пробел space (он принят по умолчанию).
Например команда write_data(xy,"./data.txt") запишет список координат точек разделенных пробелами в текстовый файл с именем data.txt в текущий каталог.

Чтобы получить данные служит функция read_nested_list(''адрес'', разделитель) Она читает файл как список вложенных списков, образованных элементами очередной строки. Простой список создается командой read_list.
(%i3)
data : read_nested_list("./data.txt");
[ [ 1 , -1] , [ 2 , 1 ] , [ 3 , 1.6 ] , [ 4 , 2 ] , [ 5 , 1.5 ] , [ 6 , 1 ] , [ 7 , 0.8] ]
(%i4)
single : read_list("./data.txt");
[ 1 , -1 , 2 , 1 , 3 , 1.6 , 4 , 2 , 5 , 1.5 , 6,1 , 7 , 0.8 ]

Заметим, что если указать формат файла csv (стандартный формат принятый для числовых данных) то разделителем по умолчанию станет запятая а не пробел.

Запись графика в файл.

Для этого надо указать тип графического терминала [gnuplot_term, тип ] и имя выходного фала [gnuplot_out_file , " имя"]. Тип может быть либо ps (формат post script) либо один из графических форматов png, jpg и т. п. Если не указывать имя выходного файла то будет применено стандартное имя maxplot.

[ gnuplot_term , ps ] , [ gnuplot_out_file , "data.eps" ] — выводит изображение в формате post script в файл data.eps

[ gnuplot_term , jpg ] — сохраняет изображение стандартного размера в файл с именем maxplot.jpg

[ gnuplot_term , "gif size 400 , 400" ], [ gnuplot_out_file , "data.gif" ] — создает gif файл размером 400 на 400 пискселей.

Опции оформления.

Надписи и заголовки.

Название графика задается командой gnuplot внутри опции gnupot_preamble. Команды gnuplot пишутся внутри общих кавычек и отделяются друг от друга точкой с запятой [ gnuplot_preamble , " set title 'имя графика' ; " ]

Названия осей [ xlabel , "имя для оси x" ] , [ ylabel , "имя для оси у" ]

Подписи кривых (легенда ) [ legend , "кривая 1" , "кривая 2","и т. д." ]

Легенда выводятся в правом верхнем углу, изменить ее положение можно командой gnuplot set key:

set key bottom — внизу
set key top left — вверху слева
set key bottom center outside — внизу по центру за пределами графика

Пара замечаний о выводе русских надписей при работе wxMaxima в ALT Linux. Кириллические буквы в легенде значительно увеличивают ее размеры, а команда wxplot2d Maxima не находит шрифт Arial и не отображает русские буквы. Для устранения последней проблемы надо установить в систему шрифты Microsoft, скомандовав в консоли (от имени root) apt-get install fonts-ttf-ms.

Шкалы и линии сетки

Их можно менять при помощи следующих команд gnuplot [2]:

set grid — отображает сетку
set grid polar df — задает радиальную сетку в полярной системе координат, df угол между ее линиями в радианах
set xtics dx ; set ytics dy — указание шага между основными линиями сетки (по x шаг=dx, по y шаг=dy
set border 3 ; set xtics nomirror — убирает отражение оси х сверху
set mxtics n — разбивает основные деления шкалы по оси х на n интервалов
set size ratio m — рисует размер оси y в m раз больше размера оси х
set log x ; set log y — отображает шкалы на оси координат в логарифмическом масштабе

Пример. Построим графики некоторых специальных функций — интегрального косинуса Ci(x), интегрального синуса Si(x), функции ошибок erf(x) и дополнительной функции ошибок erfc(x)

(%i1)
plot2d( [ expintegral_ci(x) , expintegral_si(x) , erf(x) , erfc(x) ] , [ x , -6 , 6 ] , [ y , -3 , 3 ],
[ gnuplot_preamble , " set grid ; set title 'Графики специальных функций' ;
set key bottom ; set border 3 ; set xtics nomirror ; set ytics nomirror ; set mxtics 2 ; " ] ,
[ xlabel , "Аргумент x" ] , [ ylabel , "Значения y" ],
[ legend , "Ci(x)" , "Si(x)" , "erf(x)" , "erfc(x)" ] )$


Стили графиков.

Кривые можно строить в виде линий lines, линий с точками linespoints и точек points. Цвета могут задаваться словесно или кодом:

Синий - blue или 1
Красный - red или 2
Зеленый - green или 3
Пурпурный - magenta или 4
Черный - black или 5
Голубой - cyan или 6

Тип точек также может задаваться словесно или кодом:

+

X

*

bullet

circle

plus

times

asterisk

box

square

triangle

delta

wedge

nabla

diamond

lozenge

1

2

3

4

5

6

7

8

9

10

11

12

13

Стиль кривой можно задавать словесно через последовательность опций color, style, point_type
Например: [ color , red , black ] , [ style , lines, points ] , [ point_type , plus ]

Либо кратко при помощи кодовых параметров.

Линии имеют 2 параметра — толщина, цвет.
Точки 3 параметра — размер, цвет, тип точки.
У линий с точками 4 параметра — толщина линии, размер точки, цвет, тип точки

Тот же пример: [ style , [ lines , 1 , 2 ] , [ points , 3, 5, 3 ] ]

Сглаживание графиков.

При построении графиков в виде линий с точками метки часто расположены слишком густо и кривые получаются «мохнатыми».Это можно исправить подобрав параметры nticks (задает начальное число точек) и adapt_depth (число проходов алгоритма сглаживания) Для примера нарисуем график испускательной способности (мощности излучаемой единицей поверхности в единичном частотном интервале) абсолютно черного тела $$r(T,\nu)$$
Согласно формуле Планка: $$r(T,\nu)=\frac{2 \pi {\nu}^2} { c^2} \frac{h \nu}{exp(hv/KT)-1} $$
где T - температура, $$\nu$$- частота, с - скорость света, h - постоянная Планка, k - постоянная Больцмана

(%i1) /* Физические константы и формула*/
k : 1.38e-23 $ h : 6.6e-34 $ c : 3e8 $

r(T,v) := 2*%pi*h*v^3/(c^2*(exp(h*v/(k*T))-1));

(%i2)
plot2d( [ r(3e2,v) , r(1e3,v) , r(6e3,v) ],[ v , 1e12 , 1e16 ] , [ y , 1e-15 , 1e-6 ] ,
[ xlabel , "Частота , Гц" ] , [ ylabel , "r(T,v) , Дж/м^2 " ] ,
[ legend , "T=300K" , " T=1000K"," T=6000K" ] ,
[ color , black ] , [ style , linespoints ] , [ point_type , bullet , circle , plus ] , [ nticks , 50 ] , [ adapt_depth , 2 ] ,
[ gnuplot_preamble , " set log x ; set log y ; set mxtics 10 ; set grid ; set key left ; set title 'Испускательная способность абсолютно черного тела' " ] );

По возможности следует избегать расчетов и построений с очень большими или малыми величинами. В противном случае могут возникнуть проблемы с переполнением разрядов. Если в данном примере задать логарифмический масштаб не через опции gnuplot, а напрямую, как [ logx ] , [ logy ], то Maxima откажется строить график вследствие ошибки переполнения.

Дополнительные возможности оформления

Команды plot2d и wxplot2d используют лишь минимум возможностей gnuplot. Альтернативные команды draw2d и wxdraw2d более гибкие. Некоторые из их опций приведены в списке:

color = "red" — цвет последующих элементов будет красный вплоть до новой команды color
grid = true — показывать сетку
xtics = none , ytics = none — не показывать метки на осях

vector( [ x , y ] , [ dx , dy ] ) — рисует вектор из заданной точки x, y
head_length = a — задает длину стрелки равную a
head_angle = 30 — задает угол стрелки 30 градусов (по умолчанию 45)
head_both = true — задает стрелки на обоих концах вектора

explicit ( f(x) , x , min , max ) — строит график функции в области определения min, max
xrange = [ xmin , xmax ] , yrange = [ ymin , ymax ] — задает границы осей

Чтобы убрать рамку вокруг графика и построить нулевые оси координат используют команду:
user_preamble = " set border 0 ; set zeroaxis lt -1 "     В ней тип линии lt -1 соответствует тонким линиям черного цвета.

Пример 1. Построение графика синуса с центрированными осями координат и координатной сеткой

(%i1)
load(draw)$
(%i2)
wxdraw2d( xlabel = "x" , ylabel = "y" , grid = true ,
user_preamble = " set border 0 ; set zeroaxis lt -1 ; set xtics axis 1 ; set ytics axis 0.5 ",
explicit( sin(x) , x , -%pi , %pi ) , color = "red" ,
head_length = 0.2 , head_angle = 30 , head_both = true , vector( [ 1 , 0.5 ] , [ 1 , 0 ] ),
color = "black" , label( ["y = sin(x)", 1.55, 0.7] ));

Пример 2. Png иллюстрация размером 300 на 200 пикселей

(%i1)
load(draw)$
(%i2)
draw2d(terminal = pngcairo , dimensions = [300, 200] , font="Arial" , font_size = 10 ,
xtics = none , ytics = none ,
color = "red" , line_width = 2 ,
user_preamble = " set border 0 ; set zeroaxis lt -1 ",
explicit( (1 + signum(x))/2*x , x , -1 , 1) ,
xrange = [ -1.2 , 1.2 ] , yrange = [ -1.2 , 1.2 ],
title = "ВАХ идеального диода");

После выполнения этой команды в домашнем каталоге /home/user появится файл с именем maxima_out.png

Литература.

  1. Е.А. Чичкарев. Компьютерная математика с Maxima. Руководство для школьников и студентов. http://www.altlinux.org/Books:Maxima
  2. Записки Дебианщика. http://mydebianblog.blogspot.ru/search/label/гнуплот

Оставьте свой комментарий

Ваше имя:

Комментарий:

Формулы на латехе: $$f(x) = x^2-\sqrt{x}$$ превратится в $$f(x) = x^2-\sqrt{x}$$.
Для выделения используйте следующий код: [i]курсив[/i], [b]жирный[/b].
Цитату оформляйте так: [q = имя автора]цитата[/q] или [q]еще цитата[/q].
Ссылку начните с http://. Других команд или HTML-тегов здесь нет.

Сколько будет 38+1?