Как определить график по вертикали, если он не указан пользователем?


7

Рассмотрим пример :

p0 = Plot[Tan[x Pi/2], {x, -1, 1}] 

В этом случае вертикальный указан диапазон будет $(- \infty, \infty)$ , что явно невозможно построить, но Mathematica молча выбирает вертикальный диапазон графиков $[- 6.60184, 6.50751]$ (как сообщается AbsoluteOptions[p0, PlotRange]).

Фактически, даже в тех случаях, когда функция, которая должна быть построена, остается конечной на протяжении заданного интервала (включая его конечные точки), Mathematica будет иногда выбирать диапазон по вертикали, меньший, чем фактический диапазон функции в указанный интервал. Например, если один участки

epsilon = 1*^-6; 
Plot[Tan[x Pi/2], {x, -1 + epsilon, 1 - epsilon}] 

вертикальный участок диапазона используется Mathematica составляет $[- 6,60183, 6,50749]$ , почти такой же, как тот, используемый в предыдущем примере.

Как Plot определяет вертикальный диапазон 2D-графика, когда пользователь не указывает (ограниченный) один?

(Излишне говорить, что я не ожидаю получить полное описание алгоритма Mathematica для этого, поскольку это секретная информация. То, что я надеюсь получить, - это просто общая идея с широкими штрихами.)


Одна вещь, которую я могу сказать, что горизонтальный диапазон, кажется, не входят в расчет вертикального диапазона, так как вертикальный диапазон для участка

Plot[Tan[x Pi/200], {x, -100, 100}] 

точно так же, как для первый пример выше.

Извините, что не публиковал фотографии ... Загрузитель SE, который я установил, почему-то не работает.

  0

Он знает функцию, поскольку вы передаете это ему, он знает, что это диапазон, поэтому он будет делать некоторую предварительную обработку для оценки максимального/минимального числа функций, которые будут построены по диапазону. Есть, я уверен, много дополнительных эвристик, участвующих в достижении ценностей, которые заставляют сюжет выглядеть лучше. Это искусство и наука. Mathematica делает это лучше, чем Matlab, например. Это обоснованное предположение, поскольку я не работаю для WRI и не знаю, как это делается в реальной реализации. 23 авг. 132013-08-23 13:27:05

  0

@Nasser 'Plot' не использует для этого никакой символической обработки, потому что результат всегда один и тот же, независимо от того, является ли функция аргумента« черным ящиком »или явно видима для« Plot ». Сравните: 'f [x_? NumberQ] = Tan [x Pi/200]; Участок [f [x], {x, -100, 100}] 'и' Участок [Tan [x Pi/200], {x, -100, 100}] '. 23 авг. 132013-08-23 14:42:37

  0

Re: загрузчик, пожалуйста, установите обновленную версию из [здесь] (https://github.com/halirutan/SEUploaderApplication) (следуйте инструкциям в README) 23 авг. 132013-08-23 19:03:58

  0

@ rm-rf: thanks; как это бывает, что * есть * загрузчик, который я использую; он каким-то образом вклинился; Мне нужно переустановить его, но это не первый случай, когда это происходит, что заставляет меня неохотно повторять цикл, пока я не пойму, почему он вклинивается в первую очередь ... 23 авг. 132013-08-23 22:38:16

5

Это не только Plot - ListPlot действует аналогично, и его довольно легко изучить. Например, если у вас есть куча чисел между -1 и +1, он отображает диапазон, который вы могли бы ожидать:

x = RandomVariate[UniformDistribution[{-1, 1}], 1000]; 
ListPlot[x] 

enter image description here

Изменение двух значений до +/- 2, и это также действует, как можно было бы ожидать:

x = RandomVariate[UniformDistribution[{-1, 1}], 1000]; 
x[[100]] = 2; x[[200]] = -2; 
ListPlot[x] 

enter image description here

Но изменить значения +/- 200, и это делает некоторый выбор относительно того, что является правильным для Сюжет:

x = RandomVariate[UniformDistribution[{-1, 1}], 1000]; 
x[[100]] = 200; x[[200]] = -200; 
ListPlot[x] 

enter image description here

Обратите внимание, что это не просто обрезает значения (и сюжет, как и в верхнем снимке), скорее, он пытается показать, что есть больше сюжета, чем могло бы быть очевидным выбрав диапазон около +/- 2,5. Только Вольфрам знает, почему он делает эти точные выборы.Если вы хотите, чтобы обойти это, вы всегда можете использовать опцию, чтобы включить все пункты (который работает на Plot, а также многих других функций рисования):

x = RandomVariate[UniformDistribution[{-1, 1}], 1000]; 
x[[100]] = 200; x[[200]] = -200; 
ListPlot[x, PlotRange -> All] 

enter image description here