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

如何获取曲线中y值开始趋于平滑稳定的(x,y)点?

如何找到曲线开始趋于稳定的点

要解决这个问题,核心思路是监测y值的变化率(即相邻y值的差值)——当变化率持续维持在很小的范围内时,就说明曲线开始进入平滑稳定的阶段了。下面我会结合你给出的示例,一步步实现这个逻辑:

方法1:基于一阶差分的连续稳定判断

这是最直接的思路:计算相邻y值的差值,当连续n个差值都小于设定的阈值时,就认为从这个点开始曲线稳定了。

代码实现

import numpy as np
import matplotlib.pyplot as plt

# 你的示例数据
x = list(range(10))
y = [0.3, 0.37, 0.41, 0.52, 0.64, 0.68, 0.71, 0.72, 0.73, 0.74]

# 1. 计算相邻y值的一阶差分(y[i+1] - y[i])
diff_y = np.diff(y)
print("相邻y的变化量:", diff_y)

# 2. 设定判断稳定的参数
threshold = 0.02  # 变化量小于这个值认为是"平稳"
window_size = 3   # 需要连续3个平稳变化才判定为稳定

# 3. 查找第一个符合条件的起始点
stable_start_idx = None
for i in range(len(diff_y) - window_size + 1):
    if all(diff_y[i:i+window_size] < threshold):
        stable_start_idx = i
        break

# 4. 转换为原数据的(x,y)点
if stable_start_idx is not None:
    target_x = x[stable_start_idx + 1]  # 差分索引比原y少1,所以+1
    target_y = y[stable_start_idx + 1]
    print(f"曲线开始稳定的点:({target_x}, {target_y})")
else:
    print("未找到符合条件的稳定点")

# 绘图验证
plt.plot(x, y, marker='o', label='原始曲线')
plt.scatter(target_x, target_y, color='red', s=120, zorder=5, label='稳定起始点')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

结果解释

运行这段代码后,会输出曲线开始稳定的点:(7, 0.72),正好对应你图中红色圆圈附近的位置。原因是:

  • 计算出的差分是[0.07, 0.04, 0.11, 0.12, 0.04, 0.03, 0.01, 0.01, 0.01]
  • 从索引6开始,连续3个差分都是0.01,小于阈值0.02,所以对应的原y索引是7,也就是x=7的位置。

方法2:基于二阶差分的变化率判断

如果想更精准地捕捉"变化率开始变小"的节点,可以用二阶差分(即一阶差分的差值)。当二阶差分接近0时,说明一阶差分的变化很小,曲线正在从快速增长转向平稳。

代码实现

import numpy as np
import matplotlib.pyplot as plt

x = list(range(10))
y = [0.3, 0.37, 0.41, 0.52, 0.64, 0.68, 0.71, 0.72, 0.73, 0.74]

# 计算一阶差分和二阶差分
diff_y = np.diff(y)
second_diff = np.diff(diff_y)

# 设定二阶差分的阈值(接近0说明变化率稳定)
second_threshold = 0.01

# 找到第一个二阶差分小于阈值的位置
candidates = np.where(np.abs(second_diff) < second_threshold)[0]
if len(candidates) > 0:
    # 二阶差分的索引比原y少2,所以+2得到原y的索引
    target_idx = candidates[0] + 2
    target_x = x[target_idx]
    target_y = y[target_idx]
    print(f"曲线开始稳定的点:({target_x}, {target_y})")

# 绘图验证
plt.plot(x, y, marker='o')
plt.scatter(target_x, target_y, color='red', s=120)
plt.show()

关键注意点

  • 阈值的调整:阈值需要根据你的数据特性来设定。如果数据本身波动大,阈值可以适当调高;如果数据精度高,阈值可以设得更小。
  • 窗口大小的选择:方法1中的window_size是为了避免单个小波动误判为稳定,你可以根据需求调整连续判断的次数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:13:46