Как нарисовать асимптоту с пунктирной линией? - PullRequest
1 голос
/ 12 октября 2019

Я бы хотел, чтобы асимптоту функции tg (x) рисовали пунктирной линией, но я не знаю, как ее изменить в этом коде:

import matplotlib.ticker as tck
import matplotlib.pyplot as plt
import numpy as np
f,ax=plt.subplots(figsize=(8,5))
x=np.linspace(-np.pi, np.pi,100)
y=np.sin(x)/np.cos(x)
plt.ylim([-4, 4])
plt.title("f(x) = tg(x)")
plt.xlabel("x")
plt.ylabel("y")
ax.plot(x/np.pi,y)
ax.xaxis.set_major_formatter(tck.FormatStrFormatter('%g $\pi$'))

1 Ответ

0 голосов
/ 13 октября 2019

Интересный вопрос. Мой подход заключается в поиске разрывов путем изучения производной функции и отделения исходной функции на основе местоположения этих разрывов.

То же самое для tan(x), поскольку производная всегда положительна (внеасимптоты) ищем точки где np.diff(y) < 0. Основываясь на всех местах, где предыдущее условие выполняется, мы разбиваем исходную функцию на сегменты и наносим их на график отдельно (с одинаковыми свойствами графика, чтобы линии выглядели одинаково), а затем рисуем черные пунктирные линии по отдельности. Следующий код показывает эту работу:

import matplotlib.ticker as tck
import matplotlib.pyplot as plt
import numpy as np
f,ax=plt.subplots(figsize=(8,5))
x=np.linspace(-np.pi, np.pi,100)
y=np.sin(x)/np.cos(x)
plt.ylim([-4, 4])
plt.title("f(x) = tg(x)")
plt.xlabel("x")
plt.ylabel("y")
ax.xaxis.set_major_formatter(tck.FormatStrFormatter('%g $\pi$'))

# Search for points with negative slope
dydx = np.diff(y)
negativeSlopeIdx = np.nonzero(dydx < 0)[0]

# Take those points and parse the original function into segments to plot
yasymptote = np.array([-4, 4])
iprev = 0
for i in negativeSlopeIdx:
    ax.plot(x[iprev:i-1]/np.pi, y[iprev:i-1], "b", linewidth=2)
    ax.plot(np.array([x[i], x[i]])/np.pi, yasymptote, "--k")
    iprev = i+1


ax.plot(x[iprev:]/np.pi, y[iprev:], "b", linewidth=2)
plt.show()

с окончательным графиком, похожим на:

enter image description here

...