2011-03-15 15 views
5

Estoy haciendo una pequeña interfaz para calcular divisores de voltaje en Mathematica. Tengo dos controles deslizantes (z1 & z2) que representan los valores de resistencia y un par de controles deslizantes para representar Vin como sinusoide.Control deslizante logarítmico en Mathematica

El problema es que el rango de valores de resistencia disponibles (en el mundo real) es aproximadamente logarítmico en {r, 100, 1,000,000}. Sin embargo, si ajusto el rango de mi deslizador a r, no es práctico seleccionar valores comunes de baja resistencia en aprox. {100, 10,000}.

¿Es posible crear un control deslizante que recorre un rango logarítmico?

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

+3

Nota que el cursor puede ser más finamente controlada, para citar a partir de [deslizante] (http://reference.wolfram.com/mathematica/ref/Slider.html): El deslizador resultante puede ser finamente manipulado por manteniendo presionada la tecla Alt (u Opción en Macintosh) mientras arrastra el mouse. Esto hace que el control deslizante se mueva a 1/20 de la velocidad del mouse. El control deslizante puede manipularse aún más finamente manteniendo presionadas las teclas Shift y/o Ctrl. – Simon

+0

@Simon este comentario es digno de ser incluido en su respuesta, en mi humilde opinión. –

+0

@Simon ¡gracias, no lo sabía! – terrace

Respuesta

6

Una solución sencilla es simplemente hacer que el control deslizante manipular el exponente, y conectar, por ejemplo, 10^z1 donde se necesita el valor real:

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

En su caso particular, se podría, por supuesto, también se introduce una lista de valores estándar de resistencia a escoger de:

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

HTH!

+0

+1 Sí, deslizando el exponente parece ser el camino a seguir. Este enfoque generalmente es útil para acercar o alejar en varios órdenes de magnitud. – DavidC

+0

nvm, descifrado: Artículo [Dinámico [10^Z1]] – terrace

7

La respuesta de Michael es probablemente la mejor, es decir, que el usuario especifique el exponente. Una solución alternativa es hacer un comando de tipo LogSlider. Aquí hay un ejemplo simple:

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}] 

La función sólo tiene un subconjunto de la flexibilidad de Slider y tendrá que ser ampliado si quieres tamaños de paso de encargo etc ...

a continuación, modifica su Manipulate especificando las variables utilizando {{z1, 10000}, 10, 1000000, LogSlider[##]&} etc ...

+0

Gracias por su solución. Pero hay un problema. Esto es lo que descubrí después de probar su código: si se especifica el valor inicial para Manipular el argumento z1, "LogSlider" recibiría argumentos en este formato "Dinámico [z1], {min, max}". Por lo tanto, la primera forma de "LogSlider" enumerada arriba es innecesaria y "v0" nunca se asigna. Para que el control deslizante de registro tenga en cuenta el valor inicial, agregue "ev = Log [base, var];" en DynamicModule justo antes del objeto "Dinámico". – ricecakebear

0

aquí está mi resultado final:

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

0

Aquí está el inicio de LogSlider que produce el comportamiento bidireccional estándar que tienen los otros controles.

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

{LogSlider[[email protected], 10^6], [email protected]} 
Cuestiones relacionadas