Mathematica 动态列表设计
Mathematica Dynamic List Design
假设一个5的动态列表,如果其中一个改变,所有其他的都会相应改变以保持和1。它来自一个实际问题,5个概率总共1,如果其中一个改变(由Slider), 其他的也都向相反的方向变化, 总和保持为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}]
我的意图是创建一个纯函数 f,当列表 v 的元素发生变化时,它允许按照总和为 1 的规则更新列表。但这并不像我认为的那样有效。
提前致谢!
如果移动一个滑块,则其他四个滑块按比例变化,所有总和为 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] &]]
假设一个5的动态列表,如果其中一个改变,所有其他的都会相应改变以保持和1。它来自一个实际问题,5个概率总共1,如果其中一个改变(由Slider), 其他的也都向相反的方向变化, 总和保持为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}]
我的意图是创建一个纯函数 f,当列表 v 的元素发生变化时,它允许按照总和为 1 的规则更新列表。但这并不像我认为的那样有效。
提前致谢!
如果移动一个滑块,则其他四个滑块按比例变化,所有总和为 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] &]]