При запуске строки
plt.plot(x1, f(x1, *popt))
вы передаете x1 в качестве первого параметра в функцию f. Первый параметр вашей функции f - это.
def f(a,n,x1):
return (a*no.power(x1,-n))
Даже если вы вызываете свой первый параметр x1, функция заботится о порядке передачи переменных, а не об именах переменных. Таким образом, поскольку вы определили, что f принимает три аргумента, a, n и x1, при передаче x1 переменная x1 обрабатывается как a.
Переупорядочение определения функции, чтобы x1 был первым параметром, должно это исправить.
import numpy as np
import scipy.optimize as optimize
import matplotlib.pyplot as plt
x = np.array([367.18,411.42,443.76,565.22,689.31,778.94,867.38,963.98,1085.79,1112.01,1212.47,1299.21,1408.08,1458.8,1528.76])
y = np.array([17.21,13.38,9.41,11.40,6.40,6.62,6.11,5.50,5.03,4.52,2.34,3.62,3.84,5.97,1.97])
def f(x1,a,n):
return (a*np.power(x1,-n));
popt, pcov = optimize.curve_fit(f,x,y, diag=(1./x.mean(),1./y.mean()))
x1 = np.linspace(0,1700,num =1700)
plt.plot(x1, f(x1, *popt))
plt.plot(x,y,'ro')
plt.show()
print(popt, pcov)