Мария Николова (предстои допълване на темите, превеждане на английския текст и добавяне на литературните източници)


Работа с матрици в Matlab. Решаване на системи линейни уравнения. Бързо преобразование на Фурие



страница6/10
Дата19.03.2017
Размер0.69 Mb.
#17331
1   2   3   4   5   6   7   8   9   10

Работа с матрици в Matlab. Решаване на системи линейни уравнения. Бързо преобразование на Фурие





  1. Въвеждане на матрици.

Матриците се въвеждат като всеки ред се разделя с точка и запетая или натискане на клавиш Enter, а същи и с вградени функции на Matlab.

Примери:


>> A=[1 2 3; 5 6 7; 8 9 10]

A =


1 2 3

5 6 7


8 9 10
Начин, удобен за задаване на матрици с по-голяма размерност (разделяне с Enter за край на реда):

>> B=[1 5 7

10 11 12

-12 13 14]

B =

1 5 7


10 11 12

-12 13 14


Елементи на матрицата могат да бъдат произволни функции или комплексни числа:

>> Q=[sqrt(4+5^2); 9-8*i; exp(j*4); 3-10;]

Q =

5.3852


9.0000 - 8.0000i

-0.6536 - 0.7568i

-7.0000
Много удобен начин е въвеждане на данните в array editor, особено за големи масиви. – използва се командата openvar име на матрицата. Предварително трябва да се зададе някаква стойност на името на матрицата, макар и единична стойност – напр.
>> H=[0]

H =


0

>> openvar H

след това в редактора за масиви се задава размерността и се попълват елементите.
Размерността на въведената матрица може да се провери освен в Workspace и чрез командата size(име на матрицата) или length(име на матрицата), която връща по-голямата размерност на матрицата. Примери:

>> size(Q)

ans =

4 1


>> size(A)

ans =


  1. 3

>> length(Q)

ans =

4

>> length(A)



ans =

3

Функции за генериране на матрици



  • генериране на матрица с единични елементи –

ones(брой редове на матрицата, брой редове на матрицата)

Пример:


>> M=ones(3,4)

M =


1 1 1 1

1 1 1 1


1 1 1 1


  • генериране на матрица с нулеви елементи

zeros(брой редове на матрицата, брой стълбове на матрицата)
>>E=zeros(1,12)

E =


0 0 0 0 0 0 0 0 0 0 0 0


  • генериране на матрица с произволни стойности на елементите от 0.0 до 1.0 –

rand(брой редове на матрицата, брой стълбове на матрицата)
>> B=rand(2,3)

B =


0.9501 0.6068 0.8913

0.2311 0.4860 0.7621




  • създаване на матрица с единични диагонални елементи-

eye(брой редове на матрицата, брой стълбове на матрицата)

Ако матрицата е квадратна може да се въведе само 1 стойност за ред(стълб) като аргумент и резултат – единична матрица - вж. матрица D.


>> C=eye(2,3)

C =


1 0 0

0 1 0
>> D=eye(3)

D =

1 0 0


0 1 0

