Я хотел бы определить функцию, которая определяется как сумма по другим функциям. Например, если 4 объекта связаны друг с другом потенциалом гармоники c. Предположим, что общий потенциал определяется как сумма парного взаимодействия каждого объекта с другими объектами.
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
def func(r, kb, b0):
return kb * (r - b0)**2
def total(r):
sum_int=0
for i in range(0,4):
for j in range(0,4):
if j == i:
interaction = 0 # no self interaction
else:
interaction = func(r,globals()["kb_" + str(i) + str(j)],globals()["b0_" + str(i) + str(j)]) #pair energy
sum_int = sum_int + interaction
return sum_int
if __name__ == "__main__":
xdata = [1.3,1.35,1.4,1.45,1.5,1.55,1.6,1.65,1.7]
ydata = [-136.82,-164.87,-181.16,-188.53,-189.10,-184.49,-175.96,-164.51,-150.95]
x = np.array(xdata)
y = np.array(ydata)
plt.plot(x, y, 'bo', label='data')
popt, pcov = curve_fit(total, xdata, ydata)
print("Harmonic parameters")
diff=sum(abs(func(x, popt[0], popt[1]) - y)) / len(x)
print("AAE is")
print(diff)
plt.plot(xdata, func(xdata, *popt), 'r-',label='Hook: kb=%5.3f, b0=%5.3f' % tuple(popt))
plt.legend()
plt.show()
Я грубо закодировал, эта проблема и функция, кажется, работают. Однако, когда я пытаюсь подогнать функцию под тестовые данные, функция curve_fit не может найти подходящие параметры.
ValueError: Невозможно определить количество параметров подгонки.
Это правильный способ определения функции? Если так, как я могу исправить проблему с Curve_fit?