2017-01-31 52 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); 

我找不到導致此錯誤的原因要麼。可以請別人幫我,找出我的代碼有什麼問題?

使用Boost 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

願意解釋一下downvoter的心意嗎?我找不到合適的副本。 –