То, что вы делаете, похоже на свертку, как указывает Джуни.Поэтому, используя эти знания, я придумал следующий код:
function T = tempsim(rows, cols, topNsideTemp, bottomTemp, tol)
sz = [rows,cols];
topEdge = sub2ind(sz, ones(1,cols) , 1:cols);
bottomEdge = sub2ind(sz, ones(1,cols)*rows, 1:cols);
leftEdge = sub2ind(sz, 1:rows , ones(1,rows));
rightEdge = sub2ind(sz, 1:rows , ones(1,rows)*cols);
otherEdges = [topEdge leftEdge rightEdge];
edges = [bottomEdge otherEdges];
%% set initial grid
T0 = zeros(sz);
T0(otherEdges) = topNsideTemp;
T0(bottomEdge) = bottomTemp;
%% average filter
F = [0 1 0
1 1 1
0 1 0];
F = F/sum(F(:));
%% simulation
T = T0; % initial condition
T = conv2(T, F, 'same');
T(edges) = T0(edges); % this keeps the edges set to the initial values
Если вы запустите это, вы получите следующие результаты:
T = tempsim(10,10,100,-100)
T0 =
100 100 100 100 100 100 100 100 100 100
100 0 0 0 0 0 0 0 0 100
100 0 0 0 0 0 0 0 0 100
100 0 0 0 0 0 0 0 0 100
100 0 0 0 0 0 0 0 0 100
100 0 0 0 0 0 0 0 0 100
100 0 0 0 0 0 0 0 0 100
100 0 0 0 0 0 0 0 0 100
100 0 0 0 0 0 0 0 0 100
100 -100 -100 -100 -100 -100 -100 -100 -100 100
T =
100 100 100 100 100 100 100 100 100 100
100 40 20 20 20 20 20 20 40 100
100 20 0 0 0 0 0 0 20 100
100 20 0 0 0 0 0 0 20 100
100 20 0 0 0 0 0 0 20 100
100 20 0 0 0 0 0 0 20 100
100 20 0 0 0 0 0 0 20 100
100 20 0 0 0 0 0 0 20 100
100 0 -20 -20 -20 -20 -20 -20 0 100
100 -100 -100 -100 -100 -100 -100 -100 -100 100
Я также показал T0
для ясности каквы можете видеть, что T(2,2) == 40
, что равно (100 + 100 + 0 + 0 + 0)/5
из той же позиции в T0
.
Исходя из контекста, я думаю, вы будете изучать сходимость этой проблемы.Если это так, вам придется повторять последние 2 строки, пока они не сойдутся.
Но в зависимости от вашей реальной проблемы, я думаю, вы можете улучшить начальные условия для ускорения сходимости, инициализируя сетку с температурой, отличной от 0
.В текущем коде ваши граничные условия будут нагревать всю сетку, что занимает некоторое время.Если вы просто дадите правильное предположение для объемной температуры (вместо 0
), это может значительно ускорить сходимость.В моем примере мне нужно около 40 шагов для сходимости до определенного допуска, с правильным предположением (50
в моем случае) это может быть уменьшено примерно до 20 шагов для того же уровня допуска.Для более крупной сетки я ожидаю увидеть еще больший прирост эффективности.
Это сходится к следующим значениям (и зеркальному отображению для других значений):
100 100 100 100 100
100 96.502 93.464 91.254 90.097
100 92.989 86.925 82.533 80.245
100 89.229 79.995 73.386 69.974
100 84.579 71.615 62.556 57.963
100 77.78 59.86 47.904 42.037
100 66.515 41.786 26.614 19.565
100 45.939 13.075 -4.3143 -11.72
100 3.4985 -32.392 -46.997 -52.455
100 -100 -100 -100 -100
Вы можете проверить, чтоЭто решение является приблизительной фиксированной точкой, проверяя, что для каждого элемента в массе оно равно вычисленному среднему значению в пределах определенного допуска.