在直线为 straight/constant 的曲线上找到两条 points/derivatives

Find two points/derivatives on curves between which the line is straight/constant

我正在绘制 x 和 y 点。这会产生一条曲线,该线首先弯曲,然后在一个点之后变直,一段时间后它再次弯曲。我想找回这两点。虽然 x 是线性的并且 y 是针对 x 绘制的,但 y 与 x 不是线性相关的。

我尝试使用 matplotlib 来绘制和 numpy 多项式函数,目前正在研究样条曲线,但似乎 y 需要直接依赖于 x

你的数据有噪音,所以你不能使用简单的数值导数。相反,正如您可能已经发现的那样,您应该用样条拟合它,然后检查样条的曲率。

键控 ,你可以像这样拟合样条并计算二阶导数(曲率):

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline

x = file['n']
y = file['Ds/2']

y_spline = UnivariateSpline(x, y)
x_range = np.linspace(x[0], x[-1], 1000)  # or could use x_range = x
y_spline_deriv = y_spl.derivative(n=2)
curvature = y_spline_deriv(x_range)

然后你可以这样找到直线区域的起点和终点:

straight_points = np.where(curvature.abs() <= 0.1)[0]  # pick your threshold
start_idx = straight_points[0]
end_idx = straight_points[-1]
start_x = x_range[start_idx]
end_x = x_range[end_idx]

或者,如果您主要对找到曲线的 最平坦 部分感兴趣(如图所示),您可以尝试计算一阶导数,然后找到区域其中斜率在数据中任何地方的最小斜率的少量范围内。在这种情况下,只需在上面的代码中替换 y_spline_deriv = y_spl.derivative(n=1)