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

Python曲线拟合后按拟合参数m分段差异化绘图问题求助

曲线拟合分段显示实现方案

核心问题说明

原有代码的错误逻辑如下:

  • 在循环中重复调用curve_fit执行拟合操作,属于冗余计算,拟合仅需执行1次即可拿到全局参数m、n
  • 生成yfit1、yfit2时未做切片,每次都用全量x计算得到完整拟合曲线,最终绘制的两条拟合线完全重合,无法体现分段效果

修正后可运行代码

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

# 原始数据
x = [2, 1.95, 1.9, 1.85, 1.8, 1.75, 1.7, 1.65, 1.6, 1.55, 1.5, 1.45, 1.4, 1.35,
1.3, 1.25, 1.2, 1.15, 1.1, 1.05, 1.01]
y = [1, 1, 1, 1, 0.99, 0.938, 0.9, 0.857, 0.762, 0.686, 0.59, 0.529, 0.509, 0.47, 0.462, 0.452, 0.452, 0.452, 0.457, 0.43,0.424]

# 定义拟合函数
def func(x, m, n):
    return  1 - 1/2 * np.exp(-(x - m)/(n))

# 仅执行1次拟合获取参数
params, covs = curve_fit(func, x, y)
m, n = params
print("params: ", params)
print("covariance: ", covs)

# 转换为numpy数组方便布尔索引
x_arr = np.array(x)
y_arr = np.array(y)
# 计算全量拟合值
y_fit_all = func(x_arr, m, n)

# 拆分x>=m和x<m的两部分
mask_ge = x_arr >= m
mask_lt = x_arr < m

# 绘制原始数据分段
plt.plot(x_arr[mask_ge], y_arr[mask_ge], 'bo', linestyle='solid', marker=">", label="原始数据 x >= %.3f"%m)
plt.plot(x_arr[mask_lt], y_arr[mask_lt], 'go', linestyle='solid', marker="<", label="原始数据 x < %.3f"%m)

# 绘制拟合曲线分段
plt.plot(x_arr[mask_ge], y_fit_all[mask_ge], 'r-', linewidth=2, label="拟合曲线 x >= %.3f"%m)
plt.plot(x_arr[mask_lt], y_fit_all[mask_lt], 'orange', linestyle='--', linewidth=2, label="拟合曲线 x < %.3f"%m)

plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='best', fancybox=True, shadow=True)
plt.grid(False)
plt.show()

效果说明

  • 原始数据按照x和m的大小关系分别用蓝色右箭头、绿色左箭头区分,连线保持连续
  • 拟合曲线按照x和m的大小关系分别用红色实线、橙色虚线区分
  • 所有内容在同一画布展示,分段效果清晰可辨

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:15:00