Изменение визуализации функции Matplotlib с точностью - PullRequest
1 голос
/ 05 апреля 2019

Итак, я пытался отобразить некоторые математические функции в 3d с помощью matplotlib, когда я что-то заметил ... 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 Ответ

1 голос
/ 05 апреля 2019

Во-первых, обратите внимание, что используемая функция отличается от альфа-выхода вольфрама.Итак, давайте использовать функцию, показанную на скриншоте.Затем вы можете ограничить данные диапазоном, который хотите показать.

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()

enter image description here

...