1

次の odeint プログラムがあります。

#include <boost/array.hpp>
#include <boost/numeric/odeint.hpp>
using namespace std;

typedef boost::array< double , 1 > state_type;

void eqsystem(const state_type &x, state_type &dxdt, double t) {
    dxdt[0] = 3;
}

void write_system( const state_type &x , const double t ) {
    cout << t << '\t' << x[0] << endl;
}

int main(){
    double t0=0, t1=100;
    double tstep0=0.01;
    state_type x = {{ 0 }};
    cout<<"t\tValue"<<endl;
    boost::numeric::odeint::integrate( eqsystem , x , t0 , t1 , tstep0 , write_system );
}

毎回t10 の倍数なので、 に設定したいと思いx[0]=0.1ます。

つまり、定期的なデルタ関数が必要です。

あるいは、デルタ関数を有限数の時点で発生させることができれば、再発を近似することができます。

残念ながら、odeint でデルタ関数のドキュメントを見つけることができませんでした。これを達成する方法を知っている人はいますか?

4

1 に答える 1

0

これは odeint では、少なくとも一般的には不可能です。2 つの選択肢があります。

最初に、非常に鋭いガウス分布によってデルタ ピークを近似します。

第二に、ピークの時点に統合します。デルタ ピークを適用します。つまり、既存のソリューションにステップを追加し、この時点から次のピークまでの統合を開始します。

不連続性を持つ ODE には「エキゾチックな」方法もありますが、通常は ODE 自体に不連続性があり、外部駆動ではない場合を扱います。

于 2013-01-15T17:07:14.497 に答える