Урок №17.

Обработка данных

Этот урок посвящен традиционной обработке данных. В нем приведены основные функции для обработки данных, представленных массивами. Они широко используются для анализа данных физических, химических, экономических и иных экспериментов. Это большой урок, рассчитанный на разбиение его на части или выборочное изучение. Последнее более предпочтительно, поскольку урок охватывает данную тему достаточно широко.

Статистическая обработка данных

Нахождение максимального и минимального элементов массива

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

Примеры:

» A=magic(7)

30

39

48

1

10

19

28

38

47

7

9

18

27

29

46

6

8

17

26

35

37

5

14

16

25

34

36

45

13

15

24

33

42

44

4

21

23

32

41

43

3

12

22

31

40

49

2

11

20

» С = max(A) 

С=

46 47 48 49 43 44 45 

» С = max(A.[ ].l) 

С =

46 47 48 49 43 44 45 

» С = max(A.[ ],2) 

С =

48

47

46

45

44

43

49

»[C,I]=max(A)

C=

49 43 44 45

I=

7 6 5 4

Для быстрого нахождения элемента массива с минимальным значением служит следующая функция:

Пример:

» A=magic(4) 

А =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

» [C.I] = min(A)

C =

4 2 3 1

 I =

4 1 1 4

Работа указанных функций базируется на сравнении численных значений элементов массива А, что и обеспечивает высокую скорость выполнения операций.

Нахождение средних, срединных значений массива и стандартных отклонений

Элементарная статистическая обработка данных в массиве обычно сводится к нахождению их среднего значения, медианы (срединного значения) и стандартного отклонения. Для этого в системе MATLAB определены следующие функции:

Примеры:

» А = [1

2 6 4

8; 6 7

13 5 4;

7 9 0]

А =





1

2

6

4

8

6

7

13

5

4

7

9

0

8

12

6

6

7

1

2

» mean(A)





ans =





5.0000

6.0000

6.5000

4.5000

6.5000

»mean(A.

2)




ans =





4.2000





7.0000





7.2000





4.4000





Примеры:

» A=magic(6)

35

1

6

26

19

24

3

32

7

21

23

25

31

9

2

22

27

20

8

28

33

17

10

15

30

5

34

12

14

16

4

36

29

13

18

11

» M=median(A) 

М =

19.000018.500018.000019.000018.500018.0000 

» M=median(A,2) 

М =

21.5000

22.0000

21.0000

16.0000

15.0000

15.5000

Примеры:

» X = linspace(0,3*pi,10) 

X = Columns 1 through 7

0 1.0472 2.0944 3.1416 4.1888 5.2360 6.2832

Columns 8 through 10

7.3304 8.3776 9.4248 

» s = std(X) 

s =

3.1705

Функции сортировки элементов массива

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

Примеры:

» A=magic(5)

А =





17

24

1

8

15

23

5

7

14

16

4

б

13

20

22

10

12

19

21

3

11

18

25

2

9

» [В.

B=

INDEX] 

sort(A)



4

5

1

2

3

10

6

7

8

9

11

12

13

14

15

17

18

19

20

16

23

24

25

21

22

index=






3

2

1

5

4

4

3

2

1

5

5

4

3

2

1

1

5

4

3

2

2

1

5

4

3

Примеры:

» А=[2 35689: 5 7 1 2 3 5:1 3 2 1 5 1:5 0 8 8 4 3] 

А =


2

3   5

6

8

9


5

7   1

2

3

5


1

3   2

1

5

1


5

0   8

8

4

3

»

В=

sortrows(A)




в

=






1

3   2

1

5

1


2

3  5

6

3

9


5

0   8

8

4

3


5

7   1

2

3

5

» b = sortrows(A.3)
b=

5

7

1

2

3

5

1

3

2

1

5

1

2

3

5

6

8

9

5

0

8

8

4

3

Пример:

» А=[23+121.34-31.45:23-121.-12.21:-3.34+31.-21] 

А =

23.0000 + 12.00001 34.0000 - 3.00001 45.0000

23.0000 - 12.00001 -12.0000 0 + 2.00001

-3.0000 34.0000 + 3.00001 0 - 2.00001

» cplxpair(A) 

ans =

23.0000 - 12.00001 34.0000 - 3.00001 0 - 2.00001

23.0000 + 12.00001 34.0000 + 3.00001 0 + 2.00001

-3.0000 -12.0000 45.0000

Вычисление коэффициентов корреляции

