如何获取曲线中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
相关产品推荐
相关产品推荐

