Во-первых, нужно найти функцию, которую можно отправить на scipy.curve_fit
, с некоторыми параметрами, которые могли бы описать нужные нам функции, а именно 1/x
и 1+1/(2x)
:
h(x)=a+1/(b*x)
.
Это даст верхнюю и нижнюю границы для параметров следующим образом:
1/x
для a=0
, b=1
и
1+1/(2x)
для a=1
, b=2
Это означает, что a
в [0,1]
и b
в [1,2]
.
Теперь я смогу сказать scipy.curve_fit
, что он должен выбирать параметры a
, b
и c
, чтобы оставаться в пределах:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# Generate data
a_true,b_true=.45,1.35
h=lambda x,a,b: a+1/(b*x)
N=100
xmin=0.1
xmax=0.499
x=np.linspace(xmin,xmax,N)
y=h(x,a_true,b_true)+np.random.normal(0,0.05,N)
plt.plot(x,1/x,label="1/x")
plt.plot(x,1+1/(2*x), label="1+1/(2x)")
plt.plot(x,y)
plt.legend()
plt.show()
# Do curve fit
popt, pcov =curve_fit(h,x,y,bounds=[(0,1),(1,2)])
print(popt)
plt.plot(x,1/x,label="1/x")
plt.plot(x,1+1/(2*x), label="1+1/(2x)")
plt.plot(x,h(x,*popt))
plt.show()