Как я могу успешно сопоставить данные с потенциалом Морзе с помощью scipy.optimize.curve_fit?

#scipy #curve-fitting

Вопрос:

У меня есть список расстояний и энергий, и я пытаюсь подогнать его к потенциалу Морса, используя scipy.optimize.curve_fit. Данные являются:

расстояния: [0.7, 0.78, 0.86, 0.94, 1.02, 1.1, 1.18, 1.26]

энергии: [-1428.03995379, -1428.13375727, -1428.18294153, -1428.20472839, -1428.20977469, -1428.2047732, -1428.19393863, -1428.17996123]

и потенциал Морзе таков:

 def morsePotential(r, D, alpha, r0):
    return D * (1 - np.exp(-alpha * (r - r0)))**2
 

Когда я это сделаю

 param, cv = curve_fit(morsePotential, distances, energies, np.array([0.005, 10, 1.0]))
D, alpha, r0 = param
 

scipy говорит, что он не может оценить ковариацию, и подгонка дает совершенно нелепый результат, например D < У меня также возникают проблемы с подгонкой этих данных к гармоническому потенциалу, что еще более тревожно. Что я могу сделать, чтобы подтолкнуть curve_fit в правильном направлении? Прямо сейчас он либо возвращает бессмысленные значения, либо полностью выходит из строя.

Комментарии:

1. Проверьте свои предположения о моделировании. Все значения в energies являются отрицательными значениями, близкими к -1428, но функция, определенная как morsePotential , никогда не может быть отрицательной, поэтому что-то в корне неверно в вашем подходе.

Ответ №1:

Как уже указывал Уоррен Векессер, функция y(r) = D * (1 — np.exp(-alpha * (r — r0)))**2 неудобна для правильной подгонки ее к заданным данным.

Конечно, лучший способ-найти лучшую модель из физических соображений. С другой стороны, предложенная ниже функция исходит только из математической корректировки. Это второе лучшее решение.

введите описание изображения здесь