我正在尝试用GSL求解器求解(大)ODE系统。当我使用驱动程序方法时,我收到一条错误消息could not allocate space for gsl_interp_accel
,当我手动定义控制,错误和步进器时,我得到bad_alloc
异常,据我了解,异常导致could not allocate space for gsl_interp_accel
在另一种情况下 - 缺乏记忆。std :: bad_alloc和GSL ODE求解器
我已经咨询了其他bad_alloc
查询,如this one,但我还没有发现任何有用的东西在我那里的特殊情况。另外,我尝试了其他ODE解算器,但它们最终还是出现了内存错误。我还使用valgrind检查了我的程序,以确保除解算器以外的其他地方没有内存错误/泄漏。
任何解算器都具有“集成限制”,在我的情况下,程序可以正常工作10%左右的上限(与下限相比,这很大 - 我确信这是我得到的错误的根源 - 但我确实需要在这些特定的限制之间进行整合),然后以我上面引用的例外之一结束。我尝试了各种(固定/自适应)步长,但从未达到我想要的10%以上。
的一段代码,让一个例外是:
gsl_ode_struct inputstruct; // Struct that contains parameters for ODEs
gsl_odeiv2_system sys = {func, NULL, 2*G.getsize(), &inputstruct};
const gsl_odeiv2_step_type * T = gsl_odeiv2_step_rk8pd;
gsl_odeiv2_step * stepper = gsl_odeiv2_step_alloc (T, size_of_the_system);
gsl_odeiv2_control * control = gsl_odeiv2_control_standard_new (1.e-6, 0.0, 1., 0.);
gsl_odeiv2_evolve * error = gsl_odeiv2_evolve_alloc (size_of_the_system);
double hparam = 1.e-6; // Initial step size
double t = xspan[0]; // Initial time
while(t < final_time){
// Here the excpection comes
int status = gsl_odeiv2_evolve_apply (error, control, stepper, &sys, &t, final_time, &hparam, array);
if(status != GSL_SUCCESS)
break;
// Do some stuff that includes reading all the intermediate results to a container as I need them later.
}
gsl_odeiv2_evolve_free (error);
gsl_odeiv2_control_free (control);
gsl_odeiv2_step_free (stepper);
所以,如果我改变final_time
到final_time/10
代码执行,但结果则没有任何意义。即使解决者之后没有做任何事情,异常仍然会抛出,could not allocate space for gsl_interp_accel
,虽然。
我试图在几个(很多)循环上擦除循环,擦除内存之间的内存,但这并没有多大帮助。
如果这一点很重要,我使用Ubuntu 12.10,使用GNU编译器和Intel C++ Composer进行编译。也在Mac上进行测试(不知道哪个版本的操作系统)具有相同的结果。
问题是:有没有办法在求解器上“作弊”并使程序正常工作?
P.S .: ODEint求解器,具有获得中间结果的更智能方法,也会引发异常。
你可以给出一个小的自包含的例子,其中的错误发生?系统的尺寸有多大? – headmyshoulder 2013-03-13 20:27:12
大小为8,但最终时间非常大,> 1200,而初始时间为1.我已经找到了gsl_odeiv2_evolve_apply函数的代码,它是[here](http://fossies.org/dox/gsl-1.15 /_2evolve_8c_source.html)。 – 2013-03-14 09:00:48
好的,这是否意味着您有一个8个耦合ODE的小系统,并且您执行了大量的集成步骤并将每个步骤的结果存储在一个容器中?也许你应该尽量在不储存所有数据的情况下进行分析? – headmyshoulder 2013-03-14 09:56:56