2012-01-09 3 views
3

Say я настроил следующую функцию f[a,b,c], которые я хочу построить изменяясь a и bMathematica Манипулирование Участок: Scaling Топоры

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

+0

Было бы здорово, если бы был способ добавить PlotRange в Manipulate, но до сих пор я ничего не нашел, говоря, что это возможно ... – CaptanFunkyFresh

ответ

8

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

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

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

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

4

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

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

Смотрите, если это делает что ты хочешь. Я просто использую 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)

это только мне пришло в голову, чтобы сделать выше более эффективным, чтобы использовать первую команду Table, чтобы генерировать сами данные, а не просто найти максимальный/мин диапазона графика. И затем используйте 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] 
    ) 
] 
Смежные вопросы