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

含共享与独立参数的双指数曲线联合拟合异常问题求助

双指数共享参数拟合异常解决方案

问题核心原因

双指数拟合属于典型的非线性拟合,scipy的curve_fit默认所有参数初始值为1,完全不匹配你的数据特征,导致拟合过程陷入局部最优,才会出现曲线强行贴合最后一个数据点的异常情况。

具体修正步骤

  1. 补充合理的初始参数估计:根据x=0位置的y值可以快速估算A类参数的大致范围,同时根据数据随x增大衰减的特征,可以确定T1、T2为负值,以此设置初始值大幅降低拟合陷入局部最优的概率。
  2. 可选添加参数约束:限定T1、T2为负值,避免拟合出无物理意义的正指数结果。
  3. 绘图时x轴起始值避开0:你使用的是对数x轴,0在对数轴上无定义,调整拟合曲线的x采样范围即可避免显示异常。

修正后可运行代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

y1 = np.array([-12.852481,-30.782795,-27.368464,-41.604416,-37.335682,-67.12344,-113.15599,-102.833374])
y2 = np.array([26.30352,27.350178,30.479588,34.889896,14.752427,8.482291,-16.35122,-26.602728])
x = np.array([0.000, 0.003, 0.006, 0.015, 0.030, 0.066, 0.240, 0.700])
y = np.array([y1,y2])

def func(x, A, T1, B , T2):
    return A * np.exp(T1 * x ) + B * np.exp(T2 * x)

def combofunc(x,  A11, A12, A21, A22, T1, T2):
    return np.concatenate((func(x, A11, T1, A12, T2), func(x, A21, T1, A22, T2)))

# 新增初始参数设置和边界约束
p0 = [-15, 5, 35, -10, -1, -15]
bounds = ([-np.inf, -np.inf, -np.inf, -np.inf, -100, -100], [np.inf, np.inf, np.inf, np.inf, 0, 0])
fitted_params, pcov= curve_fit(combofunc,x,y.ravel(), p0=p0, bounds=bounds, maxfev=1000000)
A11, A12, A21, A22, T1, T2 = fitted_params

# 调整采样范围避开x=0适配对数轴
xx=np.linspace(x[1], x.max(), 1000)
y_fit_1 = func(xx, A11, T1, A12, T2)
y_fit_2 = func(xx, A21, T1, A22, T2) 

fig, ax = plt.subplots()
ax.scatter(x,y1,marker='s',color='b', label='y1原始数据')
ax.scatter(x,y2,marker='s',color='r', label='y2原始数据')
ax.semilogx(xx, y_fit_1,ls='--',color='b', label='y1拟合曲线')
ax.semilogx(xx, y_fit_2,ls='--',color='r', label='y2拟合曲线')
ax.legend()
plt.show()

效果说明

调整后拟合曲线会贴合所有数据点的整体变化趋势,不会再出现仅匹配最后一个点的异常。如果你的数据有明确的物理意义,还可以进一步调整初始值和边界约束,提升拟合精度。

内容的提问来源于stack exchange,提问作者Tek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:06:03