2016-04-11 5 views
0

Das System von ode $ f '(x, t) = f (x, t) $ muss folgende Signatur haben: hereErweiterung der Typ-Signatur des Systems bei Verwendung von `boost :: numeric :: odeint`

void sys(const state_type & /*x*/ , state_type & /*dxdt*/ , const double /*t*/) 
{ 
    // ... 
} 

es ist möglich, an folgende

void sys(const state_type & /*x*/ , state_type & /*dxdt*/ , const double /*t*/, void * params) 
{ 
    // do something with params now ... 
} 
+1

Wie werden Sie die Parameter einstellen? Was ist mit 'boost :: bind'? Sie haben einige Beispiele auf der Seite, auf die Sie verweisen. Sie würden etwas wie boost :: bind (& fn, _1, _2, _3, & params) tun, um die Parameter zu binden und ihr die erforderliche Signatur zu geben. –

+0

@ DanMašek 'params' sind so eingestellt, wie Sie es in Ihrer Antwort getan haben. Ich probiere es aus. Ich werde hier updaten, sobald es funktioniert. – Dilawar

Antwort

1

ändern Sie boost::bind oder (vielleicht std::bind) verwenden, um die 4 th Parameter auf einen Zeiger die params Objekt, das Sie verwenden möchten, zu binden. Dadurch wird ein Funktionsobjekt mit der richtigen Signatur erstellt.

Dann sollten Sie es wie gewohnt verwenden können.

params_t params; 
// Set the parameters... 

auto my_fun = boost::bind(&sys, _1, _2, _3, &params); 
// ... 
rk.do_step(my_fun, inout, t, dt); 
+0

Überraschendes 'boost :: bind' fehlgeschlagen mit Fehler' binding value vom Typ 'const vector <[2 * ...]>' zum Verweis auf 'vector <[2 * ...]>' löscht 'const' qualifier' aber alles funktioniert mit 'std :: bind'. – Dilawar

3

Eine andere Möglichkeit ist die Verwendung von Lambdas. In C++ 14 schreiben Sie sie als

auto func = [&params](auto const& x , auto& dxdt , double t) { 
    sys(x , dxdt , t , &params); }; 
rk.do_step(my_fun, inout, t, dt); 

Außerdem, wenn Sie Bibliotheken von Drittanbietern nicht und params über void* passieren rufen müssen, um eine Funktors betrachten zu verwenden, um Ihre Parameter zugreifen:

struct sys 
{ 
    param_t param; 
    void operator()(state_type const& x , state_type& dxdt , double t) const 
    { 
     // implement sys and access params 
    } 
}; 

sys s; 
rk.do_step(s, inout, t, dt); 

Genau aus diesem Grund verwendet Odein das Funktionsobjekt. Sie können alles verwenden, was wie eine Funktion aussieht. Und eine Klasse mit einem Mitglied und entsprechenden operator() verhält sich genau wie Funktion.

Verwandte Themen