You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:45:38