Под корреляцией понимается взаимосвязь некоторых величин, представленных данными — векторами или матрицами. Общепринятой мерой линейной корреляции является коэффициент корреляции. Его близость к единице указывает на высокую степень линейной зависимости. Данный раздел посвящен описанию функции для вычисления коэффициентов корреляции и определения ковариационной матрицы элементов массива. Приведенная ниже функция позволяет вычислить коэффициенты корреляции для входного массива данных.

» M=magic(5)

M =





17

24

1

8

15

23

5

7

14

16

4

6

13

20

22

10

12

19

21

3

11

18

25

2

9

» S=corrcoef(M) 

S =

1.0000 0.0856 -0.5455 -0.3210 -0.0238

0.0856 1.0000 -0.0981 -0.6731 -0.3210

-0.5455 -0.0981 1.0000 -0.0981 -0.5455

-0.3210 -0.6731 -0.0981 1.0000 0.0856

-0.0238 -0.3210 -0.5455 0.0856 1.0000

В целом, корреляция данных довольно низкая. В данных, расположенных по диагонали — здесь коэффициенты корреляции равны 1, — вычисляется линейная корреляция переменной со своей копией.

Вычисление матрицы ковариации

Приведенная далее функция позволяет вычислить матрицу ковариации для массива данных.

Пример:

» D=[2 -3 6:3 6 -1:9 8 5]:C=cov(D) 

С =

14.3333 16.3333 3.6667

16.3333 34.3333 -10.3333

3.6667 -10.3333 14.3333 

» diag(cov(D)) 

ans =

14.3333

34.3333

14.3333

» sqrt(diag(cov(D))) 

ans =

3.7859

5.8595

3.7859 

» std(D) 

ans =

3.7859 5.8595 3.7859

Триангуляция

Далее мы рассмотрим функции геометрического анализа данных. Такой анализ не относится к достаточно распространенным средствам анализа данных, но для специалистов он представляет несомненный интерес.

Пусть есть некоторое число точек. Триангуляция Делоне — это множество линий, соединяющих каждую точку с ее ближайшими соседними точками. Диаграммой Вороного называют многоугольник, вершины которого — центры окружностей, описанных вокруг треугольников Делоне.

Расчет триангуляции

В системе MATLAB определены функции триангуляции Делоне, триангуляции Делоне для ближайшей точки и поиска наилучшей триангуляции. Рассмотрим функции, реализующие триангуляцию Делоне.

» rand('state',0);

» x=rand(1.25);

» y=rand(1.25); 

» TRI = delaunay(x.y);

» trimeshCTRI,x.y,zeros(size(x)))

» ax1s([0 101]); hold on;

» plot(x.y.'o')

Триангуляция трехмерных и n-мерных массивов (п>=2) осуществляется при помощи функций delaunayS и delaunayn соответственно. Эти функции используют не алгоритм вычисления диаграмм Вороного, как del aunay, а алгоритм qhul 1 Национального научно-технического и исследовательского центра визуализации и вычисления геометрических структур США [В MATLAB 6.1 функции delaunay, convhull, griddata, voronoi также используют qhull. - Примеч. ред.].

Построенная по приведенному ранее примеру диаграмма представлена на рис. 17.1.

Рис. 17.1. Пример применения функции delaunay

Нахождение выпуклой оболочки

В системе MATLAB определена функция вычисления точек выпуклой оболочки:

» хх=-0.8:0.03:0.8;

» уу = abstsqrt(xx));

» [х,у] = po!2cart(xx.yy);

» k = convhuTI(x.y);

» plot(x(k).y(k).'r:',x,y,'g*')

Рис. 17.2. Пример использования функции convhull

Рис. 17.2 иллюстрирует применение функции convhull для построения выпуклой оболочки. Функция convhulln вычисляет n-мерную выпуклую поверхность, основана на алгоритме qhull.

Вычисление площади полигона

В системе MATLAB определены функции, вычисляющие площадь полигона и анализирующие нахождение точек внутри полигона. Для вычисления площади полигона используется функция polyarea:

» L = linspace(0.3*pi,10);

» X= sin(L)';

» Y=cos(L)';

» А = polyarea(X.Y)

А =

3.8971 

» plot(X.Y.'m')

Рис. 17.3. Область многоугольника, для которого вычислена площадь

Построенный по этому примеру многоугольник представлен на рис. 17.3. В данном примере использована функция linspace(xl.x2,N), генерирующая N точек в промежутке от x1 до х2 с последующим формированием векторов X и Y для построения многоугольника в полярной системе координат.

Анализ попадания точек внутрь полигона

