ax2 - bx3 + lx4
Значения x и y для подгонки также генерируются из кода, значения x генерируются с помощью numpy.linspace. Я ограничил параметры a, b, c так, чтобы они всегда были положительными. Мне нужна была подгонка, чтобы имитировать данные таким образом, чтобы, как минимум, высота локальных максимумов и положение глобальных минимумов были точными. Вместо этого я получаю вот что: синим цветом показаны фактические данные, пунктирная линия соответствует заданной модели.
Вот соответствующая часть моего кода:
Код: Выделить всё
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.interpolate import *
v =246.
x = np.linspace(0.1, 270.1, 27001)
Xdata = x/v
def func(x,a,b,l):
return (a*(x**2)) - (b*(x**3)) + ((l)*(x**4))
temp = np.linspace(80.,80.,1)
b = np.zeros_like(temp)
a = np.zeros_like(temp)
l = np.zeros_like(temp)
Vfit = pot_giver(temp[0]) #External func.
Ydata = (Vfit - Vfit[0])/(pow(v,4))
popt, pcov = curve_fit(func, Xdata, Ydata,bounds=((0.,0.,0.), (np.inf,np.inf,np.inf)))
b[0],a[0],l[0] = popt
plt.plot(Xdata,Ydata)
plt.plot(Xdata, func(Xdata, *popt), 'g--')
plt.show()
Здесь «Xdata» и «Ydata» находятся в первом и втором столбцах соответственно:
Данные
Подробнее здесь: https://stackoverflow.com/questions/792 ... g-this-fit
Мобильная версия