1
我有一个使用“odeint”模拟种群动态的程序。我想设置一个if条件来禁止我的颂歌的结果被否定。这里是我的代码摘要:odeint禁止负值
class Communities
{
public :
typedef boost::array< double , 22 > state_type;
Communities(...);
~Communities();
void operator()(state_type &x , state_type &dxdt , double t);
void operator()(state_type &x , const double t);
void integration(par::Params parParam);
private:
...
};
void Communities :: operator()(state_type &x , state_type &dxdt , double t)
{
for (int i=0; i<nb ; ++i)
{
dxdt[i] = ...
}
for (int j=0; j<g ; ++j)
{
dxdt[j] += ...
}
for (int k=0; k<nb+g ; ++k)
{
if (x[k] <0)
{
x[k] = 0;
}
}
}
...
void Communities :: integration(par::Params parParam)
{
...
integrate_adaptive(make_controlled(1E-12 , 1E-12 , runge_kutta_fehlberg78<state_type>()) , boost::ref(*this), B , 0.0 , 10.0 , 0.1 , boost::ref(*this));
}
int main(int argc, const char * argv[])
{
...
Com1.integration(ParamText);
return 0;
}
书面,下面的循环是没用的:
for (int k=0; k<nb+g ; ++k)
{
if (x[k] <0)
{
x[k] = 0;
}
}
你有足够的了解该计划?你有什么想法,我怎么能使它工作?
谢谢!
的integrate_adaptive
template< class Stepper , class System , class State , class Time , class Observer >
size_t integrate_adaptive(
Stepper stepper , System system , State &start_state ,
Time &start_time , Time end_time , Time &dt ,
Observer observer , controlled_stepper_tag
)
{
typename odeint::unwrap_reference<Observer>::type &obs = observer;
typename odeint::unwrap_reference<Stepper>::type &st = stepper;
const size_t max_attempts = 1000;
const char *error_string = "Integrate adaptive : Maximal number of iterations reached. A step size could not be found.";
size_t count = 0;
while(less_with_sign(start_time , end_time , dt))
{
obs(start_state , start_time);
if(less_with_sign(end_time , static_cast<Time>(start_time + dt) , dt))
{
dt = end_time - start_time;
}
size_t trials = 0;
controlled_step_result res = success;
do
{
res = st.try_step(system , start_state , start_time , dt);
++trials;
}
while((res == fail) && (trials < max_attempts));
if(trials == max_attempts) BOOST_THROW_EXCEPTION(std::overflow_error(error_string));
++count;
}
obs(start_state , start_time);
return count;
}
Humm ...很奇怪我的integrate_adaptive不一样(请参见问题),并且x没有声明,所以我不能使用这个循环。 – Myotis 2014-10-09 16:54:40
当然,这是一个精简版的integrate_adaptive。当然你可以使用这两个。任何应该''start_state'与'x' – headmyshoulder 2014-10-09 17:29:48