Frage

Ich versuche, die in diesem Artikel präsentierte Mathematik umzuwandeln:

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

Rund um Seite 3 in den Arbeitscode weiterleiten. Der Algorithmus selbst wird um Seite 6 gegeben, aber ich spreche weder griechisches noch Mathematik. Also stecke ich vorerst fest.

Wenn ich den Code verstehe, sollte er so runtergehen:

    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

Vorbereitung:

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)

Gleichung 7:

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

Gleichung 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
}

Gleichung 9:

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

Ist das überhaupt nahe an das, was die Mathematik sagt?

Danke im Voraus, -jw

War es hilfreich?

Lösung

Ich denke, Sie könnten die Anrufe an "Norm (...)" vermissen. Die Normalisierung eines Vektors teilt nur jede Komponente des Vektors durch die Länge. In Gleichung 9 berechnen sie die gewichtete Summe der Längen von VT und VBEST und multiplizieren Sie diese durchschnittliche Länge mit Norm(VBAR). Sie multiplizieren es nur mit VBAR direkt.

Die Absicht hinter dieser Gleichung scheint darin zu sein, einen neuen Vektor v_ {t+1} zu erstellen, dessen Länge die durchschnittliche Länge von VT und VBEST ist. VHAT könnte jedoch überhaupt eine Länge sein, sodass die Multiplikation in Gleichung 9 die meiste Zeit nicht die richtige Antwort gibt, es sei denn, Sie zwingen die Länge des VHAT -Vektors zu genau einem. Das macht die Vektornorm.

Die Norm ist nur die Komponenten des Vektors geteilt durch die Länge. Ersetzen Sie also Ihren Code für Gleichung 9 durch so etwas:

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);
}

Sie haben auch den Normvorgang in Gleichung 7 ignoriert. Ich habe das Papier nicht gelesen, aber es ist hier möglicherweise nicht unbedingt erforderlich, da die Gewichte zu einem und die Vektoren bereits normalisiert sind. Ich müsste etwas mehr Zeit verbringen, um mich auf die eine oder andere Weise zu überzeugen, aber es würde sicherlich nicht schaden, diesen berechneten V 'Vector zu normalisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top