我打算在MCMC例程中使用Boost odeint库来估计ODE模型中的参数。由于这些ODE可能很僵硬,我需要能够将jacobian传递给具有导数的求解器。我想创建一个类,其中参数和初始值为私有成员,然后是衍生,jacobian和方法,以将参数更改为公共方法。我试图修改odeint网站上的僵硬示例,使用一个包含两者的类,但是我收到错误错误:没有匹配函数来调用' Fitzhugh :: deriv()'在通讯时。我不是一个经验丰富的C ++程序员,所以这可能是一个概念上的错误。这是代码。
/* Fitzhugh Nagumo Equation in odeint */
#include <iostream>
#include <fstream>
#include <utility>
#include <cmath>
#include <boost/numeric/odeint.hpp>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/operator.hpp>
using namespace std;
using namespace boost::numeric::odeint;
namespace phoenix = boost::phoenix;
//[ stiff_system_definition
typedef boost::numeric::ublas::vector< double > vector_type;
typedef boost::numeric::ublas::matrix< double > matrix_type;
class Fitzhugh
{
private:
double a;
double b;
double c;
public:
Fitzhugh( double a_, double b_, double c_ ) : a(a_), b(b_), c(c_) { }
void deriv ( const vector_type &x , vector_type &dxdt , double )
{
dxdt[ 0 ] = c*(x[0] - pow(x[0], 3.0)/3.0 + x[1]);
dxdt[ 1 ] = -(x[0] - a + b*x[1])/c;
}
void jac ( const vector_type &x, matrix_type &J , const double & , vector_type &dfdt )
{
J( 0 , 0 ) = c*(1 - pow(x[0], 2.0));
J( 0 , 1 ) = c;
J( 1 , 0 ) = -1/c;
J( 1 , 1 ) = -b/c;
dfdt[0] = 0.0;
dfdt[1] = 0.0;
}
};
int main( int argc , char **argv )
{
// typedef rosenbrock4< double > stepper_type;
// typedef rosenbrock4_controller< stepper_type > controlled_stepper_type;
// typedef rosenbrock4_dense_output< controlled_stepper_type > dense_output_type;
//[ integrate_stiff_system
vector_type x( 2 , 1.0 );
Fitzhugh fitzhugh(0.2, 0.2, 3.0);
size_t num_of_steps = integrate_const( make_dense_output< rosenbrock4< double > >( 1.0e-6 , 1.0e-6 ) ,
make_pair( fitzhugh.deriv() , fitzhugh.jac() ) ,
x , 0.0 , 50.0 , 0.01 ,
cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" );
//]
clog << num_of_steps << endl;
return 0;
}
这是完整输出
/home/chris/C++/examples/fitzhugh/main.cpp: In function ‘int main(int, char**)’:
/home/chris/C++/examples/fitzhugh/main.cpp:60:39: error: no matching function for call to ‘Fitzhugh::deriv()’
/home/chris/C++/examples/fitzhugh/main.cpp:60:39: note: candidate is:
/home/chris/C++/examples/fitzhugh/main.cpp:30:14: note: void Fitzhugh::deriv(const vector_type&, vector_type&, double)
/home/chris/C++/examples/fitzhugh/main.cpp:30:14: note: candidate expects 3 arguments, 0 provided
/home/chris/C++/examples/fitzhugh/main.cpp:60:56: error: no matching function for call to ‘Fitzhugh::jac()’
/home/chris/C++/examples/fitzhugh/main.cpp:60:56: note: candidate is:
/home/chris/C++/examples/fitzhugh/main.cpp:36:14: note: void Fitzhugh::jac(const vector_type&, matrix_type&, const double&, vector_type&)
/home/chris/C++/examples/fitzhugh/main.cpp:36:14: note: candidate expects 4 arguments, 0 provided
答案 0 :(得分:2)
要传递成员函数,您需要使用绑定机制。如果你有一个c ++ 11编译器,你可以使用std :: bind;包括std :: placeholders命名空间:using namespace std::placeholders;
然后使用来自<functional>
的std :: bind:
make_pair( bind( &Fitzhugh::deriv , &fitzhugh , _1 , _2 , _3 ) ,
bind( &Fitzhugh::jac , &fitzhugh , _1 , _2 , _3, _4 ) )