%matplotlib inline
jupyter?
Немного изменил код:
#!/usr/bin/python3
import pylab
from mpl_toolkits.mplot3d import Axes3D
import scipy.integrate as integrate
import numpy as np
from numpy import exp, sqrt, cos
a = 1.4
H = 10
def f(x,y):
return integrate.quad(lambda k:2*(sqrt(k**2+a**2)*exp(-H*(k**2+a**2))*cos(x*a*sqrt(k**2+a**2))*cos(y*k*sqrt(k**2+a**2))),0, np.inf)[0]
def makeData():
x = np.arange(0, 200, 2)
y = np.arange(0, 100, 2)
xgrid, ygrid = np.meshgrid(x, y)
zgrid = np.array([f(x,y) for x,y in zip(np.ravel(xgrid), np.ravel(ygrid))]).reshape(xgrid.shape)
return xgrid, ygrid, zgrid
x, y, z = makeData()
fig = pylab.figure()
axes = Axes3D(fig)
axes.plot_surface(x, y, z)
pylab.show()
могли бы расшифровать
[0] в конце return integrate.quad(...
потому что integrate.quad возвращет не одно значение, а кортеж из двух. значение интеграла там идёт первым (под индексом 0).
>>> integrate.quad(lambda x:x,0,4)
(8.0, 8.881784197001252e-14)
раньше это стояло после f(x,y), но лучше тут
создаёт массив чисел из интервала [0;200) с шагом 2.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html?highlight=arange#numpy.arangeдля наглядности пусть будет
>>> x = np.arange(0, 10, 4)
>>> print(x)
[0 4 8]
>>> y = np.arange(1, 10, 5)
>>> print(y)
[1 6]
xgrid, ygrid = np.meshgrid(x, y)
создаёт двумерные массивы xgrid и ygrid. такие, что перебирая попарно их элементы мы получим все координаты сетки.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html?highlight=meshgrid#numpy.meshgrid >>> print(xgrid)
[[0 4 8]
[0 4 8]]
>>> print(ygrid)
[[1 1 1]
[6 6 6]]
zgrid = np.array([f(x,y) for x,y in zip(np.ravel(xgrid), np.ravel(ygrid))]).reshape(xgrid.shape)
[f(x,y) for x,y in zip(np.ravel(xgrid), np.ravel(ygrid))]
по частям:
np.ravel превращает двумерный массив в одномерный
https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html?highlight=ravel#numpy.ravel for x,y in zip(array1, array2)
будет брать по одному элементу из array1 и array2 и присваивать эти значения переменным x и y.
т.е. этот цикл перебирает всю сетку
https://docs.python.org/3/library/functions.html#zipитого
создаст список, состоящий из f(x,y) для всех x,y из цикла
т.е. тут мы посчитаем значения интеграла для всех точек сетки
но т.к. для построения графика через plot_surface нам нужен не список (list), а 2-d array типа xgrid, то дальше мы преобразуем список
https://matplotlib.org/tutorials/toolkits/mplot3d.html?highlight=plot_surface#mpl_toolkits.mplot3d.Axes3D.plot_surface np.array(список).reshape(xgrid.shape)
превращает список в numpy.array, затем делает его двумерным как xgrid (reshape).
https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.reshape.html?highlight=reshape#numpy.ndarray.reshape