Gnuplot установить ссылку и установить нелинейный - PullRequest
0 голосов
/ 31 августа 2018

Может кто-нибудь более подробно рассказать о функциях set nonlinear и set link. Документация слишком краткая по этим темам. В частности, для set link, почему необходимо прописать обратное преобразование? (это просто потому, что у gnuplot нет возможности определить обратное преобразование или есть более глубокая причина?) Что если в качестве обратного я предоставлю совершенно другую функцию (не являясь обратной)?

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

set xrange [0:5]
set link x2 via x**2 inverse sqrt(x)
plot x**2 axes x2y1
plot x**2 axes x1y1
plot sqrt(x) axes x2y1

Это возвращает меня к вопросу, какова цель инверсии в спецификации ссылок.

Теперь вернемся к set nonlinear, документация гласит: «Координаты вдоль видимой оси отображаются путем применения g (x) к координатам скрытой оси. F (x) отображает координаты видимой оси обратно на скрытую линейную ось». Я не понимаю, что такое скрытая ось и что такое линейная ось. Пример set nonlinear x via log10(x) inverse 10**x имеет смысл для меня, но не в контексте терминов, используемых в документации (я понимаю преобразование, но я не знаю, какую роль здесь играет скрытая ось, также нет необходимости в обратном в такой преобразование).

Самый интересный пример - это тот, у которого ломаная ось:

f(x) = (x <= 100) ? x : (x < 500) ? NaN : x-390
g(x) = (x <= 100) ? x : x+390
set xrange [0:1000] noextend
set nonlinear x via f(x) inverse g(x)
set xtics add (100,500)
plot sample [x=1:100] x, [x=500:1000] x

Но я его совсем не понимаю (я понимаю определение функции, но не в контексте функции nonlinear). Возможно, было бы наиболее полезно объяснить в этом примере set nonlinear и номенклатуру скрытых осей.

Реакция на ответ:

Допустим, сначала я хочу построить функцию f(x). Пусть v(x) будет отображением от линейной оси до видимой: v:L->V и l(x) будут инверсией, то есть l:V->L (L, вероятно, должно соответствовать xrange в gnuplot). Из ответа я не понял, как рассчитывается f(x). Если f(x): X->R (это отображение из некоторого подмножества вещественных чисел в действительные числа), откуда X происходит из-под этих сопоставлений. Обычно (без связей или нелинейных осей) (и считается, что L=V, v и l являются картами тождеств), ось Y будет содержать числа {y=f(x), так что x находится в V}.

Это становится немного запутанным в нелинейном случае, другими словами, x приходят из L или V пространства, или x в y = f(x) из набора чисел уже преобразованная ось X, которая в действительности будет f(v(x)), где x взяты из набора xrange в gnuplot (или пробел L), или это действительно f(x), где x от L или это f(l(x)), где x снова взяты из преобразованной оси X, которая на самом деле снова f(l(v(x))) x из пространства L или xrange? Кроме того, это будет отличие от set link, которое действительно не может повлиять на способ вычисления f(x). (Интересно, что при построении данных ситуация, вероятно, должна быть больше похожа на set link, поскольку нет функции для преобразования.)

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Предлагаю подумать об этом по-другому.

Предположим, что вы чертили функцию f (x) вручную на полулоговой миллиметровке. Вы ищите или вычисляете значение f (5) и идете, чтобы отметить его на бумаге. Где "5"? В этой статье вы найдете заранее нарисованные серии вертикальных линий, по которым вы можете считать, пока не дойдете до той, которая соответствует «5», а затем вы будете двигаться вертикально вдоль этой линии, пока не доберетесь до y = f (5) и не разместите твоя точка Это в точности аналогично тому, что делает gnuplot. Функция отображения "via" определяет, куда идут вертикальные линии сетки. Затем вы говорите ему построить f (x_i) для некоторого набора входных значений x_i. Для каждого x_i он должен решить, где на странице нарисовать точку. Он использует функцию «via» для определения горизонтального положения, а вертикальное положение исходит от f (x_i) независимо от того, где это горизонтальное положение выходит.

Обратная функция необходима для интерпретации графика, а не для рисования графика. Если вы поместите мышь над той же нанесенной точкой f (x_i), как она узнает, какое значение x нужно сообщить? Нужно взять истинную (видимую) горизонтальную позицию v_i и вычислить обратно, какое значение x_i получилось бы через (x_i) = v_i. Для этого он использует обратную функцию x_i = inv (v_i), чтобы он мог сообщать положение мыши в той же системе координат, что и исходные данные.

0 голосов
/ 02 сентября 2018

Невозможно отформатировать команды в комментарии, поэтому здесь идет еще один ответ: Возможно, этот сюжет прояснит. Это построено с использованием версии gnuplot_5.2.4

set link x2 via x**2 inv sqrt(x)
f(x)=x
plot [1:5] f(x) axes x1y1, [1:5] f(x) axes x2y1

enter image description here

0 голосов
/ 31 августа 2018

1) Почему для set link необходимо предоставить обратную функцию? Вы не Если вы просто хотите, чтобы x1 и x2 (или y1 и y1) действовали одинаково, то достаточно сказать set link x2 или set link y2 без функций прямого или обратного преобразования.

2) Однако, если вы хотите связать x1 и x2 через функцию, вам необходимо предоставить как прямую, так и обратную функции. Проще всего думать об этом как об описании меток оси. Если вы скажете

set tics nomirror
set x2tics
set link x2 via x**2 inv sqrt(x)
f(x) = x 
plot f(x)

Вы увидите, что для любой данной точки вдоль линии координата x1 будет считываться как x, а координата x2 будет считаться как x ** 2. То есть функция forward используется для вычисления позиций вдоль оси x2. Почему обратная функция? Допустим, вместо plot x над вами вместо того, чтобы сказать

plot f(x) axes x2y1

Это та же функция, f (x) = x, но теперь она рисуется относительно оси x2. Обратная функция sqrt (координата x2) используется для генерации координаты оси x1. Другими словами, функция линейна вдоль x1, но когда вы указываете программе построить график для x2, вы получаете параболу. В этом случае вы можете видеть числа вдоль x1 и x2, поэтому очевидно, что происходит. enter image description here

Это эффективно определяет x2 как нелинейную ось, связанную с линейным партнером x1. Видны как линейная, так и нелинейная оси.

3) Это подводит нас к set nonlinear x via sqrt(x) inv x**2, что на самом деле та же команда, что и раньше под капотом. Мы перевернем направленность отображения так, что x1 теперь является нелинейным концом. Вместо того, чтобы связывать x с координатами вдоль оси x2, он связывает с координатами вдоль линейной оси, которая не рисуется, «скрытой» оси. Так что теперь, когда мы строим график против x1, мы получаем тот же эффект, что и от графика против x2 в исходном случае set link.
enter image description here

...