繁体   English   中英

删除两条曲线之间的交点

[英]Remove the intersection between two curves

我在两个轴上都有一条从 0 到 1 的曲线(抛物线),如下所示:

在此处输入图像描述

我通过沿 x 轴移动原始曲线来生成另一条曲线,并将两者结合起来得到下图:

在此处输入图像描述

如何删除相交部分以仅具有这样的双底图案:

在此处输入图像描述

我用于图表的代码:

import numpy as np
import matplotlib.pyplot as plt

def get_parabol(start=-1, end=1, steps=100, normalized=True):
    x = np.linspace(start, end, steps)
    y = x**2
    if normalized:
        x = np.array(x)
        x = (x - x.min())/(x.max() - x.min())
        y = np.array(y)
        y = (y - y.min())/(y.max() - y.min())
    return x, y
def curve_after(x, y, x_ratio=1/3, y_ratio=1/2, normalized=False):
    x = x*x_ratio + x.max() - x[0]*x_ratio
    y = y*y_ratio + y.max() - y.max()*y_ratio
    if normalized:
        x = np.array(x)
        x = (x - x.min())/(x.max() - x.min())
        y = np.array(y)
        y = (y - y.min())/(y.max() - y.min())
    return x, y
def concat_arrays(*arr, axis=0, normalized=True):
    arr = np.concatenate([*arr], axis=axis).tolist()
    if normalized:
        arr = np.array(arr)
        arr = (arr - arr.min())/(arr.max() - arr.min())
    return arr

x, y = get_parabol()
new_x, new_y = curve_after(x, y, x_ratio=1, y_ratio=1, normalized=False)
new_x = np.add(x, 0.5)
# new_y = np.add(y, 0.2)
xx = concat_arrays(x, new_x, normalized=True)
yy = concat_arrays(y, new_y, normalized=True)

# plt.plot(x, y, '-')
plt.plot(xx, yy, '--')

我正在研究模式分析,需要我用数学函数生成模式。

你能告诉我实现这一目标的方法吗? 谢谢!

首先,我将有两个不同的抛物线函数,例如:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y1 = np.add(x, 0.3)**2 # Parabola centered at -0.3
y2 = np.add(x, -0.3)**2 # Parabola centered at 0.3

您可以根据需要为 y1 和 y2 选择自己的偏移量。

然后只需取两个数组的最小值

y_final = np.minimum(y1, y2)
plt.plot(x, y_final, '--') 

这涉及曲线拟合。 您需要在删除值之前找到交集部分。 由于 x 和 y 的值已被归一化,因此我们必须准确确定两个数据集的交汇点。 我们可以看到它们在 x[i] >x[i+1] 时相遇。 因此,使用您提供的数据中的xxyy组合,我们可以执行以下操作:

data_intersect = int(np.where(np.r_[0,np.diff(xx)] < 0)[0])

x1 = xx[:data_intersect]
x2 = xx[data_intersect:]
y1 = yy[:data_intersect]
y2 = yy[data_intersect:]

difference = np.polyfit(x1, y1, 2) - np.polyfit(x2,y2,2)

meet = np.roots(difference) # all points where the two curves meet

meet = meet[(meet < max(x1)) & (meet >min(x1))] # only point curve meet 

xxx = np.r_[x1[x1<meet], x2[x2>meet]]
yyy = np.r_[y1[x1<meet], y2[x2>meet]]
plt.plot(xxx, yyy, '--')

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM