我正在为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}]
答案 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}}]]
答案 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}