如何将复杂函数拟合到值数组?

问题描述 投票:0回答:1

我已经收集了实验数据,并被指示使用以下形式的复杂线性调频函数进行拟合:

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 成为另一个常规参数。

正如预期的那样,由于要拟合的函数中存在复数,我遇到了困难。您是否知道如何将复杂函数(仅实部)拟合到一组实值?

python curve-fitting complex-numbers data-fitting
1个回答
1
投票

您可以使用

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 ])

渲染效果如下:

© www.soinside.com 2019 - 2024. All rights reserved.