You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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**2
  • B = 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:12:40