Mathematica Manipulate Plot: Масштабирование осей

Скажем, я настроил следующую функцию f[a,b,c], которую я хочу построить, варьируя a и b

f[a_,b_,c_]:=a b c Exp[a b]

Manipulate[
Plot
[
f[a,b,c],
{c,0,1},
PlotRange->{{0,0.05},Automatic}
],
{a,0,1},
{b,0,1}
]

Можно ли автоматически масштабировать ординату, когда я фиксирую диапазон просмотра абсцисс? В приведенном выше коде вы заметите, что при изменении a и b ордината действительно масштабируется автоматически, как если бы я просматривал весь диапазон {c,0,1}. Я хотел бы, чтобы он по-прежнему обрабатывал c от 0 до 1, но если я хочу просмотреть меньшую часть этого графика, скажем, c от 0 до 0,05, по-прежнему правильно масштабировать вертикальную ось. Спасибо за вашу помощь.


person CaptanFunkyFresh    schedule 09.01.2012    source источник
comment
Было бы здорово, если бы был способ добавить PlotRange в Manipulate, но пока я не нашел ничего, говорящего о том, что это возможно...   -  person CaptanFunkyFresh    schedule 10.01.2012


Ответы (3)


Вариант предложения Артеса Досендо:

Manipulate[
 Plot[f[a, b, c], {c, 0, Evaluate@d}, 
  PlotRange -> {{0, Evaluate@d}, Full}], {a, 0., 1.}, {b, 0., 1.}, {d, 
  0.05, 1.}]

Обратите внимание на то, что Evaluate заставляет передать значение машинной точности функции Plot до того, как она на самом деле попытается что-то нарисовать.

Я предпочитаю Full вместо Automatic для оси Y PlotRange в подобных случаях, потому что тогда вы знаете, что график никогда не будет обрезан таким образом, чтобы скрыть части кривой.

person Verbeia    schedule 09.01.2012

Вот одно из многих возможных решений:

f[a_, b_, c_] := a b c Exp[a b]
Manipulate[ Plot[f[a, b, c], {c, 0, d}, PlotRange -> Automatic], 
            {a, 0, 1}, {b, 0, 1}, {d, 0.1, 1}, Initialization :> (d := 0.1)]

Однако ваш пример не очень поучителен, чтобы лучше понять, как он работает, попробуйте что-то вроде этого:

g[a_, b_, c_] := 3 (a - 0.5) Cos[4 Pi (a - c)] Sin[8 Pi (c - 0.5)] Cos[6 Pi (b - c)]

Manipulate[
           Plot[g[a, b, c], {c, 0, d}, PlotRange -> Automatic],
           {a, 0, 1}, {b, 0, 1}, {d, 0.1, 1}, 
           Initialization :> (a := 0.4; b := 0.4; d := 0.5)]
person Artes    schedule 09.01.2012

Посмотрите, делает ли это то, что вы хотите. Я просто использую ListPlot вместо сюжета.

Но я не уверен, что вы делаете, поскольку вы рисуете f для c от 0 до 1, но затем устанавливаете x-диапазон только от 0 до 0,05? Почему бы тогда просто не построить f с помощью {c,0,0.05}? Может быть, я что-то упускаю.

Во всяком случае, вот что у меня есть

 Manipulate[

 xmax = 0.05;
 y = Table[f[a, b, c], {c, 0, xmax, 0.01}];
 max = Max[y];
 min = Min[y];

 Plot[f[a, b, c], {c, 0, 1},
  PlotRange -> {{0, xmax}, {min, max}}, ImagePadding -> 30],

 {a, 0, 1},
 {b, 0, 1},
 Initialization :>
  (
   f[a_, b_, c_] := a b c Exp[a b]
   )

 ]

изменить(1)

мне только что пришло в голову, чтобы сделать вышеизложенное более эффективным, нужно использовать первую команду таблицы, чтобы также генерировать сами данные, а не просто находить максимум/минимум диапазона графика. А затем используйте ListPlot вместо Plot. Это должно быть быстрее, чтобы выборка функции f происходила только один раз, а не 2 раза?

Итак, вторая версия

Manipulate[xmax = 0.05;

 data = Table[{c, f[a, b, c]}, {c, 0, xmax, 0.01}];
 max = Max[data[[All, 2]]];
 min = Min[data[[All, 2]]];

 ListPlot[
  data,
  PlotRange -> {Automatic, {min, max}},
  Joined -> True,
  ImagePadding -> 30
  ],

 {a, 0, 1},
 {b, 0, 1},
 Initialization :>
  (
   f[a_, b_, c_] := a b c Exp[a b]
   )
 ]
person Nasser    schedule 09.01.2012