复杂数据集曲线拟合问询:共享参数的双函数拟合实现
嘿,我看你现在是想给复数数据集做拟合,让实部和虚部的函数共享同一组参数,但目前是分开调用curve_fit分别拟合实部和虚部对吧?这样做的问题在于,两次拟合得到的参数a,b,c,d会是独立优化的,没法实现你想要的参数共享效果。我来给你调整下代码,实现同时拟合实部和虚部并共享参数的需求:
核心思路
把实部和虚部的计算合并成一个函数,让它返回拼接后的实部+虚部数组,同时把观测数据的实部和虚部也拼接成一个一维数组,这样curve_fit就能在一次拟合中同时最小化实部和虚部的残差,保证参数是两组数据共同优化出来的。
修改后的代码
import numpy as np from scipy.optimize import curve_fit # 假设k、kappa1、kappa2是你已经定义好的已知参数 # k = ... # kappa1 = ... # kappa2 = ... def combined_func(x, a, b, c, d): # 先计算完整的复数表达式 complex_term = (a + 1j*b) * (np.exp(1j*k*x - kappa1*x) - np.exp(kappa2*x)) + \ (c + 1j*d) * (np.exp(-1j*k*x - kappa1*x) - np.exp(-kappa2*x)) # 把实部和虚部拼接成一个一维数组返回 return np.concatenate([np.real(complex_term), np.imag(complex_term)]) # 准备拼接后的观测数据:实部在前,虚部在后 y_combined = np.concatenate([yReal, yImag]) # 执行拟合,可选传入初始参数p0帮助收敛 popt, pcov = curve_fit(combined_func, x, y_combined, p0=[1, 0, 1, 0]) # 输出共享的最优参数 print(f"最优参数:a={popt[0]:.4f}, b={popt[1]:.4f}, c={popt[2]:.4f}, d={popt[3]:.4f}")
补充说明
- 这样拟合出来的
popt就是实部和虚部共享的参数组,相比分开拟合,结果更符合你“共享参数”的需求 - 如果拟合收敛有问题,一定要给
curve_fit传入合理的初始参数p0,初始值越接近真实值,拟合成功率越高 - 确保
k、kappa1、kappa2是提前定义好的已知量,不能是未赋值的变量
内容的提问来源于stack exchange,提问作者Lars Milz
相关产品推荐
相关产品推荐

