Как указал @ Ben.T, проблема в том, что param[3]
в вашем коде должно быть param[2]
.Если у вас есть список аргументов, например param
, который вы передаете функции по порядку один за другим (т. Е. func(..., param[0], param[1], param[2], ...)
), вы можете вместо этого просто передать их все сразу с помощью *param
.Начальная звездочка *foo
- это сокращение в синтаксисе Python , которое позволяет передавать сразу несколько аргументов вместо одного за раз.Использование ярлыков такого типа делает ваш код более легким для чтения и менее подверженным ошибкам, поскольку вам больше не придется беспокоиться об отдельных индексах param
.
. Вот полная рабочая версия вашего кода.Обратите внимание на использование *param
в строке, которая создает yfit
:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(x, a, b, c):
return ((a*(x**2)) + b*x + c)
iniguess = [2,0.038,13.99]
# make some fake example data
N = 1000
x = np.linspace(0, 10, N)
y = func(x, *iniguess)
# add some noise to make this a non-trivial curve fitting
y += np.random.normal(size=N)
param, pcov = curve_fit(func, x, y, p0=iniguess)
print(param)
plt.plot(x,y,'bo ')
yfit = func(x, *param)
plt.plot(x,yfit,'r-')
plt.legend(['data','fit'],loc='best')
Выход:
[ 1.99894963 0.04834206 14.0062958 ]