Ваше утверждение:
pj
должен быть массивом, содержащим коэффициенты полинома;
неверно.В соответствии с curve_fit () документами :
scipy.optimize.curve_fit (f, xdata, ydata, p0 = None, sigma = None, absolute_sigma = False, check_finite = True,bounds = (- inf, inf), method = None, jac = None, ** kwargs) [source] Использовать нелинейные наименьшие квадраты для подгонки функции f к данным.
Предполагается, ydata = f (xdata, * params) + eps
Это означает, что ваша функция pipoly()
, используемая curve_fit()
, должнапринять количество аргументов, равное количеству параметров вашего полинома плюс один (переменная, которая является первым аргументом).
Ошибка:
TypeError: pipoly () занимает 2 позиционныеаргументов, но было дано 3?
говорит вам, что pipoly
получает 3 аргумента, потому что вы, вероятно, тестировали линейный полиномиал, поэтому три аргумента были независимой переменной и двумя параметрами ([f-f0[j] for f in f_df[if0[j]:if0[i]]]
вещи - это список длиной 2).
Когда вы пишете, вместо него требуется только 2 аргумента.
Вы можете легко решить свою проблему, добавив звездочку перед pj
:
def pipoly(df,*pj):
n=len(pj) #len() is sufficient here, but np.size() works too.
p=pj[0]
for j in range(1,n):
p+=pj[j]*df**j
return p
Таким образом, ваша функция принимает переменное количество аргументов. Здесь подробнее о значении и использовании звездочки в параметрах функции python.