1

1 つが変化すると、他のすべてが対応して合計 1 を維持するように変化する 5 の動的リストを想定します。他のものも反対方向に変化し、合計を 1 に保ちます。

そして、ここに私の試みたコードがあります:

v = {0.2, 0.2, 0.2, 0.2, 0.2};
v[[1]] = Dynamic[val];
Dynamic[val]
Slider[Dynamic[val]]
sum = 1;
Dynamic[v]
f := (#/(sum - #))*(sum - val) &
Slider[Dynamic[v[[1]], f /@ v], {0, 1}]
Slider[Dynamic[v[[2]], f /@ v], {0, 1}]
Slider[Dynamic[v[[3]], f /@ v], {0, 1}]
Slider[Dynamic[v[[4]], f /@ v], {0, 1}]
Slider[Dynamic[v[[5]], f /@ v], {0, 1}]

私の意図は、リスト v の要素が変更されたため、合計が 1 の規則に従ってリストを更新できるようにする純粋な関数 f を作成することでした。しかし、これは私が思ったようには機能しません。

前もって感謝します!

4

1 に答える 1

1

1 つのスライダーを動かすと、他の 4 つのスライダーが比例して変化し、すべての合計が 1 になります。

v = {0.2, 0.2, 0.2, 0.2, 0.2};

f = Function[{z, k},
   {a, b, c, d, e} = v;
   m = n = o = p = q = 1;
   Switch[k,
    1, a = z; m = 0,
    2, b = z; n = 0,
    3, c = z; o = 0,
    4, d = z; p = 0,
    5, e = z; q = 0];
   sol = Solve[a x^m + b x^n + c x^o + d x^p + e x^q == 1, x];
   xsol = First[x /. sol];
   v = {a xsol^m, b xsol^n, c xsol^o, d xsol^p, e xsol^q}];

{Dynamic@v, Row[{"Total = ", Dynamic[Total[v]]}]}

Slider[Dynamic[v[[1]], f[#, 1] &]]
Slider[Dynamic[v[[2]], f[#, 2] &]]
Slider[Dynamic[v[[3]], f[#, 3] &]]
Slider[Dynamic[v[[4]], f[#, 4] &]]
Slider[Dynamic[v[[5]], f[#, 5] &]]

ここに画像の説明を入力

于 2015-05-10T09:28:58.547 に答える