2013-08-01 30 views
1

我使用pygsl中的multifit_nlin模塊進行非線性最小二乘擬合。 pygsl是c數字庫gsl的python綁定。我遇到的問題似乎與pygsl或gsl沒有關係,但它只出現在這個上下文中。gsl,pygsl,lmsder,內存泄漏,輸出不一致

我正在爲一些數據擬合一個函數的參數。要使用pygsl進行參數擬合,我需要定義函數和它的jacobian。然後multifit_nlin的fitter lmsder在擬合過程中需要時調用這兩個函數。當我打電話給雅可比時,它會產生一個數字矩陣。我可以輸出這個矩陣到屏幕上,我看到這個數字是正確的。接下來,我定義一個lmsder類並使用lmsder.set命令對其進行初始化。我輸出帶有lmsder.getJ()命令的雅可比矩陣進行屏幕顯示,並看到與以前相同的數字。當然,這不是我想要用我的代碼做的事情,而只是爲了說明和調試目的。

由於lmsder.getJ()訪問由雅可比函數產生的內存中的雅可比矩陣,因此雅可比和lmsder.getJ()的輸出之間的一致性是您所期望的。但是,如果我插入一行代碼,比如打印「鮑勃」(或其他任何東西),如下面的

system = gsl_multifit_function_fdf(...) # jacobian is passed here 
solver = lmsder(...)     # system is passed here 
solver.set(...)       # first call to jacobian is in here 
print "bob" 
print solver.getJ() 

哪裏..​​.是指適當的參數,然後打印solver.getJ()打印這是一個矩陣,它是雅可比矩陣的轉置,下行填充隨機內容,所以只有在set()和getJ()調用之間存在額外的代碼行時纔會發生這種情況。如果雅可比矩陣確實是getJ()命令所顯示的那樣,那麼就會有相當多的地方會出現異常,所以我知道確定我的代碼有效,也是可以的使用我得到的參數值是合理的。

我也跟蹤了pygsl一直到gsl的c庫的調用鏈。沒有什麼會導致這個問題。此外,gsl已經過了很長時間,並且像顯示矩陣一樣簡單的事情早在幾年前就已經修復過了。

任何可能導致此問題的原因的建議?垃圾收集器,導入語句的錯誤排序,多核?我可以使用哪些工具來檢查內存泄漏和垃圾回收進程?

感謝, 亞歷山大

回答