Средневзвешенная интерполяция и визуализация данных

Предположим, что на территории большого промышленного города действует несколько наблюдательных постов, оснащенных приборами для измерения какого-либо количественного параметра, например, температуры или концентрации углекислого газа. Данные со всех постов можно нанести на карту в виде отдельных точек. Но такое представление будет крайне мало информативным. Для целей экологического мониторинга интерес представляет задача, позволяющая каким-то образом, по имеющимся отдельным точкам с известными значениями того или иного параметра, составить представление об общем его распределении на всей территории города. Процессы тепло- и массообмена родственны в общем смысле постепенному взаимному усреднению параметров перемешивающейся воздушной среды. Тогда значение температуры в точке, расположенной между постами, можно примерно рассчитать как среднее арифметическое. Но при этом оно должно быть более схожим со значениями, измеренными на ближайших постах, и в меньшей степени подвергаться влиянию удаленных опорных точек. Числовой характеристикой, ведущей себя подобным образом, является так называемое взвешенное среднее, вычисляемое по формуле: . Каждое из значений xk умножается на какой-то свой коэффициент ak, который отражает его "вес", долю участия или вклад в формирование общего среднего. В качестве весовых коэффициентов в нашей экологической задаче будем использовать отрицательные степени расстояний от текущей точки до наблюдательных постов. На врезке приведен фрагмент программного кода, реализующего эти вычисления.

Private Sub Form_Click()
 n = 10
 m = 100
 Randomize Timer
 zmin = 100
 zmax = 0
 For k = 1 To n
  x(k) = 100 * Rnd
  y(k) = 100 * Rnd
  z(k) = 100 * Rnd
  If zmax < z(k) Then zmax = z(k)
  If zmin > z(k) Then zmin = z(k)
 Next k
 For i = 1 To m
  For j = 1 To m
   sr = 0: srz = 0
   For k = 1 To n
    r(k) = (x(k) - i) ^ 2 + (y(k) - j) ^ 2
    a = 1 / r(k)
    sr = sr + a
    srz = srz + a * z(k)
   Next k
   sz = srz / sr
   c = ((sz - zmin) / (zmax - zmin)) * 255
   Line (3 * (i - 1), 3 * (j - 1))-
     (3 * i - 1, 3 * j - 1), RGB(c, c, c), BF
  Next j
 Next i
End Sub

В примере первоначально куб размером 100x100x100 заполняется десятью точками со случайными координатами x, y и z. Далее z рассматривается как зависимая переменная, и для нее строится "средневзвешенная" поверхность. Для вычисления весовых коэффициентов в программе используется выражение ak=1/rk, где rk - квадрат расстояния от данной текущей точки до k-того поста. На приведенном тоновом рисунке изображена одна из средневзвешенных поверхностей, полученная с помощью данного программного кода.

Метод средневзвешенной интерполяции мне как-то довелось использовать для визуализации данных о загрязненности снежного покрова Минска. Концентрации различных загрязнителей были измерены в пробах снега, взятых примерно в семидесяти точках в различных районах города. Далее по этим данным необходимо было построить общую непрерывную визуальную картину загрязненности тем или иным видом загрязнителей. Я использовал взвешенное среднее, а группа исследователей параллельно обрабатывала эти данные иными методами. Результаты получились сопоставимы и визуально схожи.

Сейчас, в эпоху глобального потепления и погодных аномалий, было бы интересно применить этот метод в иных более крупных масштабах, чем отдельно взятый город. Можно, например, на занятиях по информатике построить температурную карту республики в различные сезоны и годы, а затем произвести ретроспективный анализ ее изменений. Можно при помощи интернета узнать погоду в опорных точках по всему миру и на очередной лабораторной работе построить глобальную карту распределения тепла и холода на всей нашей планете.

А. КОЛЕСНИКОВ,
andr61@mail.ru

Версия для печатиВерсия для печати

Номер: 

35 за 2002 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!