我试图找到两个数字之间的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
)]
请有人帮我这个吗?没有必要遵循我上面的任何尝试,只是解释我尝试过的东西。
答案 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;
}