我试着做一个曲线拟合的测量数据,从一个拖油箱车厢。由于运输在测试期间移动,有两个输入变量,即时间t和位置x。
python说,popt有5个结果,而不是我预期的4个结果。
我想出了以下脚本:
import scipy.optimize
x = np.zeros( len(data_foil[str(rn)]['src1']['time']))
for j in range(1,len(data_foil[str(rn)]['src1']['time'])):
x[j] = x[j-1] + data_rough[str(rn)]['src1']['Vm'][j]*0.001
yy = data_rough[str(rn)]['src1']['Whm1']
t = data_rough[str(rn)]['src1']['time']
t = np.array(t)
yy = np.array(yy)
ff = np.fft.fftfreq(len(t), (t[1]-t[0])) # assume uniform spacing Fast Fourier Transformation
Fyy = abs(np.fft.rfft(yy))
guess_freq = abs(ff[np.argmax(Fyy[1:])+1]) # excluding the zero frequency "peak", which is related to offset
guess_amp = np.std(yy) * 2.**0.5
guess_offset = np.mean(yy)
guess = np.array([guess_amp, 2.*np.pi*guess_freq, 0.1, guess_offset])
g=9.81
def cosfunc(X, t, zeta_a, omega, p, c):
g=9.81
x,t = X
return zeta_a * np.cos((omega**2/g)*x - omega*t + p) + c
popt, pcov = scipy.optimize.curve_fit(cosfunc, (x, t), yy, p0=guess)
zeta_a, k, omega, p, c = popt发布于 2022-05-31 13:26:06
scipy.optimize.curve_fit中使用的函数“将自变量作为第一个参数,参数作为单独的其余参数”(源:文档)。
您的函数cosfunc有自变量作为前两个参数。因此,curve_fit假设第二个参数(t)是要优化的参数,因此它输出5个参数。
将cosfunc定义更改为将元组作为第一个参数应该可以解决您的问题。我认为这就是您想要做的,正如您的x,t = X行所建议的那样。
https://stackoverflow.com/questions/72447746
复制相似问题