А. Колесников
Третий Ангел вострубил, и упала с неба большая звезда, горящая подобно светильнику, и пала на третью часть рек и на источники вод. Имя сей звезде полынь; и третья часть вод сделалась полынью, и многие люди умерли от вод, потому что они стали горьки.
Откровение Святого Иоанна Богослова, гл. 8, ст. 10,11
Кто-то точно подметил, что разговор о погоде становится интересным лишь при первых признаках конца света. Сегодня ученые и политики обсуждают проблемы погоды на глобальных форумах, да и простые люди начинают потихоньку интересоваться погодой, причем не только на ближайшие выходные, но и вообще… Атмосфера - огромная, сложнейшая, распределенная, динамическая система. Предсказывать ее поведение чрезвычайно трудно, часто просто невозможно. Глядя на висящие в небесной синеве замысловатые облачные структуры, мы не всегда задумываемся о том, насколько масштабные и драматические процессы происходят там, в вышине. Совсем иное впечатление оставляет ускоренная съемка облачного неба. Картинка эволюции роящихся облачных масс невольно наводит на размышления о природе времени и смысле земного существования. Схожие, но более тревожные мысли навевают кадры, изображающие расползание смога над крупными мегаполисами или, хуже того, постепенной диффузии ядерного гриба… Все мы помним старые черно-белые учебные фильмы, повествующие о формировании зон заражения после атомного взрыва. Они классифицируются по степени опасности. Вблизи эпицентра располагается "мертвая" зона сплошного интенсивного заражения. Далее, в зависимости от направления ветра, зоны распределяются в виде вложенных друг в друга эллипсоидов рассеивания. В принципе, схожей будет картина распространения и любого другого загрязнителя от точечного источника, например, от дымящей трубы, взорвавшегося реактора или апокалиптической звезды из библейского пророчества. Процесс распространения загрязнителя в атмосфере - это процесс рассеивания и смешивания его частиц с частицами воздуха. На ход этого процесса существенное влияние оказывают собственные движения воздушных масс, то есть ветра. В одной и той же местности они дуют в различных направлениях с определенной частотой. Данные о частотах ветров наносятся на особую диаграмму, имеющую романтическое название, воспетое во множестве бардовских песен, - роза ветров. Частицы загрязнителя попадают от первоначального источника в соседние области. Затем из областей, непосредственно примыкающих к источнику, распространяются уже в их окрестностях, и так далее. Сам характер этого процесса указывает на то, что для моделирования рассеивания загрязнителя в атмосфере можно использовать подход, основанный на идеологии клеточных автоматов. В этом случае исследуемый участок представляется в виде клеточного поля. На поле помечаются клетки, в которых находятся эпицентры распространения загрязнения или заражения. Затем концентрацию загрязнителя в каждой клетке поля можно, например, приближенно оценивать по формуле:
(1)
где ak
- это массив из девяти элементов, содержащий вероятности ветров соответствующих восьми направлений и вероятность штиля. Само собой разумеется, что девять вероятностей ветров различных направлений, включая вероятность штиля, должны в сумме давать единицу. C*
k
- это вектор из девяти элементов, содержащий концентрации загрязнителя в соседних с данной восьми клетках и в ней самой. Шаг за шагом для всех клеток поля вычисляется сумма произведений концентраций в соседних восьми ячейках на соответствующие вероятности ветров. К сумме прибавляется еще и произведение вероятности штиля на концентрацию загрязнителя в самой текущей клеточке. Для нормальной работы программы необходимо иметь две копии клеточного поля. В одной из копий следует хранить предыдущее поколение, а в другой - последующее. При смене поколений содержимое последующего поколения становится предыдущим. Из расчетов исключаются крайние ряды ячеек. Это делается для того, чтобы избежать "пограничных" проблем при применен
Для восприятия результатов моделирования важна раскраска клеток. В приведенном программном фрагменте использован алгоритм, переводящий значения концентраций загрязнителя в различные градации яркости цветов - от темно-красного до темно-зеленого. При этом высокие значения концентраций изображаются оттенками красного, который, по мере снижения Z, переходит в желтый, а затем постепенно затухает до темно-зеленого цвета.
Конечно, для по-настоящему точных моделей процессов рассеивания атмосферных загрязнителей следует обращаться к намного более прецизионным методикам, чем та, о которой шла речь. Но все же в данном случае вам нет необходимости решать головоломную систему умопомрачительных дифференциальных уравнений в частных производных на суперкомпьютере астрономической стоимости. При помощи этой несложной программки вы можете выполнить некое небольшое занимательное миниисследование по компьютерному моделированию экологической ситуации в вашем районе, городе или области в пределах временных рамок одной лабораторной работы.
DefByte I-K
DefInt L-N
Dim G As Byte
Dim a(1 To 9) As Single
Dim b(1 To 200, 1 To 200) As Single
Dim c(1 To 200, 1 To 200) As Single
Dim Color As Long
Dim Zmin As Single
Dim Zmax As Single
Dim R As Single
Dim R4 As Single
Dim Z14 As Single
Dim Z24 As Single
Dim Z34 As Single
Private Sub Form_Click()
a(1) = 0.05
a(2) = 0.05
a(3) = 0.1
a(4) = 0.1
a(5) = 0.1
a(6) = 0.1
a(7) = 0.1
a(8) = 0.15
a(9) = 0.25
z = 7
Zmin = 0
Zmax = 2
R = Zmax - Zmin
R4 = R / 4
Z14 = Zmin + R4
Z24 = Z14 + R4
Z34 = Z24 + R4
n = 50
G = 50
For f = 1 To G
b(35, 35) = z
b(45, 15) = z / 2
For i = 2 To n - 1
For j = 2 To n - 1
c(i, j) = 0
k = 0
For l = -1 To 1
For m = -1 To 1
k = k + 1
c(i, j) = c(i, j) + a(k) * b(i + l, j + m)
Next m
Next l
Next j
Next i
For i = 1 To n
For j = 1 To n
Color = SetColor(c(i, j))
Line (6 * (i - 1), 6 * (j - 1))-(6 * i - 1, 6 * j - 1), Color, BF
b(i, j) = c(i, j)
Next j
Next i
Next f
End Sub
Public Function SetColor(z As Single) As Long
Dim t As Byte
Select Case z
Case Is < Zmin
SetColor = RGB(0, 63, 0)
Case Zmin To Z14
t = 63 + 192 * (z - Zmin) / R4
SetColor = RGB(0, t, 0)
Case Z14 To Z24
t = 255 * (z - Z14) / R4
SetColor = RGB(t, 255, 0)
Case Z24 To Z34
t = 255 * (1 - (z - Z24) / R4)
SetColor = RGB(255, t, 0)
Case Z34 To Zmax
t = 63 + 192 * (1 - (z - Z34) / R4)
SetColor = RGB(t, 0, 0)
Case Is > Zmax
SetColor = RGB(63, 0, 0)
End Select
End Function