0 0 1



  1. Индексиране на елементи – в малки скоби се заграждат номера на реда (стълба), а з многомерните масиви (матрици, индексите се разделят със запетаи – напр. C(2, 3); E(1). Така елементите на матриците участват в изрази, присвоявания, извеждане на стойност

Пример:

>> C(2,3)

ans =

0
>> E(1)



ans =

0
>> E(1)=10*exp(j*pi/6)

E =

Columns 1 through 4



8.6603 + 5.0000i 0 0 0

Columns 5 through 8

0 0 0 0

Columns 9 through 12

0 0 0 0
Знак двуеточие връща последователни редове или стълбове, а когато се приложи върху цялата матрица, резултатът е вектор-стълб от всички елементи на изходната матрица.

>> N=B(:)

N =

0.9501


0.2311

0.6068


0.4860

0.8913


0.7621

Промяна на стойностите на матрица В чрез задаване на последователност от начална:крайна стойност за числата от 11-16 (стъпката е 1).

>> B

B =


0.9501 0.6068 0.8913

0.2311 0.4860 0.7621

>> B(:)=11:16

B =


11 13 15

12 14 16
Създаване на подматрица от съществуваща и добавяне (изключване) на елементи – най-лесно в array editor, но може да се използва двуеточие (:) или функциите за матрични манипулации (описани по-долу) и др.

>> V=B(1:1,1:2)

V =


11 13

3. Операции с матрици.

Аритметичните оператори са +; -; *; /; \; ^;’ - транспониране; аритметични и логически функции.

Решение на матрични уравнения (системи линейни уравнения)

X*B=A -à РЕШЕНИЕ: X=A/B

A*X=B -à РЕШЕНИЕ: X=A\B

Тук А и В са матрици, резултатът също.

Решаване на системи уравнения


Пример:

Да се реши системата уравнения:

х1 + 2х2 + 3х3 = 4

1 + 3х2 +4х3 = 5

1 + 2х2 + 6х3 = 1

а – матрица на коефициентите пред неизвестните

b – матрица на свободните членове на системата от дясната част на системата

х – матрица на решението на системата

>> a=[1 2 3; 2 3 4; 4 2 6]

a =


1 2 3

2 3 4


4 2 6

>> b=[4; 5; 1]

b =

4

5



1

>> x=a\b


x =

-1.5000


2.0000

0.5000
При умножение на матрици се спазва правилото: Аn,k*Bk,mn,m– брой стълбове на първата= брой редове на втората матрица.

За поелементни действия се записва точка преди операцията– напр. .*; ./ и др.

Сравняване на стойности на масиви – с операторите за отношения - >; <; == и т. н.

Функции за матрични манипулации:

> D


D =

1 2 3


-4 5 6

1 0 -1
завъртане на 90°

>> rot90(D)

ans =


3 6 -1

2 5 0


1 -4 1

горна триъгълна матрица:

>> triu(D)

ans =


1 2 3

0 5 6


0 0 -1
долна триъгълна матрица

>> tril(D)

ans =

1 0 0


-4 5 0

1 0 -1
Хоризонтален (разменя стълбове) огледален образ на матрица

>> D

D =


1 2 3

-4 5 6


1 0 -1
>> fliplr(D)

ans =


3 2 1

6 5 -4


-1 0 1
Вертикален (разменя редове) огледален образ на матрица

>> flipud(D)

ans =

1 0 -1


-4 5 6

1 2 3
Прилагане на елементарни матем. операции върху цяла квадратна матрица (а не поелементно) - funm(M,’функция’), където М е името на матрицата, а функцията може да е синус, логаритъм и др.:

> x=funm(D,'log10')

x =


0.2801 + 0.1190i 0.2527 - 0.0377i 0.3399 - 0.4255i

-0.4663 + 0.4443i 0.7660 - 0.1409i 0.6015 - 1.5887i

0.0872 - 0.3877i 0.0131 + 0.1230i 0.1580 + 1.3863i
Горното действие е различно от:

>> log10(D)

Warning: Log of zero.

> In F:\MATHLAB\toolbox\matlab\elfun\log10.m at line 17

ans =

0 0.3010 0.4771



0.6021 + 1.3644i 0.6990 0.7782

0 -Inf 0 + 1.3644i

Детерминанта:

>> det(D)

ans =

-16
Ранг на аргумента:



>> rank(D)

ans =


3

сума от елементите по главния диагонал – следа на матрицата

>> trace(D)

ans =


5

максимална стойност за всеки стълб, ако матрицата е двумерна, ако е матрица-ред или матрица-стълб е 1 число. Функциите за минимум, средноаритметична стойност действат по същия начин.

>> max(D)

ans =


1 5 6
минимална стойност

>> min(D)

ans =

-4 0 -1
средноаритметична стойност



>> mean(D)

ans =


-0.6667 2.3333 2.6667
Сортиране по големина - за матрици работи по стълбове, както и функциите за сума и произведение::

>> sort(D)

ans =

-4 0 -1


1 2 3

1 5 6
Сума от елементите (по стълбове)

>> sum(D)

ans =


-2 7 8
Произведение на елементите (по стълбове)

>> prod(D)

ans =

-4 0 -18
Обратна матрица



>> inv(D)

ans =


0.3125 -0.1250 0.1875

-0.1250 0.2500 1.1250

0.3125 -0.1250 -0.8125
Пример за работа с едномерен масив:

>> g=[12 3 14 56 38 78 90]

g =

12 3 14 56 38 78 90



>> sort(g)

ans =


3 12 14 38 56 78 90

>> min(g)

ans =

3

5. Бързо преобразование на Фурие



FFT(X) is the discrete Fourier transform (DFT) of vector X. For

matrices, the FFT operation is applied to each column. For N-D

arrays, the FFT operation operates on the first non-singleton

dimension.

FFT(X,N) is the N-point FFT, padded with zeros if X has less

than N points and truncated if it has more.

FFT(X,[],DIM) or FFT(X,N,DIM) applies the FFT operation across the

dimension DIM.

For length N input vector x, the DFT is a length N vector X,

with elements

N

X(k) = sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.



n=1

The inverse DFT (computed by IFFT) is given by

N

x(n) = (1/N) sum X(k)*exp( j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N.



k=1
Право преобразование на Фурие – вход-време, изход – спектър(честота).

задаваме времето:

>> t=0:1/99:1

задаваме функцията на времето като сума от 2 синусоиди

>> x=sin(2*pi*10*t)+0.5*sin(2*pi*30*t)
Изчертаваме графиката на получената функция х в зависимост от времето t

>>plot(t,x)




Извикваме функцията за БПФ:

>> y=fft(x)

Изчисляваме амплитудата на спектъра:

>> m=abs(y)

Изчертаването на амплитудата трябва да стане като по ос х се разположат стойностите на честотата.

Изчисляваме честотата:

f=(0:length(y)-1)*99/length(y)

Изчертаваме m::

plot(f,m)

Резултатът е показан на долната фигура, като са въведени заглавие и надписи по осите x и y.


Изчисляваме фазата:

>> p=unwrap(angle(y))

Изчертаваме я:

>>plot(t,p)

Резултат:




ОБФ – вход – спектър(честота), изход – време - функция ifft

>>x2=ifft(y)


Изчертаваме ОПФ на функцията y в зависимост от t

>>plot(t,ifft(y))


Резултат: Графиките на х2 и х в зависимост от t са еднакви.

Втори пример:

> x=[1 2 3 4]

x =


1 2 3 4

>> X=fft(x)

X =

10.0000 -2.0000 + 2.0000i -2.0000 -2.0000 - 2.0000i



>> x=ifft(X)

x =


1 2 3 4

Право и обратно двумерно ПБФ: -

FFT2 Two-dimensional discrete Fourier Transform.

FFT2(X) returns the two-dimensional Fourier transform of matrix X.

If X is a vector, the result will have the same orientation.

FFT2(X,MROWS,NCOLS) pads matrix X with zeros to size MROWS-by-NCOLS

before transforming.
IFFT2 Two-dimensional inverse discrete Fourier transform.

IFFT2(F) returns the two-dimensional inverse Fourier transform

of matrix F. If F is a vector, the result will have the same

orientation.

IFFT2(F,MROWS,NCOLS) pads matrix F with zeros to size MROWS-by-NCOLS

before transforming.


X1=[1+2*i 2+2*i; 3+3*i 4+4*i]

X1 =


1.0000 + 2.0000i 2.0000 + 2.0000i

3.0000 + 3.0000i 4.0000 + 4.0000i


ППФ:

>> Y=fft2(X1,2,2)

Y =

10.0000 +11.0000i -2.0000 - 1.0000i



-4.0000 - 3.0000i 0 + 1.0000i
ОПФ:

>> Z=ifft2(Y)

Z =

1.0000 + 2.0000i 2.0000 + 2.0000i



3.0000 + 3.0000i 4.0000 + 4.0000i
Аналогично е използването:

>> Z=ifft2(Y,2,2)

Z =

1.0000 + 2.0000i 2.0000 + 2.0000i



3.0000 + 3.0000i 4.0000 + 4.0000i

или


>> Y=fft2(X1)

Y =


10.0000 +11.0000i -2.0000 - 1.0000i

-4.0000 - 3.0000i 0 + 1.0000i

Изчертаването е с функцията surf.

Нека е зададен сигнал:

>> s3=[ 0 1.0654 0.6458 0.67 1.05 1.053 -0.08 -0.62 -0.71 -1.04 0.16 1.08 0.59 0.74 1.01 -0.24 -1.07 -0.57 -0.77 -0.99]

s3 =


Columns 1 through 6

0 1.0654 0.6458 0.6700 1.0500 1.0530

Columns 7 through 12

-0.0800 -0.6200 -0.7100 -1.0400 0.1600 1.0800

Columns 13 through 18

0.5900 0.7400 1.0100 -0.2400 -1.0700 -0.5700

Columns 19 through 20

-0.7700 -0.9900

Изчертаваме го

>> plot(s3)



Намираме спектъра и чертаем амплитудата:

plot(abs(fft(s3)))

Намираме спектъра на 32 стойности и чертаем амплитудата:

>> plot(abs(fft(s3,32)))

Обръщаме спектъра и чертаем във времевата област – вижда се, че автоматично попълва сигнала с нули преди да изчисли спектъра.

>>plot(real(ifft(fft(s3,32),32)))




Сподели с приятели:
1   2   3   4   5   6   7   8   9   10




©obuch.info 2024
отнасят до администрацията

    Начална страница