2017-01-31 11 views
1

Я использую boost/odeint для решения оды первого порядка.boost odeint слишком много аргументов для функции

Определение системы в raman_system.h выглядит следующим образом:

class raman_signal_system { 
    double alpha_s; 
    double dB_to_neper; 
    double g_pump_b; 
    double P_p; 

public: 
    raman_signal_system() 
     : alpha_s(0.00021181), 
      dB_to_neper(0.23025850929940458), 
      g_pump_b(0.00044446), 
      P_p(0.494) {} 

    void operator() (const double P_s, double& dPsdz, const double z) 
    { 
     dPsdz = -alpha_s * dB_to_neper * P_s + P_s * P_p * g_pump_b; 
    } 
}; 

Мой main метод raman.cpp следующим образом:

/** 
* @author Harun Kara 
* @date 23.01.2017 
* @brief Implementaion of the Raman amplification for fiber communications systems 
*/ 

#include "raman_system.h" 

#include <fstream> 
#include <iostream> 
#include <vector> 

#include<boost/numeric/odeint.hpp> 





int main(int argc, char *argv[]) { 

    namespace odeint = boost::numeric::odeint; 

    odeint::runge_kutta4<double> rk4; 

    raman_signal_system sys(); 

    double P_s = 0.00079433; 

    double z = 0.0; // initial (forward/signal) 

    double l = 80e3; // Fiberlenght in m 
    size_t steps = 200; 

    const double dz = l/steps; // stepsize 

    std::vector<double> P_s_vec; 
    std::vector<double> places; 
    P_s_vec.push_back(P_s); 
    places.push_back(z); 

    for(size_t i=0; i<steps; ++i) { 
     rk4.do_step(sys, P_s, z, dz); 
     z += dz; 

     P_s_vec.push_back(P_s); 
     places.push_back(z); 
    } 

    return 0; 
} 

Если я пытаюсь построить, я получаю следующее сообщение об ошибке :

/home/kara/raman/src/raman.cpp:43: required from here 
/home/kara/raman/include/boost/numeric/odeint/stepper/base/explicit_stepper_base.hpp:229: error: too many arguments to function 
     sys(x , m_dxdt.m_v ,t); 

Я не мог найти причину этого ошибки или. Может ли кто-нибудь помочь мне, узнать, что не так с моим кодом?

Использование подталкивание 1.60.0, Qt, CMake

ответ

1

Эта линия

raman_signal_system sys(); 

распознается компилятором как локальной функции декларации, следовательно, сообщение об ошибке, что слишком много аргументов, передаваемых этой функции ,

Чтобы инициализировать переменную, используя его конструктор по умолчанию, просто написать

raman_signal_system sys; // <<<< No parenthesis 

После переменная sys правильно объявлена, перегруженный вызов operator() должен работать нормально:

sys(x , m_dxdt.m_v ,t); 
+1

Большое спасибо. Это решило проблему. –

+0

Может ли увольняющий мозг объяснить, пожалуйста? Я не мог найти соответствующий дубликат. –