gnuplot установил связь и установил нелинейный

63
6

Может ли кто-нибудь более подробно остановиться на set nonlinear и set link функций set link. Документация слишком кратка по этим темам. В частности, для 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 поскольку нет функции для преобразования.)

спросил(а) 2021-01-25T19:07:18+03:00 4 месяца, 2 недели назад
1
Решение
77

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

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

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. Т.е. передняя функция используется для вычисления позиций вдоль оси x2. Почему обратная функция? Предположим вместо plot x выше вы вместо этого сказали

plot f(x) axes x2y1

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

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

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

ответил(а) 2021-01-25T19:07:18+03:00 4 месяца, 2 недели назад
45

Невозможно отформатировать команды в комментарии, так что вот еще один ответ: возможно, этот сюжет прояснится. Это построено с использованием версии 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

ответил(а) 2021-01-25T19:07:18+03:00 4 месяца, 2 недели назад
46

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

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

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

ответил(а) 2021-01-25T19:07:18+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема