2013-03-13 63 views
0

我正在尝试用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_timefinal_time/10代码执行,但结果则没有任何意义。即使解决者之后没有做任何事情,异常仍然会抛出,could not allocate space for gsl_interp_accel,虽然。

我试图在几个(很多)循环上擦除循环,擦除内存之间的内存,但这并没有多大帮助。

如果这一点很重要,我使用Ubuntu 12.10,使用GNU编译器和Intel C++ Composer进行编译。也在Mac上进行测试(不知道哪个版本的操作系统)具有相同的结果。

问题是:有没有办法在求解器上“作弊”并使程序正常工作?

P.S .: ODEint求解器,具有获得中间结果的更智能方法,也会引发异常。

+0

你可以给出一个小的自包含的例子,其中的错误发生?系统的尺寸有多大? – headmyshoulder 2013-03-13 20:27:12

+0

大小为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

+0

好的,这是否意味着您有一个8个耦合ODE的小系统,并且您执行了大量的集成步骤并将每个步骤的结果存储在一个容器中?也许你应该尽量在不储存所有数据的情况下进行分析? – headmyshoulder 2013-03-14 09:56:56

回答

1

我遇到过类似的问题。该程序在某个final_time时以bad_alloc错误终止。如果我缩短积分时间,程序将适当地终止,但这不是我想要的。然后我从1e-9减少epsabs到1e-6,程序可以正常运行,直到我需要的最后时间。

这不是一个解决方案,而是一个妥协。

+0

我很抱歉,我在ODE的右侧功能中发现了我的错误。我在那里使用'新',但忘记'删除'。 – 2014-08-19 02:43:56