Функция Inpolygon используется для анализа того, попадают ли заданные точки внутрь полигона:

» L = linspace(0.2*pi,8);

» yv = sln(L)';

» xv - cos(L)';

» x - randn(l00.l); у = randn(l00.l);

» IN = inpolygon(x.y.xv.yv);

» plot(xv.yv.'k',x(IN),y(IN).'r*'.x(~IN).y(~IN).'bo')

Построенные в этом примере массив точек и полигон представлены на рис. 17.4.

Рис. 17.4. Пример применения функции inpolygon

Точки, попавшие внутрь полигона, обозначены символом звездочки, а точки вне полигона обозначены кружками.

Построение диаграммы Вороного

Для построения диаграммы Вороного служат следующие команды:

Пример:

» rand('state'.0):

» x = randd.15): у = randd.15):

» TRI = delaunay(x.y);

» subplotd.2,1)....

» trimesh(TRI,x,y,zeros(s1ze(x))); view(2),...

» axis([0 101]); hold on;

» plot(x.y,'o');

» [vx, vy] = voronoi(x.y.TRI);

» subplot(l,2,2)....

» plot(x,y,'r+',vx,vy,'b-'),...

» axis([0 1 0 1])

Рисунок 17.5 (слева) иллюстрирует построение треугольников Делоне. На рисунке справа изображены знаками «плюс» центры окружностей, проведенных вокруг треугольников Делоне.

Функция [V,C]=voronoin(X) служит для построения диаграмм Вороного n-мерных данных. V — массив граней, С —массив клеток диаграмм. При n=2 вершины граней Вороного возвращаются в порядке смежности, при п>2 — в порядке убывания.

Рис. 17.5. Связь триангуляции Делоне с диаграммой Вороного

Преобразования Фурье

Разработка преобразований Фурье сыграла огромную роль в появлении и развитии ряда новых областей науки и техники. Достаточно отметить, что электротехника переменного тока, электрическая связь и радиосвязь базируются на спектральном представлении сигналов. Ряды Фурье также можно рассматривать как приближение произвольных функций (определенные ограничения в этом известны) тригонометрическими рядами бесконечной длины. При конечной длине рядов получаются наилучшие среднеквадратические приближения. MATLAB содержит функции для выполнения быстрого одномерного и двумерного быстрого дискретного преобразования Фурье. Для одномерного массива*с длиной N прямое и обратное преобразования Фурье реализуются по следующим формулам:

 

Прямое преобразование Фурье переводит описание сигнала (функции времени) из временной области в частотную, а обратное преобразование Фурье переводит описание сигнала из частотной области во временную. На этом основаны многочисленные методы фильтрации сигналов.

Функции одномерного прямого преобразования Фурье

В описанных ниже функциях реализован особый метод быстрого преобразования Фурье — Fast Fourier Transform (FFT, или БПФ), позволяющий резко уменьшить число арифметических операций в ходе приведенных выше преобразований. Он особенно эффективен, если число обрабатываемых элементов (отсчетов) составляет 2т, где т — целое положительное число. Используется следующая функция:

Для иллюстрации применения преобразования Фурье создадим трехчастотный сигнал на фоне сильного шума, создаваемого генератором случайных чисел:

»t=0:0.0005:1:

»x=sin(2*pi*200*t)+0.4*sin(2*pi*150*t)

+0.4*sin(2*pi*250*t): 

» y=x+2*randn(size(t)); 

» plot(y(l:100).'b')

Рис. 17.6. Форма зашумленного сигнала

Этот сигнал имеет среднюю частоту 200 рад/с и два боковых сигнала с частотами 150 и 250 рад/с, что соответствует амплитудно-модулированному сигналу с частотой модуляции 50 рад/с и глубиной модуляции 0.8 (амплитуда боковых частот составляет 0.4 от амплитуды центрального сигнала). На рис. 17.6 показан график этого сигнала (по первым 100 отсчетам из 2000). Нетрудно заметить, что из него никоим образом не видно, что полезный сигнал — амплитудно-модулированное колебание, настолько оно забито шумами. Теперь построим график спектральной плотности полученного сигнала с помощью прямого преобразования Фурье, по существу переводящего временное представление сигнала в частотное. Этот график в области частот до 300 Гц (см. рис. 17.6) строится с помощью следующих команд:

» Y=fft(y,1024): 

» Pyy=*Y.*conj(Y)/1024; 

» f=2000*(0:150)/1024; 

» plot(f.Pyy(l:151)).grid

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

