增量缩放功能

时间:2011-06-11 14:53:33

标签: java numerical-methods

如果您知道'input1'严格地介于0和1之间,或者通常是'min'和'max'(其中min和max已知介于0和1之间,但不严格,0和1),您将如何获得'input1'通过'input2'给出的数值跳跃增加或减少,确保新值严格地在最小值和最大值之间并且永远不会达到最小值或最大值?

3 个答案:

答案 0 :(得分:0)

我认为以下内容应该将input1保持在min/max

之内
input1 = ((input1 - min + input2) % (max - min)) + min; 

答案 1 :(得分:0)

您可以使用min / max like

 public static int adjust(int n, int adjust, int min, int max) {
      return adjust0(n, adjust, min+1, max-1);
 }

 private static int adjust0(int n, int adjust, int trueMininum, int trueMaximum) {
      return Math.max(trueMininum, Math.min(trueMaximum, n + adjust));
 }

这将允许您调整您的值,并确保它将介于最小值和最大值之间,但绝不会是这些值。

答案 2 :(得分:0)

你需要一个distribution function,最好是一个可逆的(倒数称为quantile function)。 换句话说,您需要使用lim[x->-oo] f(x) = 0lim[x->oo] f(x) = 1进行单调严格增加的连续函数f。

如果你有这样的分布函数f和它的反f - 1,那么你的调整函数会得到这样的结果:

g (x, Δ) = f( f⁻¹(x) + Δ )

这是针对0到1之间的值,对于其他间隔[a, b],我们需要使用缩放函数s来缩放它:

s(x) = (b-a)·x + a,     s⁻¹(y) = (y-a)/(b-a)

然后调整功能

h(x, Δ) = s(g(s⁻¹(x), Δ) = s( f( f⁻¹(s⁻¹(x)) + Δ )).

一个易于Java可计算的分配函数就是

f(x) = 1 - 0.5 * exp(-x)   for 0 ≤ x
f(x) =     0.5 * exp( x)   for x ≤ 0

使用分位数函数

f⁻¹(y) = - log(2 - 2y)  for   y ≤ 0.5
f⁻¹(y) =   log(2 y)     for 0.5 ≤ y

从此构建您的调整功能就是将它们组合在一起。

当然,这只适用于数字精度的限制 - 你不能随意接近1。