odeint потокового наблюдателя и связанные с этим вопросы

У меня есть система из 4 связанных уравнений для решения и параметр Gamma [i] для итерации. Поскольку я довольно новичок в C ++, мой код очень элементарный. Если он выглядит утонченно и элегантно в некоторых частях, то только потому, что я адаптировал код от автора odeint. :)

Этот вопрос относится к (http://stackoverflow.com/questions/12060111/using-odeint-function-definition/12066958#comment16253600_12066958), но не совсем так. Пожалуйста, не удаляйте это. :(

Вопросы были вставлены между строками кода.

#include <iostream>
#include <iterator>
#include <algorithm>
#include <boost/numeric/odeint.hpp>
#include <cmath>
#include <vector>
#include <fstream>
#include <iomanip>

using namespace std;
using namespace boost::numeric::odeint;
class NLI_class {
private:
    double gamma;
public:
 NLI_class (double r) : gamma(r) {} 

 void operator()( vector<double> &u , vector<double> &du , double z ) {
            du[0] = u[0]*u[1]*cos(u[3]); //u1
            du[1] = -u[0]*u[0]*cos(u[3]); //u2
            du[2] = gamma * (2/(u[0]*u[0]) - 1/(u[1]*u[1])); //theta
            du[3] = gamma * (1.0/(u[0]*u[0])); //phi1
            du[4] = gamma * (1.0/(u[1]*u[1])); //phi2;

}
};

Вопрос 1:

В моей исходной программе у меня было что-то вроде этого, чтобы передать вывод в файл CSV:

 inline void save(vector<double>& v, string filename)
  {
ofstream output(filename);
for(int i=0;i<v.size();++i){ 
    output << setprecision(64) << v[i] << endl;
}
   }

Как мне настроить streaming_observer, чтобы делать то, что делает мой save ()? По сути, я хочу создавать файлы .csv для каждой итерации i. На данный момент, я делаю это ужасным образом, то есть компилирую все, открываю командную строку Windows и затем отправляю вывод exe в текстовый файл. Это создает один большой файл со всеми итерациями.

Это становится очень болезненным для анализа для большого количества итераций.

struct streaming_observer {

 std::ostream &m_out;
 streaming_observer( std::ostream &out ) : m_out( out ) {}

 void operator()( const vector<double> &x , double t ) const
 {
      m_out << t;
      for( size_t i=0 ; i < x.size() ; ++i )
          m_out << "\t" << x[i];
      m_out << "\n";
 }
};




    int main(){

vector<double> x( 5 );
vector<double> Gamma;
vector<double>delta;
const double  pi=acos(-1.0); 
short delta_n=5;
const double delta_step=(2*pi)/delta_n;
const double dz = 0.01;
const double  zeta = 3.0;
const double  theta_initial=0.0;
const double  u20=tanh(zeta); 
const double  u10=sqrt(1.0-(u20*u20)); 

double d=0.0;
double G=0.0;

for(int i=0;i<=delta_n;i++){
    //When i=0, the d=0.0 and G=0.0 are pushed into the vector.
    delta.push_back(d);  
    Gamma.push_back(G);
    // Compute delta and Gamma
    d=d+delta_step; 
    G=-u10*u10*u20*sin(theta_initial+d);
}

save(delta,"delta.csv");
save(Gamma,"Gamma.csv");

Вопрос 2: Результаты, которые я здесь получаю, не согласуются с тем, что я получаю с помощью простого явного метода Эйлера. Следовательно, я хотел бы видеть коэффициенты RK4 (желательно выгрузить их в файл) или промежуточные этапы. Как я могу получить эту информацию?

//Numeric Integration
    for (unsigned i = 0; i < Gamma.size(); ++i) {
        x[0] = u10;
        x[1] = u20;
        x[2] = 0.0;
        x[3] = 0.0;
        x[4] = 0.0;

        NLI_class nli_obj(Gamma[i]);
        integrate_const( runge_kutta4< vector<double > >(), nli_obj, x , 0.0 , 3.0 , dz,streaming_observer( std::cout ) );
}
    }

Спасибо всем, кто помог!

Редактировать: Есть ли какой-нибудь способ получить оценку ошибки при запуске? Обратите внимание, что u [0] * u [0] + u [1] * u [1] = 1 всегда.

Ответы на вопрос(1)

Ваш ответ на вопрос