Рис. 17.7. График спектральной плотности приведенного на рис. 17.6 сигнала

Функции многомерного прямого преобразования Фурье

Для двумерного прямого преобразования Фурье используется функция fft2:

Для многомерного прямого преобразования Фурье также существует функция:

Функция перегруппировки

Функция Y = fftshift(X) перегруппировывает выходные массивы функций fft и fft2, размещая нулевую частоту в центре спектра, что иногда более удобно. Если X — вектор, то Y — вектор с циклической перестановкой правой и левой половин исходного вектора. Если X — матрица, то Y — матрица, у которой квадранты I и III меняются местами с квадрантами II и IV [Для одно- и двумерных массивов функция fftshift(X) эквивалентна функции rot90{X.2)]. Рассмотрим следующий пример. Вначале построим график спектральной плотности мощности (рис. 17.8) при одномерном преобразовании Фурье:

» rand('state'.0);

» WhO.001:0.512;

» x=sin(2*pi*50*t)+sin(2*pi*120*t);

» y=x+2*randn(size(t))+0.3;

» Y=fft(y);

» Pyy=Y.*conj(Y)/512:

» f=1000*(0:255)/512:

Рис. 17.8. График спектральной плотности сигнала после одномерного преобразования Фурье

Здесь мы ограничились 512 отсчетами, с тем чтобы использовать эффективны!: метод быстрого преобразования Фурье, при котором число отсчетов должно быт: 2N, где N - целое число. Теперь воспользуемся функцией fftshift:

» Y=fftshift(Y);

» Pyy=Y.*conj(Y)/512;

» p1ot(Pyy).grid

Полученный при этом график представлен на рис. 17.9.

Рис. 17.9. График спектральной плотности того же сигнала после применения функции fftshift

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

Функции обратного преобразования Фурье

Возможно одномерное обратное преобразование Фурье, реализуемое следующими функциями:

Для любого X результат последовательного выполнения прямого и обратного преобразований Фурье ifft(fft(x)) равен X с точностью до погрешности округления. Если X — массив действительных чисел, ifft(fft(x)) может иметь малые мнимые части.

Пример:

» V=[l 1110000]: 

» fft(V)

ans =

Columns 1 through 4

4.0000 1.0000 - 2.41421 0 1.0000 - 0.41421 

Columns 5 through 8

 0 1.0000 + 0.41421 0 1.0000 + 2.41421

» 1fft(fft(V)) 

ans =

l 1 1 1 0 0 0 0

Аналогичные функции есть для двумерного и многомерного случаев:

Свертка и дискретная фильтрация

Функция свертки и обратная ей функция

В этом разделе рассмотрены базовые средства для проведения операций свертки и фильтрации сигналов на базе алгоритмов быстрого преобразования Фурье. Многие дополнительные операции, относящиеся к этой области обработки сигналов, можно найти в пакете прикладных программ Signal Processing Toolbox.

Для двух векторов х и у с длиной тип определена операция свертки:

В ее результате получается вектор z с длиной (т+п- 1). Для осуществления свертки используется функция conv(x.y).

Обратная свертке функция определена как [q,r]=deconv(z,x). Она фактически определяет импульсную характеристику фильтра. Если z=conv(x,y), то q=y и г=0. Если х и у — векторы с коэффициентами полиномов, то свертка эквивалентна перемножению полиномов, а обратная операция — их делению. При этом вектор q возвращает частное (фактор), а вектор r - остаток от деления полиномов.

Функция свертки двумерных массивов

Для двумерных массивов также существует функция свертки: Z=conv2(X.Y) и Z=conv2(X,Y. 'option').

Для двумерных массивов X и Y с размером m хп и тхп соответственно результат двумерной свертки порождает массив размера (т +т -1)х(m +п -1). Во второй форме функции параметр option может иметь следующие значения:

Возможность изменить решение или трактовку данных с помощью параметров является свойством ряда функций системы MATLAB. Позже мы столкнемся с этой возможностью еще не раз.

Дискретная одномерная фильтрация

MATLAB может использоваться для моделирования работы цифровых фильтров. Для обеспечения дискретной одномерной фильтрации используется функция filter в следующих формах записи:

a(l)*y(n) = b(1)*x(n) + b(2)*х(п-1) + ... + b(nb+l)*x(n-nb) -- а(2)*у(п-1) - ... - a(na+l)*y(n-na).

Если а(1) не равно 1, то коэффициенты уравнения нормализуются относительно а (1). Когда X — матрица, функция filten оперирует столбцами X. Возможна фильтрация многомерного (размерности N) массива.

