0

この論文で提示された数学を変換しようとしています:

http://www.bouncechairs.net/pskalman-lategecco.pdf

3ページあたりで作業コードに進みます。アルゴリズム自体は 6 ページあたりに記載されていますが、私はギリシャ語も数学も話せません。ので、とりあえず行き詰まっています。

コードを理解していれば、次のように実行されるはずです。

    vt = particle velocity, 1d array
    vbest = best particle velocity 1d array
    v_prime = 1d storage array
    v_hat = 1d storage array

    alpha = 0.45
    sigma = 0.60

    denom = float
    denom_best = float

準備:

for(int i = 0; i < vt.length; i++)
{
     denom += vt[i] ^ 2
     denom_best += vbest[i] ^ 2
}
denom = denom ^ (1/2)
denom_best = denom_best ^ (1/2)

式 7:

for(int i = 0; i < vt.length; i++)
{
v_prime[i] = alpha * (vt[i]/denom) + (1 - alpha) * (vbest[i]/denom_best)
}

式 8:

for(int i = 0; i < vt.length; i++)
{ 
 v_hat[i] = Rand_Gauss(v_prime[i], sigma) //gaussian random number with 
                                          //v_prime[i] average, and sigma StDev
}

式 9:

for(int i = 0; i < vt.length; i++)
{
vt[i] = (alpha * denom + (1 - alpha) * denom_best) * v_hat[i]
}

これは数学が言っていることに近いですか?

事前に感謝します、-JW

4

1 に答える 1

0

「norm(...)」への呼び出しが欠落している可能性があると思います。ベクトルの正規化は、ベクトルの各コンポーネントを長さで割るだけです。式 9 では、vt と vbest の長さの加重和を計算し、その平均長にノルム(vbar) を掛けます。vbar を直接掛けるだけです。

その方程式の背後にある意図は、長さが vt と vbest の平均の長さである新しいベクトル v_{t+1} を作成することであるようです。ただし、vhat は任意の長さである可能性があるため、vhat ベクトルの長さを正確に 1 にしない限り、ほとんどの場合、式 9 の乗算では正しい答えが得られません。それが、ベクトル ノルムの機能です。

ノルムは、ベクトルのコンポーネントを長さで割ったものです。したがって、式 9 のコードを次のように置き換えます。

vtlen=0
for(int i=0; i<vt.length; i++)
{
    vtlen+=vt[i]*vt[i];
}
vtlen=sqrt(vtlen);
for(int i=0; i<vt.length; i++)
{
    vt[i] = (alpha * denom + (1 - alpha) * denom_best) * (v_hat[i] / vtlen);
}

式 7 のノルム演算も無視しています。この論文は読んでいませんが、重みの合計が 1 になり、ベクトルが既に正規化されているため、厳密には必要ないかもしれません。何らかの方法で自分自身を納得させるにはもう少し時間を費やす必要がありますが、先に進んでその計算された v' ベクトルも正規化しても問題はありません。

于 2011-05-01T02:53:52.067 に答える