在Python中,当函数通过数值积分获得时,如何拟合参数
我有一段Python代码,主要是用来数值计算一个叫做func
的函数在两个值之间的积分,并把最后的结果保存在counts_list
里。这个func
函数有一个参数叫omega_Rabi
。我现在的需求是,在得到counts_list
之后,我想把counts_list
和delta_list
进行拟合(因为counts_list
是通过func
得到的),然后找出omega_Rabi
的值。简单来说,我假设我已经知道了counts_list
,但想要找出生成这个结果的omega_Rabi
(现在我假设我并不知道这个值)。我该怎么做呢?我通常会使用curve_fit
,但到目前为止我尝试的都没有成功。谢谢!
import numpy as np
from scipy.integrate import solve_ivp
from scipy.optimize import curve_fit
pi = np.pi
omega = 2*pi*50000
omega_Rabi = 2*pi*170*6
def func(t, y, omega, delta, omega_Rabi):
c_up, c_down = y
dydt = [-1j*(omega_Rabi*np.sin(omega*t))*c_down,-1j*(omega_Rabi*np.sin(omega*t))*c_up-1j*delta*c_down]
return dydt
t_init = 0
t_fin = 0.00005
t_eval =np.arange(t_init,t_fin,t_fin/10000)
delta_list = 2*pi*np.arange(-10000,10001,4000)
delta_list = delta_list[np.where(delta_list != 0)]
counts_list = np.zeros(len(delta_list))
y0 = [0+0j,1+0j]
for i in range(len(delta_list)):
delta = delta_list[i]
sol = solve_ivp(func, [t_init,t_fin], y0,rtol=1e-9, atol=1e-11, t_eval=t_eval, args=(omega,delta,omega_Rabi))
y_up = abs(sol["y"][0])**2
counts_list[i] = y_up[-1]
1 个回答
0
下面这个函数可以解决这个问题:
def model(x, w):
y = []
for z in x:
sol = integrate.solve_ivp(func, [t_init, t_fin], y0, rtol=1e-9, atol=1e-11, t_eval=t_eval, args=(omega, z, w))
y.append(np.abs(sol["y"][0][-1])**2)
return np.array(y)
popt, pcov = optimize.curve_fit(model, delta_list, counts_list)
# (array([6408.84901332]), array([[1.80007176e-24]]))