在Python中,当函数通过数值积分获得时,如何拟合参数

0 投票
1 回答
57 浏览
提问于 2025-04-14 17:47

我有一段Python代码,主要是用来数值计算一个叫做func的函数在两个值之间的积分,并把最后的结果保存在counts_list里。这个func函数有一个参数叫omega_Rabi。我现在的需求是,在得到counts_list之后,我想把counts_listdelta_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]]))

在这里输入图片描述

撰写回答