У меня есть следующая программа 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 );
}
Каждый раз t
кратно 10, я хотел бы установить x[0]=0.1
,
То есть я хотел бы иметь повторяющуюся дельта-функцию.
В качестве альтернативы, если бы я мог иметь дельта-функцию, возникающую в конечном количестве моментов времени, я мог бы аппроксимировать повторение.
К сожалению, я не смог найти документацию по дельта-функциям в odeint. Кто-нибудь знает, как этого добиться?
Это невозможно в odeint, по крайней мере, не в общем. У вас есть две альтернативы:
Сначала приблизимся к дельта-пикам очень острых гауссиан.
Во-вторых, интегрируйте в момент пика. Примените дельта-пик, то есть добавьте шаг к существующему решению и начните интегрировать с этой точки до следующей вершины и так далее.
Существуют также «экзотические» методы для ODE с разрывами, но они обычно относятся к случаю, когда у самого ODE есть разрывы, а не ваше внешнее вождение.
Других решений пока нет …