3

假设我已经设置了以下函数f[a,b,c],我希望在变化ab

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缩放,就好像我正在查看. 我希望它仍然可以处理从 0 到 1,但是如果我想查看该图的较小部分,例如从 0 到 0.05,仍然可以正确缩放垂直轴。感谢大家的帮助。{c,0,1}cc

4

3 回答 3

8

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使用Automaticy 轴PlotRange,因为这样你就知道它永远不会以隐藏部分曲线的方式裁剪图。

于 2012-01-09T23:53:47.480 回答
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)]
于 2012-01-09T23:23:19.153 回答
3

看看这是否符合您的要求。我只是使用 ListPlot 而不是 plot。

但我不确定你在做什么,因为你正在绘制fc 从 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]
   )
 ]
于 2012-01-09T23:26:05.903 回答