Сначала я определяю сетку точек:
Код: Выделить всё
def generate_square_mesh(num_points=50):
x = np.linspace(-0.5, 0.5, num_points)
y = np.linspace(-0.5, 0.5, num_points)
x_grid, y_grid = np.meshgrid(x, y)
return x_grid, y_grid
< pre class="lang-py Prettyprint-override">
Код: Выделить всё
def heat_kernel(x, y, t):
return np.exp(-(x**2 + y**2) / (4 * t))
def compute_convolution_matrix(x_grid, y_grid, t):
x = x_grid.flatten()
y = y_grid.flatten()
dx = x_grid[0, 1] - x_grid[0, 0]
dy = y_grid[1, 0] - y_grid[0, 0]
X = x[:, np.newaxis] - x[np.newaxis, :]
Y = y[:, np.newaxis] - y[np.newaxis, :]
H = heat_kernel(X, Y, t)*dx*dy
return H
Код: Выделить всё
from scipy.signal import convolve2d
x_grid, y_grid = generate_square_mesh(10)
t = 0.01
heat_matrix = compute_convolution_matrix(x_grid, y_grid, t)
kernel = heat_kernel(x_grid, y_grid, t)
u0 = np.zeros((10,10))
u0[5,5]=1
A = heat_matrix@u0.flatten()
B = convolve2d(u0, kernel, mode='same')*dx*dy
Похоже, что результаты имеют одинаковую форму в одной и той же области сетки, но значения разные.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -functions
Мобильная версия