我已经收集了实验数据,并被指示使用以下形式的复杂线性调频函数进行拟合:
def func_M(x, a, x0, tau_p,b):
return a*np.exp(-2*np.log(2)*(x-x0)**2/tau_p**2 + b*1j*(x-x0)**2)
这里,“b”是在拟合函数中操作的参数。我尝试使用 scipy.optimize 中的 curve_fit 以及参数 x、a、x0 和 tau_p。我希望 b 成为另一个常规参数。
正如预期的那样,由于要拟合的函数中存在复数,我遇到了困难。您是否知道如何将复杂函数(仅实部)拟合到一组实值?
您可以使用
np.real
提取函数的实部。
假设您有以下数据集:
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
def model(x, a, x0, tau_p, b):
return np.real(a * np.exp(-2. * np.log(2.) * (x-x0) ** 2 / tau_p ** 2 + b * 1j * (x-x0) ** 2))
np.random.seed(12345)
x = np.linspace(0, 10, 500)
p = (2., 0.5, 5., 3.)
y = model(x, *p)
s = 0.1 * np.ones_like(x)
n = s * np.random.normal(size=s.size)
yn = y + n
对于此设置,不存在由于振荡而导致的收敛问题:
popt, pcov = optimize.curve_fit(model, x, yn)
# array([2.00348614, 0.49981811, 5.00040113, 3.0020764 ])
渲染效果如下: