Python Matplotlib 无对应方程的绘图离散数据如何求各点梯度(数值微分)
你现在拿到的这个数值微分函数是针对可直接调用的连续函数设计的,离散降噪数据场景下我们直接用相邻采样点替换f(x+h)和f(x-h)即可,实现逻辑非常简单:
- 首先确认你的数据结构:降噪后的曲线对应两组等长的一维数组,分别是采样点横坐标序列
x_arr和对应纵坐标序列y_smoothed。如果是等间隔采样,直接取相邻横坐标的差值作为步长h = x_arr[1] - x_arr[0]即可。 - 公式取值替换:对于中间第i个点(非首尾边界点),
f(x+h)就是y_smoothed[i+1],f(x-h)就是y_smoothed[i-1],直接带入中心差分公式计算即可。 - 边界点特殊处理:序列第一个点没有前值,用前向差分计算:
(y_smoothed[1] - y_smoothed[0])/h;最后一个点没有后值,用后向差分计算:(y_smoothed[-1] - y_smoothed[-2])/h。
完整实现代码如下:
import numpy as np def discrete_numerical_diff(x_arr, y_arr): n = len(x_arr) diff_result = np.zeros(n) # 等间隔采样步长,非等间隔采样可注释掉该行,在循环中单独计算每个点的步长 h = x_arr[1] - x_arr[0] # 首点前向差分 diff_result[0] = (y_arr[1] - y_arr[0]) / h # 末点后向差分 diff_result[-1] = (y_arr[-1] - y_arr[-2]) / h # 中间点中心差分 for i in range(1, n-1): # 非等间隔采样时打开下方两行注释即可 # h_left = x_arr[i] - x_arr[i-1] # h_right = x_arr[i+1] - x_arr[i] diff_result[i] = (y_arr[i+1] - y_arr[i-1]) / (2 * h) return diff_result # 调用示例:x_arr为你的横坐标数组,y_smoothed为降噪后的纵坐标数组 # gradient_arr = discrete_numerical_diff(x_arr, y_smoothed)
如果你的采样是非等间隔的,只需要把代码中注释的非等间隔计算逻辑打开,替换公式中的固定步长即可。
附降噪前后效果对应图:

内容的提问来源于stack exchange,提问作者김은주
相关产品推荐
相关产品推荐

