Есть ли простой способ построить функцию, которая стремится к бесконечности в положительном и отрицательном как один график, без графика, соединяющего оба конца положительного и отрицательного?
Например, построение y = 1/x с использованием этого кода дает результат:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return 1/x
fx_name = r'$f(x)=\frac{1}{x}$'
x=np.setdiff1d(np.linspace(-10,10,100),[0]) #to remove the zero
y=f(x)
plt.plot(x, y, label=fx_name)
plt.legend(loc='upper left')
plt.show()
Но я хотел бы получить этот вывод, который я достигаю, построив два отдельных домена:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return 1/x
fx_name = r'$f(x)=\frac{1}{x}$'
xfn=np.setdiff1d(np.linspace(-10,0,100),[0])
xfp=np.setdiff1d(np.linspace(0,10,100),[0])
yfn=f(xfn)
yfp=f(xfp)
yf = plt.plot(xfn, yfn, label=fx_name)
plt.plot(xfp, yfp, color=yf[0].get_color())
plt.legend(loc='upper left')
plt.show()
Есть ли короткие сокращения? Большое спасибо.
Решение
Включить нуль в массив домена и подавить деление на ноль. Это заставляет один элемент возвращаемого массива со-домена как "inf", а "inf" не отображается.
import numpy as np
import matplotlib.pyplot as plt
def f(x):
with np.errstate(divide='ignore', invalid='ignore'):
return 1/x
fx_name = r'$f(x)=\frac{1}{x}$'
x=np.linspace(-10,10,101)
y=f(x)
plt.plot(x, y, label=fx_name)
plt.legend(loc='upper left')
plt.show()
Я предпочитаю этот метод, так как он избегает ручного управления массивом и может быть легко использован для других функций, которые используют один и тот же домен (например, y = 1/(x + 2)). Спасибо всем за вклад.