【问题标题】:I'm having problems with scipy.optimize.curve_fit and getting RuntimeWarning: divide by zero encountered in double_scalars我在使用 scipy.optimize.curve_fit 时遇到问题,并且遇到 RuntimeWarning: 除以在 double_scalars 中遇到的零
【发布时间】:2021-07-19 22:47:55
【问题描述】:

我正在尝试使用 scipy.optimize.curve_fit 将曲线拟合到数组中。 这是我的代码:

def foubert(t,K,n):
    return (1+((1-0.0620281576)**(1-n)-1)*np.exp(-(1-n)*K*(t-3)))**(1/(1-n))

foub_params, _ = scipy.optimize.curve_fit(foubert,phi[:,0],phi[:,1])
K_f,n_f = foub_params

我通过使用参数得到的最接近曲线的是 K = 0.06 和 n = 2.5,但是我的代码不断返回 n 作为 ~1 并给我一个运行时警告,因为有一个 1/(1- n) 方程中的项。由于 n 显然不是 1,我该如何解决这个问题?

这是错误信息:

RuntimeWarning: divide by zero encountered in double_scalars
  return (1+((1-0.0620281576)**(1-n)-1)*np.exp(-(1-n)*K*(t-3)))**(1/(1-n))

【问题讨论】:

  • 由于 n 为 1 或非常接近它,因此分母为 0,因此出现错误。我不确定你为什么认为 n 不是 1。打印 n 来查看。此外,您可能希望将等式分解为多个部分以进行调试。它更清晰,更容易查看问题所在。不过一旦没有问题,最终版本就可以这样了。

标签: python scipy curve-fitting scipy-optimize


【解决方案1】:

使用curve_fit 时,如果您不提供初始起点 (p0),则它使用 [1, 1]。由于您在 n=1 处除以零,因此您必须提供初步估算。

如果您知道n > 1(我怀疑它可能来自等式的形式),那么您也可以定义bounds

例如,以K=1, n=2为起点,要求n>1

foub_params, _ = curve_fit(foubert, phi[:,0],phi[:,1], p0=[1, 2], bounds=[(-np.inf, 1.0), (np.inf, np.inf)])

更多细节可以在curve_fit的文档中找到

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2021-01-25
    • 2021-02-07
    • 1970-01-01
    • 2014-03-03
    • 2016-10-13
    相关资源
    最近更新 更多