曲线拟合将函数的输入解释为数组和标量

curve-fit interprets the input of a function both as array and scalar

我目前遇到了以下问题: 我想使用 curve_fit:

执行以下拟合
def fit_fun(x,c,gamma,B):
    return (c/3.)*np.log((60./pi)*np.sin(pi 
  *x/60.)+ gamma+B*v[x]

popt, pcov = curve_fit(fit_fun,range(1,60),entropy)

其中 v 和熵是给定的列表,我希望 c、gamma、B 是浮点标量。

我得到的错误信息如下:

"only integer scalar arrays can be converted to a scalar index"

据我了解,问题是由于 curve_fit 的实现是这样的,在某个点它将输入视为数组,不能用作索引函数定义的最后一项。 我不知道如何摆脱这个明显的矛盾,因为x首先是整数,然后在拟合过程中进入数组。

问题是您在 curve_fit 中的 x 值作为 -list- 传递,因此您不能将其用作 v 数组的索引。

我用模拟变量做了一个例子。如果您尝试打印发送到您的函数的值 (x) 是一个列表。我还将 X 值转换为 int。无论如何,我更改了 v 的索引。我不知道这样曲线是否正确拟合

from scipy.optimize import curve_fit
import numpy as np
from numpy import pi

entropy = [0.1 for i in range(60)]
v = [i for i in range(60)]

def fit_fun(x, c, gamma, B):
    return (c/3.) * np.log(60./pi)  * np.sin(pi * x/60.) + gamma + np.array(B) * [v[int(i)] for i in x]

popt, pcov = curve_fit(fit_fun, np.array([i for i in range(0,60)]), entropy)