GNUPLOT

-не так Часто Задаваемые Вопросы-

обновлено 2010/12/26

Разное (No.1)

1 | 2 | 3 | 4

Тройной оператор (A ? B : C)

Тройной оператор работает так же как и в языке C. Тройной оператор объявляется A ? B : C. Сначала, оценивается A, если оно истинно (не равно нулю) выполняется B; в противном случае выполняется C. Следующий пример представляет график, изменяющийся при x=0, y=exp(-x) для x>0, и y=exp(4*x) для x<=0.

gnuplot> set xrange [-5:5]
gnuplot> plot x>0 ? exp(-x) : exp(4*x) 
fig/sample9.1

Более сложные функции могут быть более определяемы этими тремя операторами. В данном примере определяется пользовательская функция, значения которой изменяются скачком наряду со значениями X.

gnuplot> f(x)= (abs(x)<1) ? 100 : ( (abs(x)<2) ? 50 : ((abs(x)<3) ? 20: 10 )) 
gnuplot> set xrange [-5:5]
gnuplot> set yrange [0:150]
gnuplot> set sample 1000
gnuplot> plot f(x)
fig/sample9.1b

TЗначение функцции приобретает значение 100, если значение меньше X, 1,50 для 1<=|X|<2, 20 для 2<=|X|<3 в противном случае 10. Значения Y не непрерывны между этими регионами X, но Gnuplot соединяет эти дискретные значения Y линией. Команда set sample делает эти "соединенные части" вертикальными, насколько это возможно.

up

Разрыв функции

Gnuplot игнорирует любые неопределенные математические выражения, как деление на ноль (/0), описанное в gnuplot FAQ. При этом, благодаря тройному оператору, есть возможность построения разрывов функции.

gnuplot> f(x) = (abs(x)>pi/2) ? sin(x+pi/2) : 0
gnuplot> g(x) = (abs(x)>pi/2) ? sin(x) : 1/0
gnuplot> set xrange [-2*pi:2*pi]
gnuplot> set yrange [-1:1]
gnuplot> plot g(x) w l lw 2,f(x)
fig/sample9.1c

Сравниваются две синус функции, f(x) и g(x). f(x) нулевая, когда |x| меньше 90 градусов, в то время как g(x) имеет особое выражение, большее нуля. Функция f(x) немного сдвинута, чтобы было видно разницу между двумя тригонометрическими функциями.

up

Цикл

Gnuplot имеет команды reread и if, благодаря которым можно легко задать цикл. Команда reread заново перечитывает файл. Когда gnuplot находит эту команду в контрольном файле, включается бесконечный цикл. Для завершения цикла используется команда if , позволяющий определить число повторений.

Создадим простое анимационное 3D построение. Зададим именение угла обзора от 0 до 360 с шагом в 5 градусов. Сначала создадим файл "loop.plt", содержащий в себе функцию фигуры z=exp(-x*x)*erf(y).

theta = theta + 10
set view 60, theta
splot exp(-x*x)*erf(y)
if(theta<360) reread

Начальное значение theta и другие параметры приведены вне файла 'loop.plt'. Бесконечный цикл начинается, когда gnuplot читает команду load "loot.plt" Есть возможность создать анимированный GIF с помощью некоторых инструментов, но обычно за это нужно заплатить :-p

gnuplot> set nokey
gnuplot> set noxtics 
gnuplot> set noytics 
gnuplot> set noztics 
gnuplot> set border 0
gnuplot> set isosamples 40, 40
gnuplot> set hidden3d
gnuplot> set xrange [ -5 : 5 ]
gnuplot> set yrange [ -5 : 5 ]
gnuplot> theta = 5
gnuplot> load "loop.plt"
up