0. Преамбула
Gnuplot умеет интерактивно строить графики, беря данные из файла, а также умеет эти графики пихать в файлы картинок любого формата ( особено png =) ). Так же он умеет строить сразу несколько графиков на одном полотне.
Файл данных графика можно формировать разными способами, однако удобнее всего для наших задач файл сформировать в следующем виде:
data.log
# index U[index] exact_U[index]
0 1.0 1.0
0.2 1.1 1.09
0.4 1.2 1.18
0.6 1.3 1.35
0.8 1.1 1.13
1 1.05 1.05
# end of log file
здесь:
- первый столбец - это координата x (может быть время, может быть x(наш случай))
- второй столбец - это значение нашего решения в точке x (в нашем случае T = 1)
- третий столбец - это значение данного точного решения в той же точке
- # - любая строка, начинающаяся с символа # - это комментарий. игнорируется gnuplot'ом при построении графиков
// желателно, чтобы в начальных и конечных точках точное и наше решения совпадали... не для gnuplot'a разумеется, а для сдачи задания :D
При построение графиков по данному файлу, мы получим два графика (по умолчанию один красный, другой зеленый) построенного по данным точкам, где по оси абцис будут отложены данные с первого столбца. Каждый график будет состоять из отрезков, соединяющие данные точки.
1. Подготовка данных
Пусть U - это массив значений приближенного решения на данном слое (в частности, в конце, перед выходом из программы U[j] = U(T, h*j))
Пусть exact_U(t, x) - это функция точного решения. Мы будем смотреть на значения exact_U(T, h*j).
Перед выходом из программы необходимо распечатать в файл следующие данные: x, U, exact_U.
На С++ это будет выглядеть так (не забудьте подключить fstream: #include <fstream>):
main.cpp
Итак, data.log - сгенерированный файл данных. Его надо положить рядом с файлом gnuplot.exe, чтобы его было проще вызывать.
2.Построение графиков
Запускаем командную строку, переходим в папку с gnuplot.exe и запускаем его:
пуск->выполнить->cmd.exe
> D:
> cd programs\gnuplot\
> gnuplot.exe
На что получаем приглашение gnuplot и его милое приветствие =)
gnuplot >
Далее все просто - просим построить графики:
gnuplot > plot 'data.log' u 1:2 w linesp, 'data.log' u 1:3 w linesp
Вот, собственно и все. Пояснение:
- plot - просим строить 2x-мерный график (можно и 3x-мерные строить с помощью splot)
- 'data.log' - файл с данными
- u 1:2 == usage 1:2 - строить график по точкам из первого и второго столбца, где первый столбец - OX, второй - OY
- w linesp == with linesp - точки графика соединять отрезками
В простейшем случае, если просто сказать:
gnuplot > plot 'data.log'
gnuplot будет откладывать все точки слева направо по принципу (i, y_i), где i - номер вхождения точки.
3. Управление интерактивной средой
В появившемся окошке с графиком можно пощелкать всякие кнопочки... авось что-нить случится. А именно:
- правая кнопка мыши - позволяет выделить фрагмент для увеличения
- кнопка "A" - позволяет вернуть график в исходное состояние
4. Рисуем в файл
Для того чтобы получить файл graph.png с графиком нужно выполнить следующие команды в gnuplot:
gnuplot > set terminal png size 1024, 768
gnuplot > set output 'graph.png'
gnuplot > plot 'data.log' u 1:2 w linesp, 'data.log' u 1:3 w linesp
и у вас в папке с gnuplot'ом появится файл graph.png с размером 1024x768. Его можно вставить в отчет. Будет круто)
5. Рисуем в 3D
Предположим мы хотим нарисовать функцию sin(x^2 + y^2)/(x^2 + y^2) (красивый график, похожий то, что произойдет после падения капли в воду).
В программе заводим массив a[N][N], программно вычисляем значение в точке (x, y), заносим это значение в a[i][j].
В конце записываем матрицу, как есть, в файл. Получаем нечто вроде:
matrix.dat
Просим gnuplot нарисовать картинку:
gnuplot > splot 'matrix.dat' matrix with lines
отрисовывать можно с разными параметрами, например:
- splot 'file' matrix with lines - соединять точки графика прямыми
- splot 'file' matrix with pm3d - соединять точки поверхностью (поверхность меняет цвет в зависимости от значения функции (линии уровня))
- set pm3d at b (s) - рисовать внизу (наверху) поверхность уровней
- unset pm3d - отменяет предыдущую команду
- set view a,b - показать график под углом a, b (нужно для красивой отрисовки картинок)
- set ticslevel 0 (1) - график центрирован по z (график приподнят (удобно использовать совместно с set pm3d at b)
- set palette defined ( z1 "color1", z2 "color 2", ...) - определять цвета линий уровня, чтобы сделать график красивым.
цвета можно посмотреть здесь
Что получилось, смотрим здесь: with lines with pm3d
Примеры и прочее см. 8. Ссылки
6. Автоматизация
Если хочеться мультика, то можно сделать такую штуку...
После каждой итерации выводим матрицу a в файл, генерируем скрипт для gnuplot, передаем ему управление
(временно усыпив программу, чтобы она не испортила файл данных). Потом открываем папку, где будут лежать
кучка кратинок: 1.png, 2.png, ...; открываем просмотрщик, жмем "-->" и наслаждаемся.
Кусок кода для Visual Studio:
main.cpp
Разумеется, пути к файлам надо поменять на правильные. Плюс, нужно дописать подходящие параметры для красивой отрисовки.
7. Помощь
В gnuplot есть интерактивная помощь. Ее всегда можно вызвать из командной строки gnuplot набрав help:
gnuplot > help
Там можно найти тьму интересных вещей =)
8. Ссылки
Сайт Gnuplot
Примеры использования gnuplot
Дополнительные трюки
Чей-то блог, с пояснениями по поводу pm3d
Gnuplot trics
Локальная копия стабильной версии gnuplot для windows (ver. 4.4.3)