Scipy.least_squares初始点残差有限却报非有限值错误排查
问题描述
使用scipy.least_squares将包含微分方程的复杂模型拟合到数据中,模型采用前向欧拉法求解,对应3组不同初始条件(每组匹配一组待拟合数据)。误差函数errfunc计算每组模拟值与数据的差值并拼接,目标是优化4个正数参数。
运行算法时返回错误:
ValueError: Residuals are not finite in the initial point.
但手动调用errfunc验证初始点残差:
residual = errfunc(param, t_data1, y_data1, t_data2, y_data2, t_data3, y_data3) print(np.all(np.isfinite(residual)))
返回True,且残差图显示结果合理。
该模型是在之前正常运行的相似模型基础上,新增了微分方程项与一个极小参数(约1e-29),询问引发错误的未考虑因素。
优化代码如下:
param = np.array([param1_init, param2_init, param3_init, param4_init]) result = least_squares(errfunc, param, bounds=(0,np.inf), args=(t_data1, y_data1, t_data2, y_data2, t_data3, y_data3))
可能的排查方向
- 算法内部的参数扰动:
scipy.least_squares在初始化阶段计算雅可比矩阵时,可能会对初始参数做微小数值差分扰动。你的极小参数(1e-29)在扰动后可能下溢为0,或者与前向欧拉法的步长交互,引发微分方程求解中的除以零、数值溢出等问题,进而产生非有限残差。 - 参数边界的处理逻辑:虽然设置了
bounds=(0, np.inf),但算法在处理边界约束时,可能会尝试参数等于0的试探值。如果你的模型在参数为0时存在奇点(比如微分方程中的项变为0导致计算崩溃),就会触发非有限残差。 - 浮点数精度极限问题:1e-29已经接近双精度浮点数的精度临界范围,在
least_squares内部的残差缩放、雅可比计算等流程中,可能出现精度丢失、下溢或上溢,产生NaN/inf值,而手动调用时的计算路径未触发该问题。 - errfunc的环境差异:检查
errfunc是否依赖全局变量,或者在least_squares调用时的数据传递是否出现维度、类型变化,导致残差计算逻辑与手动调用时不一致。
内容的提问来源于stack exchange,提问作者JHutch
相关产品推荐
相关产品推荐

