1626435587-51311eae4652e8ad616b5bdef025cbb3 (844239), страница 5
Текст из файла (страница 5)
1 ( ) представлена гистограммаплотности стандартного нормального распределения, построенная9 повыборке размером 10 000 с помощью команд:гn=20; min=-3.2; max=3.2#количество каналов и диапазон по xcw=(max-min)/n#ширина одного канала гистограммыhist(x,width)=width*floor(x/width)+width/2.0plot "rnd.dat" u (hist($1,cw)):(1e-3) smooth freq w boxesДля построения гистограммы в примере выше была определена функция hist, задающая «ступенчатое» отображение своего первого аргумента. Ширина и высота «ступенек» равна значению переменной cw.Входные данные разбиваются функцией hist по каналам гистограммы,после чего вызывается команда построения графиков plot c опцией дополнительной обработки данных smooth в режиме frequency. В этомрежиме функция plot отображает одинаковые значения из входногопотока в виде одной точки, -координата которой равна сумме значений соответствующих точек из входного потока.
Для построения плотности вероятности по выборке -координаты всех точек должны бытьодинаковы (в данном примере они равны 10−3 ), а -координаты точекПри этом положение самой рамки может меняться в зависимости от наличияподписейосей, штрихов, а также под действием команд set size и set origin.9 Для генерации случайной величины ∼ Φ0,1 в gnuplot использовалось преобразование Бокса — Мюллера; равномерно распределенная на отрезке [0, 1] случайнаявеличина генерировалась с помощью функции rand(0).821должны принимать относительно небольшое число возможных значений за счёт группировки близких точек в каналы гистограммы, что идостигается в примере выше указанием using (hist($1,cw)):(1e-3).1.4.
Графики функций двух переменныхДля построения графиков функций двух переменных в gnuplotпредусмотрена команда splot10 . Её синтаксис в целом аналогиченplot, основное отличие состоит в формате файлов с данными. Наиболее простое решение — формировать строки вида 1 . . . ,вставляя по одной пустой строке между данными, соответствующимиразличным значениям . В качестве примера приведём код программына языке Си для записи таблицы аналитичекого решения одномерногоуравнения теплопроводности ( −2 )(, ) = 0 с начальным условием(, 0) = ():#include <stdio.h>#include <stdlib.h>#define _USE_MATH_DEFINES //для использов. M_PI в Microsoft VC#include <math.h>//функция Грина 2 рода одномерного уравнения теплопроводности:double G(double x, double t){return exp(-x*x/(4*t))/sqrt(4*M_PI*t);}int main(void){int i, j, N=50; //i,j - счётчики, N - число точек в таблицеdouble t, x, t0=0.5, dt=0.05, dx=0.2; //шаг сетки по t и xFILE *fd = fopen("solution.dat", "wb");if(fd == NULL) //если не удалось открыть файл, завершаем >>exit(1);//выполнение программы с кодом ошибки 1for(i = 0; i < N; ++i) { //цикл перебора узлов сетки t_i//вложенный цикл - перебор узлов x_j, запись данных:for(j=0, t=t0+i*dt; j<N; ++j) {x = (j-N/2.)*dx;fprintf(fd, "%12.5e %12.5e %12.5e\n", t, x, G(x,t));}10Сокращение от surface plot.22//пустая строка, разделяющая различные сечения t:fputs("\n", fd);}}fclose(fd);return 0;//закрываем файл//возвращаем код успешного завершенияСкомпилируем и запустим программу, наберём в gnuplot командуsplot "solution.dat" using 1:2:3 with pm3d, в результате чего получим график функции (, ) в виде цветной поверхности11 .
Отображение множества значений математической функции на цвета называется(palette) и может быть изменено с помощью командыset palette с соответствующими опциями. Например, для выбора серой градиентной палитры можно скомандовать:палитройset palette defined ( 0 "black", 1 "white" )Палитра, приблизительно соответствующая палитре MATLAB по умолчанию:set pal defined (1 ’#00008f’, 8 ’#0000ff’, 24 ’#00ffff’, \40 ’#ffff00’, 56 ’#ff0000’, 64 ’#800000’)Для построения поверхности (, ) одним цветом вместо pm3dможно использовать построение с помощью линий (with lines). Чтобы сделать поверхность непрозрачной, необходимо скомандовать sethidden3d.
По умолчанию поверхность графика будет приподнята надплоскостью ; чтобы это исправить, воспользуемся командой setxyplane relative 0.Угловые координаты наблюдателя и масштабные коэффициентыпри построении поверхностей можно изменить с помощью команды setview. Команда set view map переводит gnuplot в режим отображенияграфиков в виде плоской двумерной карты, на которой значения функции отображаются цветом.
Чтобы показать линии уровня на графике,используется команда set contour.Если добавлять в файл не по одной, а по две пустых строки между сечениями по времени, можно построить зависимости от координаты x, нарисованные отдельными линиями. Для этого нужно скомандовать splot "solution.dat" using 1:2:3 with lines. При этом можно строить сечения не для всех моментов времени t, сохранённых вфайле, а указать требуемые с помощью ключевого слова index либоего лаконичной формы i.11 pm3d— сокращение от palette-mapped 3d.231.5.
Сохранение графических файловДля сохранения построенных с помощью gnuplot графиков в файлможно использовать кнопку слева на панели инструментов. Полученное таким способом изображение можно быстро отправить по электронной почте или вставить на веб-страницу, тогда как для подготовки печатных документов его использовать не следует ввиду низкогоразрешения — в этом случае более подходящими являются векторныеформаты графических файлов, в которых рисунок сохраняется в виденабора линий и других графических объектов, что позволяет получатьчёткие высококачественные изображения любого размера.Рассмотрим сохранение графиков на примере формата EMF, подходящего для последующей вставки рисунков в приложения MS Office:#изменяем терминал вывода:set terminal emf enhanced lw 4 size 1024,960 font "Arial,24"set output ’figure.emf’ #перенаправляем вывод gnuplot в файлplot sin(x)#строим графикset output#восстанавливаем вывод в STDOUTset term wxt#восстанавливаем исходный терминалимя-терминалаКоманда set terminal(краткая форма set term) изменяет терминал, используемый для построенияграфиков.
Терминалы gnuplot, подобно физическим устройствам, отличаются друг от друга набором возможностей для построения графиков (палитрами, возможностями использования различных шрифтов иширин линий). В частности, gnuplot поддерживает терминалы для построения графиков в форматах png, emf, pdf, LATEXи даже для формирования интерактивных иллюстраций для html-страниц (canvas).
Полный список поддерживаемых терминалов можно посмотреть в справкеgnuplot (help terminal), либо набрав set terminal без параметров.При выборе терминала можно указать опции (в примере выше мы увеличили базовую ширину линий до 4, установили размер изображения1024 × 960 отн.ед. и выбрали шрифт семейства Arial, кегль 24).Команда set output ’’ открывает графический файл иперенаправляет туда вывод из терминала. Чтобы посмотреть построенный график, может потребоваться вначале закрыть файл, для чегонужно отдать ещё одну команду set output, указав в качестве параметра имя нового файла для построения следующего графика либовызвав set output без параметра как в приведённом выше примере.
Вэтом случае вывод будет направлен в стандартный поток (stdout).имя-терминалаимя файла241.6. Пакетное построение графиков. ЦиклыОчень часто при решении научных и инженерных задач приходится выполнять большое количество однотипных численных расчётов дляисследования зависимости результатов от параметров исследуемых физических систем, что сопряжено с построением большого количестваоднотипных графиков. Gnuplot позволяет автоматизировать этот процесс — помимо рассмотренного выше интерактивного режима работы,когда отдельные команды вручную вводятся пользователем в консолиgnuplot, предусмотрен также пакетный режим работы. Для этого нужно создать текстовый файл, содержащий набор команд gnuplot, назовёмего sample.txt:# построение графиков в пакетном режимеset terminal png size 320,240set output "sample.png"set xlabel "x" ; set ylabel "y" ; set title "sample plot"set xrange [-pi:pi] ; set yrange [*:1.1]plot sin(x), cos(x)*exp(-x*x)set output#восстанавливаем вывод в STDOUTset term pop#восстанавливаем исходный терминалДля того, чтобы «запустить» написанную для gnuplot программу, нужно либо передать gnuplot командный файл при запуске12 , либо набратьв консоли gnuplot команду load "sample.txt".
Первый способ позволяет быстро строить большое количество графиков с использованиемскриптов оболочки операционной системы. Вместо созданного вручнуюкомандного файла часто бывает удобно использовать выходной потоктакого скрипта, перенаправленный на вход gnuplot. Однако прежде чемпереходить к автоматизации, вначале рекомендуем хорошо освоить работу в «ручном» режиме.В наиболее простых случаях автоматизацию можно выполнитьсредствами gnuplot, не прибегая к скриптам оболочки. При этом оказываются полезными условный оператор if { ... } else { ...
} ициклы for, которые могут быть использованы совместно с командамиplot, splot, set и unset. Цикл for позволяет вести перебор по строкамfor [filename in "A B C D"] либо по целым числам:set logscale xy ; set key left bottomset xrange [1:3] ; set ytics format "10^{%T}"plot for[n=2:10:2] x**(-n) t sprintf("x^{%d}",n)Под Windows:или12wgnuplot sample.txtpgnuplot < sample.txtsample.txt | gnuplotgnuplot < sample.txtили25.; под Linux: catФункция sprintf позволяет сформировать текстовую строку, содержащую значения переменных, и использовать её в качестве имени файла,подписей на легенде, осях, метках и т. п. Синтаксис sprintf в gnuplotочень близок к синтаксису одноимённой функции в языке Си.Выполнение блока произвольных команд в цикле может быть реализовано с помощью do for [] {} либо конструкции while() {}. Циклы могут быть вложенными:выражениеобластькомандыкомандыset for [i=1:9] for [j=1:9] label i*10+j \sprintf("%d",i*10+j) at i,jВ некоторых случаях для организации циклов удобно использовать команду reread внутри командного файла для повторного выполнениякоманд с начала файла.
Для суммирования конечного числа членовпоследовательности или ряда предусмотрена специальная команда sum(см. help summation).Таким образом, в данной главе были кратко рассмотрены основныевозможности программы gnuplot, и даны сведения, необходимые дляначала работы. Более подробную информацию легко найти в документации и многочисленных блогах, форумах, списках F.A.Q. и HowTo,посвящённых gnuplot. Большое количество полезных примеров от базовых до нетривиальных можно найти в замечательно иллюстрированной книге [A3].
Желающим более полно и систематически изучитьвозможности программы можно рекомендовать [A4].Упражнения1. Напишите программу, сохраняющую в текстовый файл с двумя столбцами таблицу значений гауссовской функции. Запуститепрограмму, постройте график функции в gnuplot.262. Выполните упражнение 1, сформировав файл с данными средствами gnuplot.3. Постройте график функций Бесселя 0 () и 1 () нулевого и первого порядков (besj0 и besj1) на интервале от −20 до +20.4. Постройте график зависимости разности функции √︀Бесселя 1первогопорядка(besj1)иеёасимптотики()∼2/() ×1(︀)︀× cos − 43 на интервале от 1 до +100 в логарифмическом масштабе.