Ich hoffe, diese Frage (und mögliche Antworten darauf) ist allgemein genug im Umfang, so dass es auch für andere nützlich sein wird.Schreiben einer Vorlage für variierende Funktionen mit verschobenen Argumenten
Ich versuche, ein numerisches Problem zu lösen, das in Form
wo ist eine vordefinierte Funktion ein Produkt von double
Funktionen beinhaltet, und i passiere einen Integrator.
Die Komplikation ist, dass meine Funktionen nicht statisch sind; Die Integration wird wiederholt durchgeführt, und bei jeder Integration des s hat eine andere Form, beispielsweise in der ersten Schleife könnte es
die zweiten sein, es wird
und so weiter, wo die Mitglieder eines Vektors von Funktionen bezeichnen. Bei jeder Iteration der Integration weiß ich a priori nicht, was die Form von sein wird, nur dass es eine lineare Kombination von s mit konstanten Koeffizienten sein wird.
Da , die ich an den Integrator passieren beinhaltet mit „verschoben“ Argumente, bei jeder Iteration i zugreifen müssen zu jedem der , da ich etwas von der Form
double Y (double x, double y, double z){
return (f(x+y) - f(x)) * (f(y+z) - f(y)) * A(z+y);
}
für den Integrator anrufen müssen (oder vielleicht nicht?).
Meine Frage ist, was wäre der beste Weg, meine darzustellen? Ich habe die offensichtlichen Kandidaten (Templates, std :: function) gelesen, aber ich bin mir nicht sicher, wie ich die verschobenen Argumente auf die Funktion "aufprägen" kann.
Ich bin mir sicher, dass dies in einer anderen Inkarnation ein ziemlich typisches Programmierdesignproblem ist. Kann mir jemand Vorschläge machen, wie ich mich ihm nähern soll?
Bearbeiten: Dank Rostislav und vor allem Gombat, die die ursprüngliche Lösung (obwohl Rostislav ist ziemlich elegant) kam. Bevor ich diese Frage schließe, füge ich hier vielleicht eine weitere Frage hinzu, dh betrachte den (allgemeineren) Fall, in dem man nicht so detaillierte Informationen über die Ausgabe f(x)
hat (dass es eine lineare Kombination von f_i(x)
mit konstanten Koeffizienten ist) Jede Iteration, und stattdessen wissen wir nur, dass f(x) = F(x)
, F(x)
ist eine double
Funktion, die wieder aus der f_i(x)
zusammengesetzt ist, aber jetzt in beliebiger Weise. Alle anderen Bedingungen sind die gleichen (beginnen mit bekannten f_0(x)
), wie sollte ich meine F(x)
in diesem Fall darstellen?
Ich dachte, dass da wir die funktionale Abhängigkeit der Lösung F(x)
wissen (es hängt nur von einem Argument x
, ist ein double
und besteht aus bekannten f_i(x)
zusammengesetzt), vielleicht ist es möglich, eine „Vorlage“ (schreiben Entschuldigung für den Missbrauch der Nomenklatur, es ist sehr suggestiv) Funktion F(x)
, die ich an den Integrator übergeben kann, die dann die tatsächliche Form der Funktion "integriert", um integriert zu werden, obwohl dies kompliziert sein könnte.
Wie bestimmen Sie, welche Form f (x) zur Laufzeit haben soll? – Gombat
@Gombat In der 1. Iteration stelle ich einen Vektor von 'f_0 (x)' Funktionen zur Verfügung, der bekannt ist.Dieser Vektor wird mit einer bestimmten Matrix multipliziert, die dazu dient, sie zu mischen, und daher habe ich zu Beginn der 2. Iteration einen Vektor von Linearkombinationen (mit konstanten Vorfaktoren) der 'f_0 (x)' s, die ich füttere elementweise zur 'Y (x, y, z)' Funktion (dh in diesem Schritt sollte jede der 'f (x)' Funktionen in 'Y (x, y, z)' bereits eine lineare Kombination sein der 'f_0 (x)' s). –
Was ist mit dem Erstellen einer Klasse, die ein Mitglied hat, das die Informationen speichert, die benötigt werden, um 'f_i (x)' s zu kombinieren und 'f (x)' eine Methode der Klasse zu sein. 'f (x)' hätte Zugang zu dem Mitglied, das die benötigten Informationen hält. – Gombat