我正在使用 pygsl 的 multifit_nlin 模块进行非线性最小二乘拟合。pygsl 是 c 数值库 gsl 的 python 绑定。我遇到的问题似乎与 pygsl 或 gsl 无关,但它只出现在这种情况下。
我正在将函数的参数拟合到某些数据。要使用 pygsl 进行参数拟合,我需要定义函数及其 jacobian。然后multifit_nlin的fitter lmsder在拟合过程中需要时调用这两个函数。当我调用 jacobian 时,它会生成一个数字矩阵。我可以将此矩阵输出到屏幕上,并且我看到数字是正确的。接下来,我定义一个 lmsder 类并使用 lmsder.set 命令对其进行初始化。我使用 lmsder.getJ() 命令将雅可比矩阵输出到屏幕,我看到的数字与以前相同。当然,这不是我想要对我的代码执行的操作,仅用于说明和调试目的。
jacobian 和 lmsder.getJ() 的输出之间的一致性是您所期望的,因为 lmsder.getJ() 访问由 jacobian 函数生成的内存中的 jacobian 矩阵。但是,如果我插入一行代码,请说 print 'bob" (或其他任何内容),如下所示
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()
其中 ... 表示适当的参数。然后 print solver.getJ() 打印一个矩阵,该矩阵是雅可比矩阵的转置,较低的行填充了随机内容。再说一次,这只发生在 set() 和 getJ() 调用之间有额外的代码行时。
如果我正常执行我的代码,即我拥有的整个拟合过程,代码可以正常工作。如果雅可比矩阵确实是 getJ() 命令所显示的内容,那么在很多地方都会引发异常。因此,我确定我的代码可以正常工作,并且因为我为参数获得的值是合理的。
我还跟踪了 pygsl 一直到 gsl 的 c 库的调用链。没有什么会导致这个问题。此外,gsl 已经存在了很长时间,并且像显示矩阵这样简单的东西在很久以前就已经修复了。
对可能导致此问题的原因有任何建议吗?垃圾收集器,导入语句的错误顺序,多核?我可以使用哪些工具来检查内存泄漏、垃圾收集过程?
谢谢,亚历山大