Рассмотрим типовой пример фильтрации гармонического сигнала на фоне других сигналов — файл с именем filtdem.m из пакета расширения Signal Processing Toolbox.

Следующий кадр иллюстрирует конструирование фильтра с достаточно плоской вершиной амплитудно-частотной характеристики (АЧХ) и полосой частот, обеспечивающего выделение сигнала с частотой 15 Гц и подавление сигналов с частотами 5 и 30 Гц. Для формирования полосы пропускания фильтра используется функция el 11 р, а для построения АЧХ — функция freqz (обе — из пакета Signal Processing Toolbox). Это позволяет построить график АЧХ созданного фильтра.

Следующий кадр примера иллюстрирует эффективность выделения сигнала заданной частоты (15 Гц) с помощью операции фильтрации — функции filter, описанной выше. Можно заметить два обстоятельства — полученный стационарный сигнал практически синусоидален, что свидетельствует о высокой степени фильтрации побочных сигналов. Однако нарастание сигнала во времени идет достаточно медленно и занимает несколько периодов частоты полезного сигнала. Характер нарастания сигнала во времени определяется переходной характеристикой фильтра.

Заключительный кадр показывает спектр исходного сигнала и спектр сигнала на выходе фильтра (он показан линиями другого цвета, что, к сожалению, не видно на черно-белом рисунке). Для построения спектров используется прямое преобразование Фурье — функция fft.

Этот пример наглядно иллюстрирует технику фильтрации. Рекомендуется просмотреть дополнительные примеры, которые есть в разделе Demos системы применительно к пакету расширения Signal Processing (если этот пакет установлен).

Двумерная фильтрация

Для осуществления двумерной фильтрации служит функция filter2:

Функция коррекции фазовых углов unwrap

Фазовые углы одномерных массивов испытывают разрывы при переходе через значения, кратные р. Функции unwrap(P) и unwrap(P,cutoff) устраняют этот недостаток одномерного массива Р, дополняя значения углов в точках разрыва значениями ±2р. Если Р — двумерный массив, то данная функция применяется к столбцам. Параметр cutoff (по умолчанию равный р) позволят назначить любой критический угол в точках разрыва. Функция используется при построении фазочастотных характеристик (ФЧХ) фильтров. Поскольку они строятся редко, оставим за читателем изучение практического применения данной функции.

Интерполяция и аппроксимация данных

Под аппроксимацией обычно подразумевается описание некоторой, порой не заданной явно, зависимости или совокупности представляющих ее данных с помощью другой, обычно более простой или более единообразной зависимости. Часто данные находятся в виде отдельных узловых точек, координаты которых задаются таблицей данных.

Результат аппроксимации может не проходить через узловые точки. Напротив, задача интерполяции — найти данные в окрестности узловых точек. Для этого используются подходящие функции, значения которых в узловых точках совпадают с координатами этих точек. Например, при линейной интерполяции зависимости у(х) узловые точки соединяются друг с другом отрезками прямых и считается, что искомые промежуточные точки расположены на этих отрезках.

Для повышения точности интерполяции применяют параболы (квадратичная интерполяция) или полиномы более высокой степени (полиномиальная интерполяция). Для обработки данных MATLAB использует различные функции интерполяции и аппроксимации данных. Набор таких функций вместе с несколькими вспомогательными функциями описан в этом разделе.

Полиномиальная регрессия

Одна из наиболее известных аппроксимаций — полиномиальная. В системе MATLAB определены функции аппроксимации данных полиномами по методу наименьших квадратов — полиномиальной регрессии. Это выполняет функция, приведенная ниже:

Рис. 17.10. Пример использования функции polyfit

