I would like to use dependent sliders in Manipulate.
First slider K0 should be independent and varied from Kmin to Kmax.
Two others sliders K1 and K2 should dependend on K0 so that K1*K2 == K0 should be always true. Is it possible?
Asked
Active
Viewed 1,009 times
13
István Zachar
- 47,032
- 20
- 143
- 291
-
Strangely, I've failed to find any related post about this fairly basic question (maybe this about interrelated sliders), and the Documentation Center only has a somewhat related example. – István Zachar Nov 15 '12 at 19:08
2 Answers
11
As always, here is the more customizable DynamicModule version:
DynamicModule[{k0, k1, k2, kMin = -1, kMax = 1},
Panel[Grid[{
{"k0", Slider[Dynamic[k0, (k0 = #; k2 = k0/k1) &], {kMin, kMax}], Dynamic@k0},
{"k1", Slider[Dynamic[k1, (k1 = #; k2 = k0/k1) &], {-1, 1}, Exclusions -> {0}], Dynamic@k1},
{"k2", Slider[Dynamic[k2, (k2 = #; k1 = k0/k2) &], {-1, 1}, Exclusions -> {0}], Dynamic@k2},
{Panel[Dynamic@Grid[{
{"k0", k0}, {"k1", k1}, {"k2", k2}, {"k1*k2", k1*k2}},
Alignment -> Left], ImageSize -> {250, 90}], SpanFromLeft}
}, Alignment -> Left], ImageSize -> {300, 200}]
]

Note that division by zero is handled by Exclusions -> {0}.
István Zachar
- 47,032
- 20
- 143
- 291
-
5Use the
Exclusionsoption forSliderto prevent landing on zero and division by zero. – Mike Honeychurch Nov 15 '12 at 21:24
1
Here's one thing you might try
k0Old = 1; k1Old = 1; k2Old = 1; kMin = 1; kMax = 2;
Manipulate[
If[k1 != k1Old || k0 != k0Old, k2 = k0/k1; k1Old = k1; k0 = k0Old];
If[k2 != k2Old, k1 = k0/k2; k2Old = k2;];
{k0, k1, k2, k1 k2}, {k0, kMin, kMax}, {k1, 0.1, 10}, {k2, 0.1, 10}]
bill s
- 68,936
- 4
- 101
- 191