Нахождение пересечений кривой с нулем
В Python получение точных значений оси Y из графика может оказаться сложной задачей, если значение не является целое число. В этой статье рассматривается эта проблема и представлено решение, основанное на линейной интерполяции.
Для двух массивов (vertical_data и градиент(temperature_data)), график создается с помощью plt.plot. Однако на графике отображается значение y, близкое к нулю, но не совсем равное нулю.
Линейная интерполяция для оценки корня
Чтобы оценить точный корень массива numpy , можно использовать простой метод линейной интерполяции. Следующий код демонстрирует, как найти нулевые значения произвольной кривой:
import numpy as np
def find_roots(x, y):
s = np.abs(np.diff(np.sign(y))).astype(bool)
return x[:-1][s] np.diff(x)[s]/(np.abs(y[1:][s]/y[:-1][s]) 1)
x = .4 np.sort(np.random.rand(750))*3.5
y = (x-4)*np.cos(x*9.)*np.cos(x*6 0.05) 0.1
z = find_roots(x,y)
plt.plot(x,y)
plt.plot(z, np.zeros(len(z)), marker="o", ls="", ms=4)
Этот код определяет корни кривой и отображает их в виде кругов при точном нулевом значении y.
Ненулевые точки пересечения
Тот же подход можно использовать для поиска пересечения кривой с любым ненулевым значением y -value (y0), изменив строку, которая находит корни:
z = find_roots(x,y-y0)
Два пересечения кривых
Метод линейной интерполяции также можно использовать для поиска пересечения двух кривых. Найдя корни разности между двумя кривыми, мы можем оценить точку их пересечения:
y2 = (x - 2) * np.cos(x * 8.) * np.cos(x * 5 0.03) 0.3
z = find_roots(x,y2-y1)
plt.plot(x,y1)
plt.plot(x,y2, color="C2")
plt.plot(z, np.interp(z, x, y1), marker="o", ls="", ms=4, color="C1")
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3