plt.plot
принимает два аргумента: массив x
и массив y
;без предоставления обоих, pyplot
предполагает, что вы хотите построить их в зависимости от индекса значения в массиве. Итак, ваше первое препятствие состоит в том, чтобы изменить линии внизу на:
plt.plot(x, np.tan(x))
plt.plot(x, y2)
plt.plot(x, y3)
Теперь у нас есть проблема в том, что ваш расчет учитывает весь график, а не только части между -4и 4. Вы можете решить эту проблему, отфильтровав массив x по вашим порогам:
x_all = np.linspace(-2 * np.pi, 2 * np.pi, 1000)
x_above = x_all[ -4 < np.tan(x_all) ]
x = x_above[ np.tan(x_above) < 4 ]
Наконец, у нас есть проблема, заключающаяся в том, что при вычислении различий учитывается скачок с +4 до -4. Мы можем смягчить это, отфильтровывая везде, где разница в y
отрицательна:
y_up = np.diff(y) > 0
y_diff = np.where( y_up, np.diff(y), 0 )
x_diff = np.where( y_up, np.diff(x), 0 )
diffs = np.sqrt( x_diff**2 + y_diff**2 )
Мой окончательный код выглядит следующим образом и, кажется, работает так, как вы ожидаете:
import matplotlib.pyplot as plt
import numpy as np
x_all = np.linspace(-2 * np.pi, 2 * np.pi, 1000)
x_above = x_all[ -4 < np.tan(x_all) ]
x = x_above[ np.tan(x_above) < 4 ]
y = np.tan(x)
y2 = 4 + x*0
y3 = -4 + x*0
y_up = np.diff(y) > 0
y_diff = np.where( y_up, np.diff(y), 0 )
x_diff = np.where( y_up, np.diff(x), 0 )
diffs = np.sqrt( x_diff**2 + y_diff**2 )
length = diffs.sum()
numbers = [2, 4, 6, 8, 10]
p2 = []
for i in range(len(numbers)):
cumlenth = np.cumsum(diffs)
s = np.abs(np.diff(np.sign(cumlenth-numbers[i]))).astype(bool)
c = np.argwhere(s)[0][0]
p = x[c], y[c]
p2.append(p)
for j in range(len(p2)):
plt.scatter( p2[j][0], p2[j][1], color="crimson", s=5)
plt.plot(x, np.tan(x))
plt.plot(x, y2)
plt.plot(x, y3)
plt.ylim(-10, 10)
plt.show()