#python-3.x #numpy #matplotlib #3d #graph-visualization
#python-3.x #numpy #matplotlib #3D #визуализация графика
Вопрос:
Итак, я пытался отобразить некоторые математические функции в 3d с помощью matplotlib, когда я что-то заметил… 3D-график внезапно изменился (скорее сломался), когда я попытался исправить предыдущую проблему, в которой я столкнулся с некоторой «недостающей поверхностью» — пробелом в графике. Главный вопрос заключается в следующем — 3D-график не показывает два пика с более высокой точностью из-за некоторых внутренних вычислительных ограничений Axes3d или по какой-либо другой причине? Также вторичный вопрос — почему я сталкиваюсь с «отсутствующими поверхностями» вблизи 1.25 и -1.25 на графике с более низкой точностью?
Я попытался найти ее в Google и сослался на несколько сообщений, но ничего не вышло, кроме дополнительных вопросов.
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
X=np.arange(-2, 2,0.025)
## Use np.arange(-5, 5,0.25) to experience the 'surface loss' I mention but otherwise correct 2 spike plot at each of (0,-1) and (0, 1) for both X and Y
Y=np.arange(-2, 2,0.025)
X,Y=np.meshgrid(X,Y)
R=1 X**2-Y**2
S=R**2 4*(X**2)*(Y**2)
Z=R/S
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=cm.viridis,norm=mpl.colors.Normalize(vmin=-1.,vmax=1.))
##NORMALIZE Was essential to get the proper color range
plt.show()
plt.savefig('art3d.jpeg',bbox_inches='tight')
plt.savefig('art3d.svg',bbox_inches='tight')
Идеальный результат должен быть таким (показывает функцию и график)
https://i.stack.imgur.com/kVnYc.png
Два графика, которые я получаю, можно увидеть при запуске кода, поскольку я, похоже, не могу добавлять изображения, предположительно, из-за низкой репутации:(
Приветствуется любая помощь.Заранее спасибо.
Ответ №1:
Сначала обратите внимание, что используемая функция отличается от выходных данных wolfram alpha. Итак, давайте воспользуемся функцией, показанной на скриншоте. Затем вы можете ограничить данные диапазоном, который вы хотите отобразить.
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
X = np.arange(-2, 2,0.025)
Y=np.arange(-2, 2,0.025)
X,Y=np.meshgrid(X,Y)
Z = -2*X*Y / ((2*X*Y)**2 (X**2 - Y**2 1)**2)
Z[(Z < -1)] = -1
Z[(Z > 1)] = 1
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=cm.viridis,norm=mpl.colors.Normalize(vmin=-1.,vmax=1.))
plt.show()