Пример (полиномиальная регрессия для функции s

» х=(-3:0.2:3)':

y=sin(x);

p=polyflt(x.y,3)

р =

-0.0953 0.0000 0.8651 -0.0000 

»x=(-4:0.2:4)';y=sin(x); 

» f=polyval(p,x);plot(x.y.'o',x,f)

Рис. 17.14, построенный в этом примере, дает наглядное представление о точности полиномиальной аппроксимации. Следует помнить, что она достаточно точна в небольших окрестностях от точки х = 0, но может иметь большие погрешности за их пределами или в промежутках между узловыми точками.

График аппроксимирующего полинома третьей степени на рис. 17.10 показан сплошной линией, а точки исходной зависимости обозначены кружками. К сожалению, при степени полинома свыше 5 погрешность полиномиальной регрессии (и аппроксимации) сильно возрастает и ее применение без центрирования и масштабирования становится рискованным. Обратите внимание на то, что при полиномиальной регрессии узловые точки не ложатся точно на график полинома, поскольку их приближение к нему является наилучшим в смысле минимального среднеквадратического отклонения. Об этом уже говорилось.

Интерполяция периодических функций рядом Фурье

Под интерполяцией обычно подразумевают вычисление значений функции f(x) в промежутках между узловыми точками. Линейная, квадратичная и полиномиальная интерполяция реализуются при полиномиальной аппроксимации. А вот для периодических (и особенно для гладких периодических) функций хорошие результаты может дать их интерполяция тригонометрическим рядом Фурье. Для этого используется следующая функция:

Рис. 17.11. Пример использования функции interpft

Пример:

» x=0:10:y-sin(x).^3:

» xl-0:0.1:10;yl-interpft(y,101);

» x2=0:0.01:10:y2-sin(x2).^3;

» plot(xl,yl, '--').hold on.plotCx.y. 'o' .x2.y2)

Рис. 17.11 иллюстрирует эффективность данного вида интерполяции на примере функции sin(x).^3, которая представляет собой сильно искаженную синусоиду.

Исходная функция на рис. 17.12 представлена сплошной линией с кружками, а интерполирующая функция — штрих-пунктирной линией.

Интерполяция на неравномерной сетке

Для интерполяции на неравномерной сетке используется функция griddata:

XI может быть вектором-строкой, в этом случае он определяет матрицу с постоянными столбцами. Точно так же YI может быть вектором-столбцом, тогда он определяет матрицу с постоянными строками.

Метод определяет тип аппроксимирующей поверхности. Метод 'cubic1 формирует гладкие поверхности, в то время как 'linear' и 'nearest' имеют разрывы первых и нулевых производных соответственно. Все методы, за исключением v4, основаны на триангуляции Делоне. Метод ' v4 ' включен для обеспечения совместимости с версией 4 системы MATLAB. Пример:

» x=rand(120.1)*4-2;y=rand(120.1)*4-2;

z=x.*y.*exp(-x.^2-y.^2); 

» t=-2:0.1:2:[X,Y]=meshgrid(t,t);

Z=griddata(x.y.z.X.Y): 

» mesh(X.Y.Z).hold on.plot3(x.y,z, 'ok')

Функции griddataS и griddatan работают аналогично griddata, но для для трехмерного и n-мерного случая — с использованием алгоритма qhul 1 . Используются, в частности, при трехмерной и n-мерной триангуляции.

Рис. 17.13 иллюстрирует применение функции griddata.

Рис 17.12. Пример использования функции griddata

Одномерная табличная интерполяция

В ряде случаев очень удобна сплайновая интерполяция и аппроксимация таблично заданных функций. При ней промежуточные точки ищутся по отрезкам полиномов третьей степени — это кубическая сплайновая интерполяция. При этом обычно такие полиномы вычисляются так, чтобы не только их значения совпадали с координатами узловых точек, но также чтобы в узловых точках были непрерывны производные первого и второго порядков. Такое поведение характерно для гибкой линейки, закрепленной в узловых точках, откуда и происходит название spline (сплайн) для этого вида интерполяции (аппроксимации). Для одномерной табличной интерполяции используется функция interpl:

Все методы интерполяции требуют, чтобы значения х изменялись монотонно. Когда х — вектор равномерно распределенных точек, для более быстрой интерполяции лучше использовать методы '*1inear', '*cubic', '*nearest' или '*spline'. Обратите внимание, что в данном случае наименованию метода предшествует знак звездочки.

Пример (интерполяция функции косинуса):

» x=0:10:y=cos(x);

» xi=0:0.1:10:

» yi=interpl(x.y.xi);

» plot(x,y.'x',xi,yi,'g'),hold on

» yi=interpl(x,y.xi.'spline'): 

» plot(x.y,'o',xi,yi,'m').grid,hold off

Узловые точки на рис. 17.17 обозначены кружками с наклонными крестиками. Одна из кривых соответствует линейной интерполяции, другая — сплайн-интерполяции. Нетрудно заметить, что сплайн-интерполяция в данном случае дает гораздо лучшие результаты, чем линейная интерполяция. При последней точки просто соединяются друг с другом отрезками прямых, так что график интерполирующей кривой при линейной интерполяции получается негладким.

Двумерная табличная интерполяция

