1

我希望 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$'))
4

1 回答 1

0

有趣的问题。我的方法是通过检查函数的导数来寻找不连续性,并根据这些不连续性的位置分离原始函数。

所以对于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()

最终情节如下:

在此处输入图像描述

于 2019-10-12T21:13:19.873 回答