Ошибка индекса при подборе полинома к данным - PullRequest
0 голосов
/ 27 ноября 2018

Ошибка индекса при попытке подгонки порядка> 1 полинома к данным:

import numpy as np
from scipy.optimize import curve_fit

x =  b #1D array for X Axis
y =  c #1D array for Y Axis

def func(x, a, b,c):
     return ((a*(x**2)) + b*x + c)  

iniguess = [0,0.038,13.99]
param, pcov = curve_fit(func, x, y, p0=iniguess)

print (param[0],param[1],param[2])

import matplotlib.pyplot as plt
plt.plot(x,y,'bo ')
xfit = b
yfit = func(xfit, param[0], param[1], param[3])
plt.plot(xfit,yfit,'r-')
plt.legend(['data','fit'],loc='best')

Это дает мне код ошибки, когда я пытаюсь вычислить мои предсказанные значения Y.Ошибка: « индекс 3 выходит за пределы оси 0 с размером 3 »

1 Ответ

0 голосов
/ 27 ноября 2018

Как указал @ 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 ]

enter image description here

...