【问题标题】:Incremental scaling function增量缩放功能
【发布时间】:2011-09-13 01:55:05
【问题描述】:

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

【问题讨论】:

  • input2 有什么限制?如果 input2 可以大于max 或小于-1 * min,那么处理的规则是什么?
  • input2 > 1,你的函数需要处理将结果保持在最小值和最大值之间
  • 我还不清楚。如果input1 = 0.7max = 0.75input2 = 2.25,结果应该是什么?

标签: java numerical-methods


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可以像使用 min/max 一样

     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));
     }
    

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

    【讨论】:

    • 这肯定不会永远不会达到最大值或最小值
    • 如果它从未达到最大值或最小值,则它不是最大值或最小值。我将更新示例。 ;)
    【解决方案3】:

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

    如果你有这样一个分布函数 f 和它的反函数 f⁻¹,那么你的调整函数会是这样的:

    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。

    【讨论】:

      猜你喜欢
      • 2012-08-25
      • 1970-01-01
      • 2016-09-15
      • 2015-05-12
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      相关资源
      最近更新 更多