0

パーティクルのリストの重みを正規化したい。これらの重みはパーティクルオブジェクトに属します。重みの合計で割って正規化しようとしています。すべての重みはdoubleで宣言されます。プログラムがリストの先頭で除算を開始すると、値は正しいのですが、2回目または3回目の除算の直後に、間違った結果が得られます。これは、操作後の重みの合計が1ではないという結果になります。する必要があります。誰かがこの問題で私を助けることができますか?多分糸脱毛と関係がありますか?事前にThx。

// normalizing weights
double weightsum = 0;
double check = 0;
List<ParticleRobot> temporalparticleSet = new List<ParticleRobot>();

for (int i = 0; i < particleSet.Count; i++)
{
    weightsum = weightsum + this.particleSet[i].Weight;
}

Program.Weightsum = weightsum;

Console.WriteLine("Sum of unnormalized particleweights is " + weightsum);

foreach (ParticleRobot p in this.particleSet)
{
    Program.Weight = p.Weight;
    p.Weight = Program.Weight / Program.Weightsum;
    Console.WriteLine("Updated Particleweight is now : " + p.Weight);
}

// checking that they sum up to 1
for (int i = 0; i < particleSet.Count; i++)
{
    check = check + this.particleSet[i].Weight;
}

Console.WriteLine("Check: Sum of particles-weights is = " + check);
4

4 に答える 4

0

多数の数値セットを累積すると、精度が失われる可能性があります。役立つ 2 つのテクニックを次に示します。

  1. 最も軽いものから最も重いものへと、重量の昇順で重量を合計します。数値が負になる可能性がある場合は、大きい順に合計します。
  2. Kahan 総和アルゴリズムを使用して重みを累積します。最初に配列をソートする必要がないため、(1) よりも簡単です。
  3. 最小の重みに対する合計の比率が 10^16 のように大きい場合は、上記の両方を使用します。
于 2011-12-16T22:15:13.237 に答える
0

おそらくスレッドの問題ではありません。数値解析の本で浮動小数点の数学を読んでください。丸め誤差、精度の問題、キャンセルの問題のすべてが原因となる可能性があります。

于 2011-12-15T02:28:55.097 に答える
0

まず、temporalparticleSet とは何ですか? this.particleSet の代わりにそれをループするつもりですか? それ以外は、コードに問題はまったくありません。私は変更します:

Program.Weight = p.Weight;
p.Weight = Program.Weight / Program.Weightsum;

p.Weight = p.Weight / Program.Weight;

また、p.Weight は double ですか? 丸めの問題かもしれません。ブレークポイントを使用してステップスルーしようとしましたか?

于 2011-12-15T02:29:07.657 に答える
0

Program.Weight が割り当てられた値を変更するか、同じデータ型ではないことが懸念されます。

次の行を変更してみます。

        Program.Weight = p.Weight;
        p.Weight = Program.Weight / Program.Weightsum;

        p.Weight = p.Weight / Program.Weightsum;

考慮すべき丸め誤差もあります。

于 2011-12-15T02:33:24.453 に答える