解決する 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 ファイルを生成したいと考えています。つまり、すべてをコンパイルし、Windows コマンド プロンプトを開き、exe 出力をテキスト ファイルにパイプします。これにより、すべての反復がそこにスローされた 1 つの大きなファイルが生成されます。
これは、多数の反復を分析するのが非常に困難になります。
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 であることに注意してください。