Scipy curve_fit拟合时出现sqrt无效值警告问题求助
警告产生的原因
你猜的没错——问题就是拟合过程中参数a被尝试取了负值。
Scipy的curve_fit默认使用Levenberg-Marquardt优化算法,它在搜索最优参数时会遍历参数空间的各种可能值,包括不符合物理意义的负值。你的输入x(也就是omega)全是正数,当a为负时,x*a+1就会变成负数,传给np.sqrt自然会触发invalid value encountered in sqrt的警告。
虽然你的实验数据都是正的,但拟合是迭代寻优的过程,算法不会提前知道a必须为正,所以会尝试这些无效的参数值。
正确的解决方法
不要用abs()修改函数逻辑(这会扭曲你的拟合模型),直接给参数a设置非负边界,让curve_fit只在合理的参数空间内搜索:
修改curve_fit的调用代码:
popt, pcov = curve_fit(func_1T, w_omega, transmisivity, bounds=(0, np.inf))
这里bounds=(0, np.inf)强制参数a必须大于等于0,完全匹配你的物理模型(从函数形式看,这应该是低通滤波器的传递函数,a对应的是正数参数)。
替换后运行代码,警告会彻底消失,拟合结果也会更符合预期。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

