如何用curve_fit将复chirp函数的实部拟合到实验数据?
复Chirp函数实部拟合方案
要解决curve_fit无法直接处理复函数的问题,核心是提取复函数的实部作为拟合目标函数,将问题转化为常规的实值函数拟合任务,具体步骤如下:
1. 定义实值拟合函数
原复函数的实部可通过欧拉公式展开:exp(A + iB) = exp(A) * cos(B) + i*exp(A)*sin(B),其中:
A = -2*np.log(2)*(x-x0)**2/tau_p**2B = b*(x-x0)**2
提取实部后的拟合函数如下:
import numpy as np from scipy.optimize import curve_fit def func_M_real(x, a, x0, tau_p, b): exp_real = np.exp(-2 * np.log(2) * (x - x0)**2 / tau_p**2) cos_term = np.cos(b * (x - x0)**2) return a * exp_real * cos_term
2. 准备数据与初始参数
- 实验数据:替换为你已有的实值自变量
x_data和因变量y_data - 初始参数猜测:需要给出
[a_guess, x0_guess, tau_p_guess, b_guess],初始值要尽量接近真实值:a_guess:取y_data的最大值(对应高斯包络的峰值)x0_guess:取x_data的中点或数据峰值对应的x值tau_p_guess:根据数据半高宽估算(高斯函数半高宽为tau_p * np.sqrt(np.log(2)/2))b_guess:可先设为0(对应无啁啾高斯函数)或根据数据振荡频率估算
3. 执行拟合
调用curve_fit拟合实值函数:
# 示例:生成模拟数据(替换为你的实验数据) x_data = np.linspace(-5, 5, 200) true_a, true_x0, true_tau_p, true_b = 3, 0, 2, 0.5 y_data = func_M_real(x_data, true_a, true_x0, true_tau_p, true_b) + np.random.normal(0, 0.1, len(x_data)) # 设置初始参数 initial_guess = [np.max(y_data), np.mean(x_data), 2.5, 0.3] # 执行拟合 popt, pcov = curve_fit(func_M_real, x_data, y_data, p0=initial_guess) # 输出拟合参数 a_fit, x0_fit, tau_p_fit, b_fit = popt print(f"拟合参数:a={a_fit:.3f}, x0={x0_fit:.3f}, tau_p={tau_p_fit:.3f}, b={b_fit:.3f}")
4. 验证拟合结果
通过绘图对比原始数据与拟合曲线:
import matplotlib.pyplot as plt y_fit = func_M_real(x_data, *popt) plt.scatter(x_data, y_data, label='实验数据', s=5) plt.plot(x_data, y_fit, 'r-', label='拟合曲线') plt.legend() plt.xlabel('x') plt.ylabel('y') plt.show()
注意事项
- 若拟合不收敛,优先检查初始参数是否合理,可通过
bounds参数限制参数范围 - 若实验数据存在噪声,可传入
sigma参数指定数据误差估计,提升拟合精度
内容的提问来源于stack exchange,提问作者Fernando Sánchez Avilés
相关产品推荐
相关产品推荐

