Mathematica中的对数滑块控制

时间:2011-03-15 03:34:54

标签: user-interface widget wolfram-mathematica

我正在为Mathematica中的分压器计算一个小接口。我有两个滑块(z1和z2)代表电阻值,还有几个滑块代表Vin作为正弦曲线。

问题是可用电阻值的范围(在现实世界中)在{r, 100, 1,000,000}上大致为对数。但是,如果我将滑块范围设置为r,则选择常用的低电阻值是不切实际的。 {100, 10,000}

是否可以创建一个扫过对数范围的滑块?

Manipulate[
 Grid[{{Plot[(VinRCos[t] + VinC), {t, -3, 9}, 
     PlotRange -> {-1, VMax}, AxesLabel -> {t, Vin}]}, {Plot[
     z2/(z1 + z2)(VinR*Cos[t] + VinC), {t, -3, 9}, 
     PlotRange -> {-1, VMax}, AxesLabel -> {t, Vout}]}}, 
  ItemSize -> 20],
 {{z1, 10000}, 10, 1000000, 10}, {z1}, {{z2, 10000}, 10, 
  1000000}, {z2}, Delimiter, {{VinR, 2.5}, 0, 
  5}, {VinR}, {{VinC, 2}, -VMax, VMax}, {VinC}]
Mathematica graphics

4 个答案:

答案 0 :(得分:7)

迈克尔的回答可能是最好的,即只是让用户指定指数。另一种解决方案是生成LogSlider类型命令。这是一个简单的例子:

LogSlider[{v:Dynamic[var_], v0_?Positive}, {min_?Positive, max_?Positive}, 
   base_:10, options___] := DynamicModule[{ev}, Dynamic[
                              var = base^ev; 
                              Slider[Dynamic[ev], Log[base, {min, max}]]]]
LogSlider[v:Dynamic[var_], {min_?Positive, max_?Positive}, 
   base_:10, options___] :=  LogSlider[{v, min}, {min, max}]

该功能仅具有Slider灵活性的子集,如果您需要自定义步长等,则必须进行扩展...

然后,您可以通过使用指定变量来修改Manipulate {{z1, 10000}, 10, 1000000, LogSlider[##]&}等......

答案 1 :(得分:6)

一个简单的解决方法就是让滑块操纵指数,并插入例如10^z1您需要实际值的地方:

Manipulate[10^z1, {{z1, 5}, 2, 6}] (* 100 to 1M *)

在您的特定情况下,您当然也可以输入一个标准电阻值列表来选择:

Manipulate[z1, {z1, {100, 110, 120, 130, 150, 160, 180, 200, 220, 240, 270}}]

HTH!

答案 2 :(得分:0)

这是我的最终结果:

Manipulate[
 Evaluate[Round[10^Z2]/(Round[10^Z1] + Round[10^Z2])*Vin] "V",
 {{Z1, 5}, 2, 6},
 Pane["Z1  = " Dynamic[Round[10^Z1] "[CapitalOmega]"], 
  ImageMargins -> {{2.5, 0}, {3, 0}}],
 {{Z2, 5}, 2, 6},
 Pane["Z2  = " Dynamic[Round[10^Z2] "[CapitalOmega]"], 
  ImageMargins -> {{2.5, 0}, {0, -5}}], {{Vin, 2.5}, 0, VMax}, 
 Pane["Vin  = " Dynamic[Vin "V"], ImageMargins -> {{0, 0}, {0, -5}}]]
enter image description here

答案 3 :(得分:0)

这是LogSlider的开始,它产生其他控件具有的标准双向行为。

LogSlider[Dynamic[x_], max_] := 
 Module[{exp}, 
  Dynamic[exp = Log[max, x]; 
   Slider[Dynamic[exp, (exp = #; x = max^exp) &]]]]

{LogSlider[Dynamic@x, 10^6], Dynamic@x}