у меня есть этот код, который генерирует следующее (изображение), как мне продолжить обнаруживать пересечения линии с функцией?
import numpy as np
import matplotlib.pyplot as plt
y = 0.4*np.ones(100)
x = np.arange(0, 100)
t = np.linspace(0,100,100)
Fs = 6000
f = 200
func = np.sin(2 * np.pi * f * t / Fs)
idx = np.where(func == y) # how i think i should do to detect intersections
print(idx)
plt.plot(x, y) # the horizontal line
plt.plot(t,func) # the function
plt.show()
Вы можете использовать следующее выражение, чтобы получить индексы массива t
, который находится ближе всего к точкам пересечения.
idx = np.argwhere(np.diff(np.sign(y - func))).flatten()
Это выражение выбирает индексы, в которых происходит смена знака в списке. Однако это лишь приближение к реальным точкам пересечения. Уменьшите размер шага t
, чтобы повысить точность.
Поскольку уравнения относительно просты, другим способом было бы решить их вручную и реализовать формулу в закрытой форме для построения графика.
У вас есть уравнения y = 0.4
и y = sin(2*pi*t*f/Fs)
. Точки пересечения имеют такие значения t
, что 0.4 = sin(2*pi*t*f/Fs)
. Решение для t
дает два ответа:
t = (arcsin(0.4) + 2*pi*k) / (2*pi*f/Fs)
t = (pi - arcsin(0.4) + 2*pi*k) / (2*pi*f/Fs)
где k
— любое целое число. Короче говоря, переберите все желаемые целые числа в заданном диапазоне и вычислите координаты t
, используя два приведенных выше уравнения. Вы получите набор точек (t,0.4)
, которые сможете нанести на график.
Это просто эквивалентно проблеме поиска решений
func(t) - y = 0
. В случае приведенной здесь функции решения являются периодическими.