2016-07-19 28 views
0

2つの数値の間にn個の対数間隔を見つけることを試みています。2つのエンドポイント間にn個の対数間隔を見つける

例:機能の logDiv(10、10000、3)10が出発点、10000終点、及び間隔の3つの数であり、Iは、次の出力を取得したい: (* { 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

誰かがこれで私を助けることができるしてください?私の上記の試みに従う必要はなく、私が試したことを説明するだけです。

答えて

0

ニーナと多くのグーグルとのスタックオーバーフローの答えによって、上記の答えのおかげで、私はこれが私のために働くことがわかった:

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/

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

+0

それ最後のものが対数スケールの一部でないという事実を除いて良いです、5,1,500については、私は最後の2つとして144.23と500を得ます –

+0

私は '144.2699905907214'と' 500'を取得します。最初と最後の項目は常に指定された値です。 –

+0

あなたが正しい方向に考えるのに役立ちましたが、より良い解決策が見つかりました:https://jsfiddle.net/qxqxwo3z/1/答えをありがとう! –

関連する問題