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

如何调整Matplotlib拟合曲线形态?复现指定拟合曲线求助

解决拟合曲线起始与平稳的问题

你的核心问题是拟合函数选型错误——你用的a*exp(-b*x)+c是指数衰减曲线,天生无法满足x=0时y=0、x增大后趋近于1的需求。

换成饱和增长型的指数函数就能完美匹配原图趋势,推荐使用1 - np.exp(-k * x):

  • x=0时,y=0,符合起始要求
  • x→∞时,y→1,满足趋近于1后平稳的需求
  • 曲线为单调递增的S型,和原图虚线的"Partial Superparticle Ionisation"趋势完全一致

修改后的完整代码

import numpy as np
import scipy.optimize as opt
import matplotlib.pyplot as plt 

# 原始数据
x = np.array([0.3, 0.6, 0.7, 0.8, 1.3, 1.5, 3, 4, 5])
y = np.array([0, 0.1, 0.3, 0.55, 0.75, 0.9, 1, 1, 1])

# 更换为符合需求的拟合函数:饱和增长指数函数
def func(x, k):
     return 1 - np.exp(-k * x)

# 拟合时给出初始猜测,帮助curve_fit更好收敛
optimizedParameters, pcov = opt.curve_fit(func, x, y, p0=[0.5])

# 生成密集x点,绘制平滑的虚线拟合曲线
x_fit = np.linspace(0, 5, 100)
plt.plot(x_fit, func(x_fit, *optimizedParameters), label="Partial Superparticle Ionisation", linestyle='--')

# 绘图设置
plt.ylim(0, 1.1)
plt.xlim(0, 5)
plt.step(x, y, label="Data")
plt.xlabel("Time (ns)")
plt.ylabel("$n_H^+ / n_H$")
plt.legend()
plt.show()

关键修改说明

  1. 函数替换:用1 - exp(-k*x)替代原衰减函数,完美匹配起始点和饱和值要求
  2. 平滑曲线:用np.linspace生成100个密集点,避免原代码只在原始数据点绘图导致的折线感
  3. 虚线样式:添加linestyle='--'还原原图的虚线效果
  4. 初始猜测:给curve_fit传入p0=[0.5],避免拟合时出现收敛异常
  5. 冗余修复:删除了重复导入的numpy

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:15:08