Три разных подхода к моделированию диффузии. Рассматриваем одномерное уравнение.
Метод конечных разностей
% Решает одномерное уравнение диффузии на прЯмоугольнике,
% с начальным условием u(t(1),x)= f
% и граничными условиЯми u(t,х(1)) = ua, u(t,х(end)) = ub
D = 2;
xmin = -5; xmax = 5;
tmin = 0; tmax = 4;
J = 10; % число узлов по x
N = 20; % число узлов по t
f = zeros(1,J); f( round(J/2) ) = 50;
ua = 0; ub = 0;
dx = (xmax-xmin)/J;
dt = (tmax-tmin)/N;
s = D*dt/dx^2;
u = zeros(N,J);
u(1,:) = f;
for n = 1:N-1
u(n+1,2:J-1) = s*(u(n,3:J) + u(n,1:J-2)) + (1-2*s)*u(n,2:J-1);
u(n+1,1) = ua;
u(n+1,J) = ub;
end
surf(u)
Однако не все так просто! Численное решение дифференциальных уравнений в частных производных чревато «опасностями», например, если мы зададим N = 10, то получим явно неправдоподобный результат, т.е столкнемся с т.н. неустойчивостью численного метода. Но подробности оставим курсу «Численные методы»...
Метод клеточных автоматов
А здесь даже уравнение писать не нужно. В первый момент времени примесь есть только в центральной ячейке. Концентрация примеси в ячейке на следующем шаге частью остается в самой ячейке, частью переходит в соседние — правую и левую. Если течения нет, то эти доли одинаковы - по 1/3.
ncells = 25; % количество Ячеек
N = 20; % количество шагов по времени
L = 1/3; % влево
S = 1/3; % на месте
R = 1/3; % вправо
c = zeros(ncells,1); % Массив значений концентрации
cmax = 100; % Максимум концентрации
c(ncells/2) = cmax; % Начальное значение концентрации
x = 2:ncells-1;
for i=1:N % цикл по времени
plot(c) % рисуем текущие значениЯ концентрации
c(x) = c(x-1)*L + c(x)*S + c(x+1)*R; % считаем новые
axis([1 ncells 0 cmax]), grid on % диапазоны по осЯм
xlabel('Position')
ylabel('Value')
title(['After Time Step: ' num2str(i)])
drawnow % Рисует график немедленно
% Обычно, MATLAB строит график только в конце программы
end
Мы можем усовершенствовать нашу модель, если введем течение. Тогда доли L, S и R изменятся. Например, если течение направлено вправо, то они могут быть 1/10, 3/10 и 6/10 соответственно. В дифференциальном уравнении этого можно было бы добиться, делая переменным коэффициент диффузии. Правда тогда придется переделать и разностное уравнение.
Заметьте, что концы трубы в программе исключены из рассмотрения (x = 2:ncells-1;
). Чтобы рассмотреть их, нужно с помощью условного оператора проверять, достигнут ли конец трубы. Тогда можно сделать концы, например, отражающими, т.е. частицы будут отскакивать от них вглубь трубы.
Источник можно задавать разовой концентрации (как в примере), а можно постоянной. Можно задавать перемещение источника вдоль трубы.
Модель очевидно обобщается на 2-х и 3-х мерный случаи, только количество соседей станет больше. Тогда в ней можно вводить препятствия различных видов (модель распространения загрязнения с домами и лесом).
Вспомнив, про то, что движение каждой частицы примеси происходит случайным образом, мы можем применить для моделирования ее перемещений...
Метод Монте-Карло
Частица может на каждом шаге двинуться вправо, влево или остаться на месте. Через некоторое время (количество шагов) она окажется на каком-то расстоянии от исходной точки. Если запустить множество частиц и позволить им всем двигаться по одинаковым законам (вправо, влево или стоять), а через некоторое время посмотреть, сколько из них удалились на то или иное расстояние от источника, то мы и получим распределение концентраций (количество части в единице объема).
n = 20; % число Ячеек
m = 500; % число частиц
x = (n/2)*ones(1,m);
dice = [-1,0,+1];
for k = 1:20
dx = dice( round(1+2*rand(1,m)) );
hist(x,m)
axis([0,n,0,m/2]); axis square; grid on
x = x + dx;
drawnow
end
Комментарии
comments powered by Disqus