Двумерная интерполяция существенно сложнее, чем одномерная, рассмотренная выше, хотя смысл ее тот же — найти промежуточные точки некоторой зависимости z(x, у) вблизи расположенных в пространстве узловых точек. Для двумерной табличной интерполяции используется функция interp2:

Все методы интерполяции требуют, чтобы X и Y изменялись монотонно и имели такой же формат, как если бы они были получены с помощью функции meshgrid. Когда X и Y — векторы равномерно распределенных точек, для более быстрой интерполяции лучше использовать методы '*1inear', '*cubic', или '*nearest'.

Пример:

» [X.Y]=meshgrid(-3:0.25:3);

Z=peaks(X/2.Y*2):

» [Xl,Yl]=meshgrid(-3:0.1:3);

Zl=interp2(X,Y.Z.Xl.Yl):

» mesh(X.Y,Z).hold on.mesh(Xl.Yl,Zl+15).hold off

Рис. 17.13. Применение функции interpZ

Рис. 17.13 иллюстрирует применение функции interp2 для двумерной интерполяции (на примере функции peaks).

В данном случае поверхность снизу — двумерная линейная интерполяция, которая реализуется по умолчанию, когда не указан параметр method.

Трехмерная табличная интерполяция

Для трехмерной табличной интерполяции используется функция interp3:

Все методы интерполяции требуют, чтобы X, Y и Z изменялись монотонно и имели такой же формат, как если бы они были получены с помощью функции meshgrid. Когда X и Y и Z — векторы равномерно распределенных в пространстве узловых точек, для более быстрой интерполяции лучше использовать методы '*li'near', '*cubic' или '*nearest'.

N-мерная табличная интерполяция

MATLAB позволяет выполнить даже n-мерную табличную интерполяцию. Для этого используется функция interpn:

В связи с редким применением такого вида интерполяции, наглядная трактовка которой отсутствует, примеры ее использования не приводятся.

Интерполяция кубическим сплайном

Сплайн-интерполяция используется для представления данных отрезками полиномов невысокой степени — чаще всего третьей. При этом кубическая интерполяция обеспечивает непрерывность первой и второй производных результата интерполяции в узловых точках. Из этого вытекают следующие свойства кубической сплайн-интерполяции:

Как отмечалось, в переводе spline означает «гибкая линейка». График интерполирующей функции при этом виде интерполяции можно уподобить кривой, по которой изгибается гибкая линейка, закрепленная в узловых точках. Реализуется сплайн-интерполяция следующей функцией:

Пример:

» х=0:10: y=3*cos(x);

» xl=0:0.1:11;

» y1=spline(x,y.xl);

» plot(x.y,'о'.xl.yl.'--')

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

Результат интерполяции показан на рис. 17.14.

Рис. 17.14. Пример применения функции spline

Ввиду важности сплайн-интерполяции и аппроксимации в обработке и представлении сложных данных в состав системы MATLAB входит пакет расширения Spline Toolbox, содержащий около 70 дополнительных функций, относящихся к реализации сплайн-интерполяции и аппроксимации, а также графического представления сплайнами их результатов. Для вызова данных об этом пакете (если он установлен) используйте команду help splines.

Обработка данных в графическом окне

Средства обработки данных в графическом окне

Решение большинства задач интерполяции и аппроксимации функций и табличных данных обычно сопровождается их визуализацией. Она, как правило, заключается в построении узловых точек функции (или табличных данных) и в построении функции аппроксимации или интерполяции. Для простых видов аппроксимации, например полиномиальной, желательно нанесение на график формулы, полученной для аппроксимации.

В MATLAB 6,0 совмещение функций аппроксимации с графической визуализацией доведено до логического конца — предусмотрена аппроксимация рядом методов точек функции, график которой построен. И все это выполняется прямо в окне редактора графики Property Editor. Для этого в позиции Tools графического окна имеются две новые команды:

Команда Basic Fitting открывает окно, дающее доступ к ряду видов аппроксима-- ции и регрессии: сплайновой, эрмитовой и полиномиальной со степенями от 1 (линейная аппроксимация) до 10. В том числе со степенью 2 (квадратичная аппроксимация) и 3 (кубическая аппроксимация). Команда Data Statistics открывает окно с результатами простейшей статистической обработки данных.

Полиномиальная регрессия для табличных данных

Рассмотрим самый характерный пример обработки данных, примерно представляющих некоторую (например, экспериментальную) зависимость вида у(х). Пусть она задана в табличной форме, причем колонки таблицы соответствуют элементам векторов X и Y одинакового размера в следующем примере:

» Х=[2.4,6.8.10.12.14];

