2013-03-13 64 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