Логарифмическое управление ползунком в Mathematica - PullRequest
5 голосов
/ 15 марта 2011

Я делаю небольшой интерфейс для расчета делителей напряжения в Mathematica. У меня есть два ползунка (z1 и z2), которые представляют значения резистора, и несколько ползунков, чтобы представить Vin как синусоиду.

Проблема в том, что диапазон доступных значений резистора (в реальном мире) примерно логарифмический на {r, 100, 1,000,000}. Однако если я установлю свой диапазон ползунка на r, нецелесообразно выбирать общие значения низкого сопротивления в прибл. {100, 10,000}.

Можно ли создать ползунок, который проходит через логарифмический диапазон? Manipulate[ Grid[{{Plot[(VinR<em>Cos[t] + VinC), {t, -3, 9}, PlotRange -> {-1, VMax}, AxesLabel -> {t, Vin}]}, {Plot[ z2/(z1 + z2)</em>(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 ]

7 голосов
/ 15 марта 2011

Ответ Михаэля, вероятно, лучший, т.е. просто попросите пользователя указать экспоненту.Альтернативное решение состоит в том, чтобы сделать команду типа 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[##]&} и т.д ...

6 голосов
/ 15 марта 2011

Простое решение состоит в том, чтобы просто заставить слайдер манипулировать показателем степени и подключить, например, 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!

0 голосов
/ 31 января 2014

Вот начало 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}
0 голосов
/ 15 марта 2011

Вот мой окончательный результат: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...