假设我们有:
这是一张示例图片:
假设直线和曲线相互截距,我怎样才能找到直线和数据集之间的交点?
答案 0 :(得分:0)
由于曲线数据看起来很密集且没有散射(例如数值求解的微分方程的结果),因此插补或近似整个曲线数据集是过度的。在下文中,我假设数据集的点沿着曲线排序(就好像它们是对参数曲线进行采样的结果)。
首先,进行coordiante变换A(x,y)
,并进行平移和旋转,使红线与x
轴匹配。
将变换曲线与x
轴相交,即从曲线数据集中获取y坐标的绝对值较小的所有点(并记住它们在数据集中的索引)。尝试使用y < 0.05
描绘曲线。
使用2.中选择的点的索引来检测相邻曲线点的范围,每个范围类似于曲线的一小部分。
Sloppy version
x_mean
。逆坐标变换A_inv(x_mean, 0)
将为您提供该范围交点的近似值。根据您的使用情况和潜在曲线的复杂程度,近似值可能已经足够好了。复杂版
使用低度<= 4
的线或多项式曲线近似每个范围。
[103, 104, 105, 106, 107]
变为[0.0, 0.25, 0.5, 0.75, 1.0]
x
和y
坐标范围。x
和y
数据分别近似为1D函数,将曲线数据表示为(x(t), y(t))
的{{1}}参数函数t
(使用上面的映射索引作为插值结。)[0, 1]
。y(t) == 0
内的每个零t_zero
,请评估[0, 1]
处的近似值x(t)
。逆坐标变换t_zero
为您提供原始坐标中A_inv(x(t_zero), 0)
处交点的近似值。如果您可以确认此解决方案可能适合您的问题,我可能会提供相应的t_zero
示例。
答案 1 :(得分:0)
根据我上面的评论
import numpy as np
A = np.random.random((20, 2))
A[:,0] = np.arange(20)
A[:,1] = A[:,1] * (7.5 + A[:,0]) # some kind of wiggly line
p0 = [-1.0,-6.5] # point 0
p1 = [22.0, 20.0] # point 1
b = (p1[1] - p0[1]) / (p1[0] - p0[0]) # gradient
a = p0[1] - b * p0[0] # intercept
B = (a + A[:,0] * b) - A[:,1] # distance of y value from line
ix = np.where(B[1:] * B[:-1] < 0)[0] # index of points where the next point is on the other side of the line
d_ratio = B[ix] / (B[ix] - B[ix + 1]) # similar triangles work out crossing points
cross_points = np.zeros((len(ix), 2)) # empty array for crossing points
cross_points[:,0] = A[ix,0] + d_ratio * (A[ix+1,0] - A[ix,0]) # x crossings
cross_points[:,1] = A[ix,1] + d_ratio * (A[ix+1,1] - A[ix,1]) # y crossings
print(ix, B, A, cross_points)