2

現在、特定の値を経時的に測定するソフトウェアを実装しています。ユーザーは、28 日間にわたって値を 100 回測定することを選択できます。(例を挙げるだけです)

線形分布は問題ではありませんが、現在、時間範囲でのポイントの対数分布を取得しようとしています。

簡単な実装は、ポイントを反復処理することになるため、指数関数が必要になります。(ここまでできました!)

私の現在のアルゴリズム(C#)は次のとおりです。

long tRelativeLocation = 0;
double tValue;
double tBase = PhaseTimeSpan.Ticks;
int tLastPointMinute = 0;
TimeSpan tSpan;
for (int i = 0; i < NumberOfPoints; i++)
{
     tValue = Math.Log(i + 1, NumberOfPoints);

     tValue = Math.Pow(tBase, tValue);
     tRelativeLocation = (long)tValue;
     tSpan = new TimeSpan(tRelativeLocation);
     tCurrentPoint = new DefaultMeasuringPointTemplate(tRelativeLocation);
     tPoints.Add(tCurrentPoint);
}

これにより、28 日間で 100 ポイントというかなり「良い」結果が得られます。
最初の 11 ポイントはすべて 0 秒、
12 ポイントは 1 秒、
20 ポイントは 50 秒、
50 ポイントは 390 分、
95 ポイントは 28605 分、
99 ポイントは 37697 分です (つまり、最後のポイントまで 43 時間かかります)。

私の質問は、最初の 20 ~ 30 ポイントを互いにさらに離し、最後の 20 ~ 30 ポイントを少し近づける方法を知っている人はいますか?

最終的には、最初のポイントを少なくとも 1 分ほど離すアルゴリズムを追加する必要があることを理解しています。そのような動作を厳密に数学的アルゴリズムに組み込むことはできないからです。

このようなもの:

if (((int)tSpan.TotalMinutes) <= tLastPointMinute)
{
      tSpan = new TimeSpan((tLastPointMinute +1) * 600000000L);
      tRelativeLocation = tSpan.Ticks;
      tLastPointMinute = (int)tSpan.TotalMinutes;
}

ただし、全体的にもう少し良い分布を得たいと思っています。

数学のひび割れからのクールなアイデアは大歓迎です!

4

3 に答える 3

1

選択する分布曲線は、測定対象によって異なります。

直線、正弦波、多項式または指数曲線は、特定の測定セットに対して個別に最適な分布曲線である可能性があります。

分布曲線を決定したら、曲線の数式を使用して、任意の時間値(x値)のy値を計算することにより、欠落データポイントを計算します。

例として、直線の場合、必要なのは1つのデータポイントと直線の傾きだけです。時間0で測定値が10であり、測定値が1分ごとに2ずつ上がるとします。式はy=2 * x + 10になります。x=5(分)のときに測定値を計算する場合、式は20の測定値を示します。

対数曲線の場合は、対数式を使​​用します。簡単にするために、実際の測定値がy = 2 ** x+12の式を与えるとしましょう。計算する時間値(x値)をプラグインし、測定値(y値)を計算します。

測定する代わりにデータポイントを計算することにより、計算エラーが発生していることを認識してください。グラフを読んでいる人が実際の測定値と区別できるように、計算されたデータポイントに何らかの方法でマークを付ける必要があります。

于 2010-07-29T12:57:41.977 に答える
1

あなたが何をしようとしているのか正確にはわかりません.あなたのコードはあなたの例と一致していないようです(私が計算を台無しにしている可能性があります). サンプルの最小間隔を 1 秒にし、各ポイントを最後のポイント (最初のポイントを除く) の x 倍の位置に配置する場合は、x^(n - 1) = スパンとなる x を見つけます。これは単に x = exp(log(span) / (n - 1)) です。次に、ポイントは x^i になりますfor(i = 0; i < n; i++)

于 2010-07-29T14:37:11.240 に答える
1

実用的な観点からは、ログ機能により、時点がすでに原点近くに絞り込まれます。べき乗関数はそれらをさらに圧迫します。単純な掛け算はどうですか?

 tValue = Math.Log(i + 1, NumberOfPoints);
 tValue = tBase * tValue;

曲線を平らにするもう 1 つの方法は、原点から離れて開始することです。

for (int i = 0; i < NumberOfPoints; i++)
{
  tValue = Math.Log(i + 10, NumberOfPoints + 9);

tvalue の範囲は 0 ~ 1 のままです。

冒頭に1秒の最小スペースを持たせるにはどうですか?

double nextTick = 0;
for (int i = 0; i < NumberOfPoints; i++)
{
  tValue = Math.Log(i + 1, NumberOfPoints);

  tValue = Math.Pow(tBase, tValue);

  if (tValue < nextTick) tValue = nextTick;
  nextTick++;
于 2010-07-30T17:08:54.003 に答える