K
Da habe ich noch eine Frage zu:
Ich hab´s ausprobiert und einen schönen Runge-Kutta geschrieben. Kein Problem.
Jetzt möchte ich das ganze in mein Projekt einbinden und in die gegebene Klassenstruktur, wobei ich eigentlich die Funktion runge_kutta(...) global halten möchte, damit sie aus allen Klassen zugänglich ist. Dabei klappt nun die Funktionsübergabe nicht mehr:
Zunächst die Funktion die einen Runge-Kutta-Schritt ausführt:
//Differenzialgleichung loesen, nach Runge Kutta
//y'(t) = f(t, y(t))
// rechte_seite
//h: Schrittweite
//y_j: Startwert, bzw. Wert des vorherigen Schrittes
//t_j: Zeitpunkt
template<typename F>
CVektor<double> runge_kutta(F rechte_seite, const double & t_j, const CVektor<double> & y_j, const double & h)
{
CVektor<double> y_jplus1;
const CVektor<double> & k1 = rechte_seite(t_j, y_j);
//...
y_jplus1 = y_j + h/6*(k1+2*k2+2*k3+k4);
return y_jplus1;
}
Jetzt der Aufruf der DGL aus einer Klasse
void CASMRundstab::loese_dgl()
{
//...
CVektor<double> ergebnis;
ergebnis = runge_kutta(rechte_seite_dgl, CZeit::gib_akt_zeit(), startwerte, CZeit::gib_schrittdauer());
//...
}
Die Funktion rechte_seite_dgl muss auf Member von CASMRundstab zugreifen und ist daher Member der Klasse:
CVektor<double> CASMRundstab::rechte_seite_dgl(const double & t, const CVektor<double> & y)
{
CVektor<double> rechte_seite;
//...
return rechte_seite;
}
Das kommentiert der Compiler mit:
error C2064: Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt
Auf die schnelle habe ich versucht, die Funktion runge_kutta auch als Member zu programmieren, aber das funktioniert ebenfalls nicht. Da ist doch irgendwo ein ganz schöner Wurm drin oder?
Vielen Dank.