Maxima graph

Материал из ALT Linux Wiki
Перейти к: навигация, поиск

Журнал ALT-review

Статья-шпаргалка по построению 2D графиков в системе компьютерной математики wxMaxima
ALT-review logo.png
В этой заметке кратко описано построение простых двумерных графиков при помощи системы компьютерной алгебры Maxima

Автор: And   Раздел: практика   Выпуск: 01   


Основу системы образуют три стандартные программы:

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

Рассмотрим как с ними работать.

Запуск ядра из командной строки

Программа maxima, запущенная из терминала, не поддерживает редактирование набранных команд и прокрутку истории, как, например, интерпретатор bash или python. Для удобства использования следует вызывать её в readline-обёртке: rlwrap maxima. Обёртка rlwrap запускает maxima как дочерний процесс, фильтрует ввод-вывод и перенаправляет сигналы, реализуя недостающую функциональность.

Команды построения графиков

Построение графиков осуществляет команда 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А. По умолчанию цвета графиков из списка функций следующие:

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"]);

Результат показан на Рис. 1Б.

Рис. 1А
Рис. 1Б


Кусочно-линейная функция может быть задана при помощи оператора if then else вида:

if условие1 then выражение1 else выражение2.

Например, построим графики функций Maxima graph func.png и g(x)=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]);

Результат показан на Рис.2А.

Функция, заданная параметрически, строится при помощи опции parametric.

Построим фигуру Лиссажу внутри окружности.

  • Уравнение окружности x=5*cos(t), y=5*sin(t);
  • Уравнение фигуры x=3*cos(4t), y=3*sin(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"]) $

Результат показан на Рис.2Б. Здесь использованы две необязательные опции. Первая — nticks, которая задает число точек графика, и вторая опция программы gnuplot — set size ratio 1, устанавливающая одинаковые масштабы по осям графика (в противном случае вместо окружности рисуется эллипс).

Рис. 2А
Рис. 2Б


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

Для вывода дискретных данных служит опция 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"]);
Maxima graph05.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 не может отобразить русские литеры, так как не находит шрифт Arial. Для устранения последней проблемы надо установить в систему шрифты Microsoft, скомандовав в консоли (от имени root): apt-get install fonts-ttf-ms.

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

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)"])$
Maxima graph06.png

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

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

Cиний Красный Зеленый Пурпурный Черный Голубой
blue red green magenta black cyan
1 2 3 4 5 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,ν).

Согласно формуле Планка:

Plank.png

где T — температура, ν — частота, с — скорость света, 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));

(%2)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 'Испускательная способность абсолютно черного тела';" ]);
Maxima graph07.png

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

Литература

  1. Е.А. Чичкарев. Компьютерная математика с Maxima. Руководство для школьников и студентов. http://www.altlinux.org/Books:Maxima
  1. Записки Дебианщика. http://mydebianblog.blogspot.ru/search/label/гнуплот
 
Факты: Maxima graph
AnnotationВ этой заметке кратко описано построение простых двумерных графиков при помощи системы компьютерной алгебры Maxima +
AuthorAnd +
Issue01 +
Sectionпрактика +
TitleСтатья-шпаргалка по построению 2D графиков в системе компьютерной математики wxMaxima +