Как определить функцию как суммирование других функций с их уважаемыми параметрами и подгонкой параметров [python] - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы определить функцию, которая определяется как сумма по другим функциям. Например, если 4 объекта связаны друг с другом потенциалом гармоники c. Предположим, что общий потенциал определяется как сумма парного взаимодействия каждого объекта с другими объектами.

enter image description here

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?

...