» Y=[3.76.4.4.5.1.5.56.6.6.3.6.7];

» plot(X.Y.'o');

Напомним, что последняя команда строит график узловых точек кружками (без соединения их отрезками прямых).

Рис. 17.15 показывает пример выполнения полиномиальной регрессии (аппроксимации) для степеней полинома 1, 2 и 3 (дальнейшее повышение степени полинома в данном случае уже лишено смысла, поскольку графики полиномиальной регрессии со степенью выше 3 почти не различаются).

Рис. 17.15. Пример обработки табличных данных в графическом окне

Поясним, что же показано на рис. 17.20. В левом верхнем углу сессии MATLAB видна запись приведенных выше исходных векторов и команды построения заданных ими точек кружками. Справа показано большое окно графики с построенными в нем кружками узловыми точками.

При проведении полиномиальной аппроксимации надо помнить, что максимальная степень полинома на 1 меньше числа точек, т. е. числа элементов в векторах X и Y.

Исполнив команду Tools > Basic Fitting, можно получить окно регрессии. Оно показано на рис. 17.20 слева прямо под записью исходных команд в командной строке. В этом окне птичкой отмечены три вида полиномиальной регрессии — порядка 1 (linear — линейная), 2 (quadratic — квадратичная) и 3 (cubic — кубическая). Стоит отметить какой-либо вид регрессии, как соответствующая кривая функции регрессии (аппроксимации) появится в графическом окне.

Установив птичку у параметра Show equations (Показать уравнения), можно получить в графическом окне запись уравнений регрессии (аппроксимации). Наконец, можно сместить выводимую по умолчанию легенду в место, где она не закрывала бы другие детали графика.

Наконец, исполнив команду Tools > Data Statistics, можно получить окно с рядом статистических параметров данных, представленных векторами X и Y. Отметив птичкой тот или иной параметр в этом окне (оно показано на рис. 17.20 под окном графики), можно наблюдать соответствующие построения на графике, например вертикалей с минимальным, средним и максимальных значением у и горизонталей с минимальным, средним и максимальным значением х.

Безусловно, эта новинка понравится большинству пользователей системы MATLAB 6.0. Однако нельзя не отметить, что статистические данные более чем скупы.

Оценка погрешности аппроксимации

Средства обработки данных из графического окна позволяют строить столбцовый или линейчатый график погрешностей в узловых точках и наносить на эти графики норму погрешности. Норма дает статистическую оценку среднеквадрати-ческой погрешности. Чем она меньше, тем точнее аппроксимация. Для вывода графика погрешности надо установить птичку у параметра Plot residuals (График погрешностей) и в меню ниже этого параметра выбрать тип графика.

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

Сплайновая интерполяция в графическом окне

Попытка аппроксимации полиномом 8-й степени не дает положительного результата — кривая проходит внутри облака точек, совершенно не интерполируя это облако.

Однако если применить сплайновую интерполяцию, то картина кардинально меняется. На этот раз кусочная линия интерполяции прекрасно проходит через все точки и поразительно напоминает синусоиду. Даже ее пики со значениями 1 и -1 воспроизводятся удивительно точно, причем и в случаях, когда на них не попадают узловые точки.

Причина столь великолепного результата кроется в уже отмеченных ранее особенностях сплайновой интерполяции - она выполняется по трем ближайшим

точкам, причем эти тройки точек постепенно перемещаются от начала точечного графика функции к ее концу. Кроме того, непрерывность первой и второй производных при сплайновой интерполяции делает кривую очень плавной, что характерно и для первичной функции — синусоиды. Так что данный пример просто является удачным случаем применения сплайновой интерполяции.

Рис. 17.16. Пример сплайновой интерполяции в графическом окне

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

Эрмитовая многоинтервальная интерполяция

MATLAB 6.0 дает возможность в графическом окне использовать еще один вид многоинтервальной интерполяции на основе полиномов третьей степени Эрмита. Техника интерполяции здесь таже, что и в случае сплайновой интерполяции, (рис. 17.17).

Полиномы Эрмита имеют более гибкие линии, чем сплайны. Они точнее следуют за отдельными изгибами исходной зависимости. Это хорошо показывает рис. 17.17.

Рис. 17.17. Пример эрмитовой интерполяции синусойды в графическом окне

Сравнение сплайновой и эрмитовой интерполяции

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

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

Все это говорит о том, что надо внимательно подходить к оценке приемлемости того или иного вида интерполяции (или аппроксимации) для конкретных типов исходных данных.

Что нового мы узнали?

В этом уроке мы научились: