Длина всей функции tan (), обрезанной на две строки в Python? - PullRequest
0 голосов
/ 25 октября 2019

Мой код:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2 * np.pi, 2 * np.pi, 1000)
y = np.tan(x)
y2 = 4 + x*0
y3 = -4 + x*0
fig = plt.figure(figsize=(8,5))
ax = fig.add_subplot(111) 

diffs = np.sqrt(np.diff(x)**2+np.diff(y)**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)
            ax.cla()
            ax = fig.add_subplot(111)

for j in range(len(p2)):   
            ax.scatter(p2[j][0],p2[j][1], color="crimson", s=5)

plt.plot(np.tan(x))
plt.plot(y2)
plt.plot(y3)
plt.ylim(-10, 10)

Я пытаюсь найти длину функции tan(), обрезанную двумя строками y2, y3 в определенном отсеке. Это означает, что только часть, отмеченная красным цветом ниже, должна быть взята к общей длине графика:

enter image description here

Далее я пытаюсь отметить позициюиз точек из списка numbers = [] на этом графике, которые лежат на расстоянии, равном значению этих точек, начиная с начала графика в точке (x,y)=(0,0), и я хочу получить их координаты. Что для моего списка образцов numbers = [] даст что-то вроде этого:

enter image description here

Чего мне не хватает? Можно ли этого достичь? Буду благодарен за любые советы.

1 Ответ

1 голос
/ 25 октября 2019

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...