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