找到两个端点之间的n个对数间隔

时间:2016-07-19 11:19:41

标签: javascript

我试图找到两个数字之间的n个对数间隔。

例如:for a function logDiv(10,10000,3)其中10是起点,10000是结束点,3是间隔数,我想得到以下输出: (* {10,100,1000,10000} *)

我尝试过:

function logInterval(total_intervals, start, end) {
   var index, interval, result = [];
    for (index = 0; index < total_intervals; index++) {
      interval = (index/total_intervals * Math.log((end - start) + 1) - 1 + start);
        result.push(interval);
    }
    return result;
}
var intervals = logInterval(5, 1, 500);

https://jsfiddle.net/qxqxwo3z/

这是基于我对(我)在堆栈交换mathematica中找到的以下解决方案的理解(差):

logspace [increments_, start_, end_] := Module[{a}, (
   a = Range[0, increments];
   Exp[a/increments*Log[(end - start) + 1]] - 1 + start
)]

https://mathematica.stackexchange.com/questions/13226/how-can-i-get-exactly-5-logarithmic-divisions-of-an-interval

请有人帮我这个吗?没有必要遵循我上面的任何尝试,只是解释我尝试过的东西。

2 个答案:

答案 0 :(得分:1)

最好的方法是从结束值和起始值的对数差开始除以间隔。

x = (Math.log(end) - Math.log(start)) / total_intervals;

对于因子,您需要执行反向操作

factor = Math.exp(x);

要获取数组,您可以将起始值乘以因子并将其插入数组中。下一个值是最后一个值乘以因子,直到生成所有项目。

function logInterval(total_intervals, start, end) {
    var x = (Math.log(end) - Math.log(start)) / total_intervals,
        factor = Math.exp(x),
        result = [start],
        i;

    for (i = 1; i < total_intervals; i++) {
        result.push(result[result.length - 1] * factor);
    }
    result.push(end);
    return result;
}

console.log(logInterval(3, 10, 10000));
console.log(logInterval(5, 1, 500));
console.log(logInterval(12, 220, 440)); // some frequencies

答案 1 :(得分:0)

感谢nina的上述回答以及更多的谷歌搜索和堆栈溢出答案,我发现这对我有用:

function logInterval(total_intervals, start, end) {
     var startInterVal = 1, endInterval = total_intervals,
         minLog = Math.log(start), maxLog = Math.log(end),
         scale = (maxLog-minLog) / (endInterval-startInterVal),
         result = [];


      for (i = 1; i < total_intervals; i++) {
          result.push(Math.exp(minLog + scale*(i - startInterVal)));
      }
      result.push(end);
      return result;
}

https://jsfiddle.net/qxqxwo3z/1/