Mathematica Manipulate Plot: Масштабирующие оси - PullRequest
3 голосов
/ 10 января 2012

Скажем, я настроил следующую функцию 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, вертикальная ось по-прежнему корректно масштабируется.Спасибо всем за помощь.

Ответы [ 3 ]

8 голосов
/ 10 января 2012

Вариант по предложению Artes Docendo:

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 в подобных случаях, потому что тогда вы знаете, что он никогда не обрезает график способами, скрывающими части кривой.

4 голосов
/ 10 января 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)]
3 голосов
/ 10 января 2012

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

Но я не уверен, что вы делаете, так как вы строите 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]
   )

 ]

edit (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]
   )
 ]
...