Top Banner
Въведение в MATLAB 1. Основни понятия MATLAB представлява високопроизводителен софтуерен продукт с приложение в инженерната и научната област, който комбинира в себе си пособия за математични изчисления, моделиране и визуализация на получените резултати. Програмният продукт разполага с интуитивна развойна среда и език, позволяващи потребителя да реши специфични инженерни проблеми по-бързо в сравнение с други програмни езици като С/C++. Към настоящият момент са актуални версиите 6.х на продукта. Поддържаните операционни системи са Windows 95/98/ME/2000/NT, UNIX. Освен специализираният програмен език, оптимизиран за решаването на математични, инженерни и др. научни проблеми, основната сила на MATLAB е наборът от библиотеки (toolboxes) с приложени функции, покриващи широк спектър от приложения: комуникации, цифрова обработка на сигнали, бази данни, оптимизация, статистика, символна математика, невронни мрежи, идентификация и много др. Гъвкавостта на продукта се дължи и на възможността за обмен на данни с други продукти, като Excel и др., способността да се ползват библиотеки от функции на С, както и допълнителни пособия за изготвяне на доклади (MATLAB Report server), сървър за приложения (MATLAB Runtime server), WEB сървър. Допълнително към пакета може да се включи програмата Simulink, представляваща интерактивна среда за моделиране и анализ на динамични системи. Базиран на MATLAB, този продукт позволява ползването на широк набор от предварително дефинирани функционални блокове, тяхното свързване в системи, симулиране в реално време и контрол с помощта на интуитивни и аналогични на реално ползваните средства. MATLAB разполага с графичен потребителски интерфейс, организиран в няколко прозореца, комбинирани в обща работна площ. Основните елементи са следните: команден прозорец, дърво на директориите, монитор на ползваните променливи и заеманата
34

MATLA_how

Apr 27, 2015

Download

Documents

Vanya Kostova
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: MATLA_how

Въведение в MATLAB

1. Основни понятияMATLAB представлява високопроизводителен софтуерен продукт с

приложение в инженерната и научната област, който комбинира в себе си пособия за математични изчисления, моделиране и визуализация на получените резултати. Програмният продукт разполага с интуитивна развойна среда и език, позволяващи потребителя да реши специфични инженерни проблеми по-бързо в сравнение с други програмни езици като С/C++. Към настоящият момент са актуални версиите 6.х на продукта. Поддържаните операционни системи са Windows 95/98/ME/2000/NT, UNIX.

Освен специализираният програмен език, оптимизиран за решаването на математични, инженерни и др. научни проблеми, основната сила на MATLAB е наборът от библиотеки (toolboxes) с приложени функции, покриващи широк спектър от приложения: комуникации, цифрова обработка на сигнали, бази данни, оптимизация, статистика, символна математика, невронни мрежи, идентификация и много др. Гъвкавостта на продукта се дължи и на възможността за обмен на данни с други продукти, като Excel и др., способността да се ползват библиотеки от функции на С, както и допълнителни пособия за изготвяне на доклади (MATLAB Report server), сървър за приложения (MATLAB Runtime server), WEB сървър. Допълнително към пакета може да се включи програмата Simulink, представляваща интерактивна среда за моделиране и анализ на динамични системи. Базиран на MATLAB, този продукт позволява ползването на широк набор от предварително дефинирани функционални блокове, тяхното свързване в системи, симулиране в реално време и контрол с помощта на интуитивни и аналогични на реално ползваните средства. MATLAB разполага с графичен потребителски интерфейс, организиран в няколко прозореца, комбинирани в обща работна площ. Основните елементи са следните: команден прозорец, дърво на директориите, монитор на ползваните променливи и заеманата памет, редактор на М-файлове и др. MATLAB е оптимизиран за извършване на числени операции с вектори и матрици. Във връзка с това разполага с широка гама от вградени функции и М-файлове в следните направления: векторни и матрични операции; операции с масиви от данни; операции върху множества; поелементни операции над вектори, матрици и многомерни масиви от данни; елементарни и специални матрици; елементарни и специални математични функции; линейна алгебра; полиноми и диференциални уравнения; числени методи; разнообразие от вградени променливи и константи. За целите на визуализирането и представянето на данните са разработени следните възможности: 2-D графика, 3-D графика, контрол на аспект, увеличение, цветове, настройка на оси, координатни мрежи, заглавия, текстови бележки и шрифт, разнообразни формати за изображения, анимация и звук.

След успешното стартиране на MATLAB се появява командния прозорец на програмния продукт. Този прозорец включва: заглавен ред, лента с менюта, панел с бутони и команден ред.

Page 2: MATLA_how

По-важните команди се представят чрез бутон с икона. По този начин се осигурява бърз достъп до операциите с М – файлове. Такива операции са:New File - създаване на нов М- файл.Open File - отваряне на съществуващ М- файл.Copy - копиране на фрагмент.Paste - вмъкване на фрагмент.Undo - възстановяване само на изпълнените операции.Help - текуща помощ.

В състава на системата MATLAB 5.х/6.x/7.х е включен редактор на М-файлове. Стартирането му може да се извърши по няколко начина: чрез командата edit или edit <име на М-файл>, изпълнена от командния ред или чрез командата File/New/M-file от командния прозорец.

В операционната система MATLAB файловете се съхраняват в папки (folders) и всеки файл има собствен уникален път (pathname). Той представлява списък от папките, през които трябва да се премине от най-външното ниво от папки на устройството, за да се стигне до папката, съдържаща файла. Системата MATLAB използва понятието текуща папка при работа с М- и МАТ- файлове. Това е последната папка, използвана в програмата и е мястото където MATLAB записва файловете по подразбиране. Най-често това е директорията work на MATLAB.

Начините за получаване на помощна информация относно функциите на системата MATLAB са чрез командате help и lookfor или менюто Help. Най-бързият начин за получаване на помощ е командата help <име на М- функция>. Съответстната информация се появява непосредствено в командния прозорец. Например, командата help if извежда в командния прозорец информация за оператора if. Следва да се обърне внимание, че в текста на интерактивните справки се използват главни букви за изписване на имената на функции и променливи. Когато се въвеждат имена на функции от потребителя те се пишат с малки букви.

Всички функции в системата MATLAB са организирани в логически групи и структурата на папките (toolboxes) е основана на тази организация. Например, всички функции на линейната алгебра се намират в папката matfun. Всички функции в нея могат да се разпечатат с кратки пояснения, ако се използва командата help matfun. Командата lookfor позволява търсене на М-функции по ключови думи. Анализира се първият ред от коментара и ако в него е срещната ключовата дума, то той се извежда на екрана.

2. Променливи, числа и оператори в MATLAB

ПроменливиПроменливите са данни, чиято стойност може да се променя по време на

работа. В MATLAB името на променливата следва да започва с (латинска) буква и може да е с произволна дължина, но системата отчита само първите 31 символа. Освен това MATLAB не изисква каквито и да е декларации (например на типа на променливите). Така например записът х1 =25

Page 3: MATLA_how

автоматично създава матрица с размерност 1х1 под името х1 и съхранява в нея стойността 25. По подразбиране MATLAB различава малки и големи букви. Това може да бъде променено със следната команда: casesen on/ff. Променливите могат да са обикновени и индексни (елементи на вектори и матрици). Символните променливи се задават като символния низ е в апострофи.Пример:Tekst = ' This is a simbolic variable'

MATLAB работи със следните системни променливи и константи:inf – системна променлива със стойност машинна безкрайностeps – относителна точност на операциите с плаваща десетична точкаans- променлива, съхраняваща резултата от последната операцияpi – числото 3.14159265…realmin – най-малкото число във формат на плаваща десетична точкаrealmax – най-голямото число във формат на плаваща десетична точкаПроменливите ans и inf могат да се използват в математическите изрази.

ЧислаMATLAB използва конвенционална десетична нотиция и работи както с

реални, така и с комплексни числа от вида z = Re(z)+i*Im(z). За имагинерна единица по подразбиране MATLAB използва буквите i или j. Пример за коректен запис на реални и комплексни чесла са:

3, -99, 0.0001, 9.6397238,1.60210e-20, 5+i*4, 3-7*j

Основните MATLAB-функции за работа с комплексни числа са:real(z) - връща като резултат реалната част на комплексното число zimag(z) - връща като резултат имагинерна част на zangle(z) - изчислява фазов ъгълabs(z) - изчислява абсолютната стойност или модула на комплексното число zconj(z) - изчислява комплексно спрегнато числоВсички числа се съхраняват във формат с плаваща запетая (съгласно стандарта на IEEE) с точност до 16 знака след десетичната точка.

ОператориМатематичните оператори, които стандартно се използват в

компютърните езици са валидни и в MATLAB. Това са+ събиране - изваждане* умножение / деление ^ повдигане в степен ' транспониране ()определя реда на изчислението

За изчисляване на математически изрази е достатъчно те да се запишат коректно и при завършване на въвеждането им (в командния прозорец на MATLAB

Page 4: MATLA_how

) да се натисне клавиша Enter. В случай, че ползвателят не е дефинирал името на променливата, то резултатът се присвоява на системната променлива ans (от англ. ANSwer) и се изобразява на екрана.Пример:9*(1-exp(-2))ans =7.7820

или

x = sqrt(abs(2+i*3))/2даваx = 0.9494

Валидните оператори за отношение в MATLAB са < по- малко<= по- малко или равно> по- голямо>= по- голямо или равно== равно~= различно

а логическите оператори - & и| или~ не

В MATLAB коментари могат да се пишат след символа % (аналог на /* ...*/ в С и // в С++ ).

3. Основни типове данни и операции в MATLABMATLAB е насочен към работа с матрици. Основният изчислителен обект

“по подразбиране” е матрица с комплексни елементи. Въвеждането може да стане непосредствено в командния прозорец (в режим на “калкулатор”) или от външен М-файл. Примерен валиден запис на матрица от реални числа в командния прозорец на MATLAB може да има вида

X = [1 2 3; 4 5 6; 7 8 9]

където елементите на всеки ред на матрицата се отделят с интервал или запетая, а редовете се отделят с точка и запетая. След натискане на Enter в командния прозорец се получава

Page 5: MATLA_how

X = 1 2 3 4 5 6 7 8 9 За предотвратяване извеждането на елементите на матрицата (стойности на вектори, масиви, променливи и др.) следва да се постави ; след последната скоба на матрицата. Аналогично се дефинират и вектори (векторът е частен случай на матрица). Например

X1 = [1 0.2 –3 5 pi]; е петелементен числов вектор.

Достъп до произволен елемент на матрицата X се извършва с X(m, n), където m и n са номерата на съответният ред и стълб. Следва да се има предвид, че индексите на редовете и стълбовете на матриците започват от единица.За избиране на интервал от елементи на вектор или матрица може да се използва операторът за изброяване (двоеточие) : , при което X(:, n) – връща във вид на вектор колоната на матрицата X с индекс n, а X(m, a:b) – връща във вид на вектор елементите от a до b на ред m. Когато двуеточието се приложи върху цялата матрица резултатът е вектор-стълб от всички елементи на изходната матрица.

Пример:X = [1 2 3; 4 5 6];Y = X(:, 2)даваY = 2 5

Y = X(1:2,1:2)даваY =

1 2 4 5

Y = X(:)даваY = 1 2 3 4 5 6

Page 6: MATLA_how

Формирането на матрица от отделни по-малки матрици (или вектори) може да се осъществи посредством хоризонтално или вертикално каскадиране (свързване) на отделните матрици (блокове). Пример: Нека X = [1 2 3; 4 5 6] ; Y = [7 8 9; 10 11 12];Тогава хоризонталното каскадиране на Х и Y дава Z = [X, Y]

Z =

1 2 3 7 8 9 4 5 6 10 11 12

а вертикално каскадиране

Z = [X; Y]

Z =

1 2 3 4 5 6 7 8 9 10 11 12

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

ones(m,n) – създава матрица с размер mxn, чиито елементи са единици.

zeros(m,n) - създава матрица с размер mxn, чиито елементи са нули.

eye(m,n) - създава единична матрица с размер mxn.

rand(m,n) - създава матрица с размер mxn, чиито елементи са разпределени равномерно в интервала [0,1].

randn(m,n) - създава матрица с размер mxn, чиито елементи са разпределени нормално със средно 0 и дисперсия 1.

Пример:X = ones(3,3) даваX = 1 1 1 1 1 1

Page 7: MATLA_how

1 1 1

Записите X = ones(3,3) и X = ones(3) са еквивалентни. Тогава Y = eye(4)даваY = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1

Z = rand(2,4)дава Z = 0.9501 0.6068 0.8913 0.4565 0.2311 0.4860 0.7621 0.0185

MATLAB предоставя възможност за съкратено въвеждане на вектор, стойностите на елементите на който образуват аритметична прогресия. Например векторът X1, чиито елементи са всички числа от 2 до 20 през 2 (т.е. 2, 4,..., 20) може да бъде въведен по следния начин:

X1 = 2:2:20даваX1 = 2 4 6 8 10 12 14 16 18 20

Във всеки конкретен случай следва да се укаже началната стойност, стъпката и крайната стойност на прогресията. По подразбиране, ако стъпката не е указана, тя се приема за единица. Например вектор X, който съдържа всички цели числа от 2 до 20 може да се дефинира, като X = 2:20. Възможно е дефинирането и на отрицателна стъпка. Например записът

X1 = 20:-2:2

дава

X1 = 20 18 16 14 12 10 8 6 4 2

В MATLAB съществуват значителен брой функции за манипулиране (преобразуване) на вектори и матрици. Тук ще бъдат разгледани само част от тях. Нека е зададена числовата матрица X = [1 2 3; 4 5 6; 7 8 9; 10 11 12] с размерност 4х3. Тогава командата fliplr(X) завърта матрицата Х относно вертикалната ос и пренарежда стълбовете на Х така, че най-левият стълб става най-десен.

Page 8: MATLA_how

Пример:X =

1 2 3 4 5 6 7 8 9 10 11 12

Y = fliplr(X)

дава

Y =

3 2 1 6 5 4 9 8 7 12 11 10

Аналогично командата flipud(X) завърта матрицата Х относно хоризонталната ос и пренарежда редовете на Х така, че най-горният ред става последен.

Y = flipud(X)

дава

Y =

10 11 12 7 8 9 4 5 6 1 2 3Командата rot90(X) “завърта” елементите на Х на 90 градуса против часовниковата стрелка:

Y= rot90(X)

дава

Y =

3 6 9 12 2 5 8 11 1 4 7 10

Командата Y = reshape(X, k, l) формира матрица Y с размерност kxl от матрицата

Page 9: MATLA_how

Х с размерност mxn (в конкретния случай 4х3), като е необходимо k*l= m*n. Следователно в разглеждания пример с командата reshape можем да образуваме нова матрица Y с размерност 3х4, 2х6 или 6х2. Тогава

Y = reshape(X,2,6)

дава

Y =

1 7 2 8 3 9 4 10 5 11 6 12

Командата reshape може да се използва и за образуване на матрици от вектори. Например X=1:8

X =

1 2 3 4 5 6 7 8

Y = reshape(X,2,4)

дава

Y =

1 3 5 7 2 4 6 8

Възможно е едновременното използване на повече от една команда! Така например записът

Y = rot90(fliplr(reshape(X,4,2)))

дава матрицата

Y =

1 2 3 4 5 6 7 8

За премахване на елементи от вектори и матрици се използва оператора [] . Например ако X = [1 2 3; 4 5 6; 7 8 9; 10 11 12]

то записът

Page 10: MATLA_how

X(:,3) = []

означава "премахни третият стълб на матрицата Х" и

X =

1 2 4 5 7 8 10 11

Ако е необходимо да се извършат поелементни действия с вектори и матрици (например умножение, деление или повдигане на степен), то съответният оператор се записва с точка отпред (например ./ вместо / ). Пример за поелементно умножение на числовите вектори X и Y e даден по долу. Резултатът е формирането на нов триелементен числов вектор Z.

Пример: X = [1 2 3]; Y = [4 5 6]; Z = X.*YдаваZ = 4 10 18

Основни функции за обработка на данни в MATLABАргументът на следващите функции може да бъде вектор (ред или стълб) или матрица (масив с данни). При втория случай оценките се изчисляват по стълбове. max - максимална стойност;min - минимална стойност;mean - средноаритметична стойност;std - средно квадратично отклонение;sort - сортировка на елементите по големина;sum - сума на елементите;prod - произведение на елементите;

Пример:X = [1 -0.5 2 5 -3 8];

disp(max(X)) 8

disp(min(X)) -3

Page 11: MATLA_how

disp(mean(X)) 2.0833

disp(std(X)) 3.9296

disp(sum(X)) 12.5000

Тук MATLAB-функцията disp (от англ. DISPlay) e използвана за извеждане на изчислителните резултати в командния прозорец. В края на този параграф ще отбележим, че две от най-често използваните MATLAB-функции за работа с вектори и матрици са: length - определя броя на елементите (дължината) на векторsize - определя размерността (броя на редовете и стълбовете) на матрицаНапример, ако

X = [1 2 3 4 5]

то

disp(length(X)) 5и

disp(size(X)) 1 5

т.е. Х е петелементен вектор с размерност 1х5. Функциите length и size са изключително полезни при дефиниране на нови вектори или матрици с размерността (респ. брой на елементите) на вече съществеващи такива. Например, ако Х е вектор, то записът

Y = ones(1,length(X))

дефинира нов вектор от единици, чиито брой е равен на броя на елементите на вектора Х. От друга страна записът

Y = ones(length(X))

дефинира матрица с размерност length(X) х length(X) !

4. Създаване на М-функцииMATLAB позволява два режима на работа: директен и програмен. При

Page 12: MATLA_how

първия режим на работа изчислителните изрази (програми) се въвеждат непосредствено в командния прозорец на MATLAB и резултата от изпълнението следва непосредствено. Това превръща MATLAB в извънредно мощен калкулатор, който извършва не само обикновените изчисления, но и операции с вектори, матрици и комплексни числа, както и визуализирането на дву- и тримерни графики.

Програмното решаване на задачи се заключава в последователно интерпретиране на команди (оператори) от езика на MATLAB. Тези команди предварително се оформят като текстови файлове в ASCII формат, известни като М-файлове поради специфичното си разширение .m и могат да се изпълняват многократно. М-функциите в MATLAB могат да бъдат скриптове (т.е. функции, които не приемат входни аргументи и не връщат изходни аргументи) или функции с един или повече входни и изходни аргументи. Предимство на М-функциите, които имат входни и изходни аргументи е, че могат да бъдат използвани в други (най-често по-сложни) М-функции.

За създаването на собствена М-функция от менюто File на командния прозорец на MATLAB избираме New->M-file. Празният прозорец, който се появява е редакторът на М-файлове на MATLAB. В този прозорез записваме следния код, който е елементарен пример за собствена М-функция, генерираща синусоида с определена амплитуда A, честота f и начална фаза theta е .

function s = f1(A, f, theta)

fs = 100*f; dt = 1/fs; t = 0:dt:5/f;s = A*sin(2*pi*f*t + theta);

Програми с един или повече входни и/или изходни аргументи задължително започват с ключовата дума function. В повечето версии на MATLAB тази ключова дума се изписва със син цвят, ако програмата се пише непосредствено в редактора на М-файлове на MATLAB.След това следва списък на изходните аргументи [y1, y2,..., yn] в квадратни скоби. При само един изходен аргумент (какъвто е разглеждания случай) скоби не са необходими. В нашия случай изходният аргумет s представлява изчислините стойности на синусоидата. Името на М-функцията е f1. То се избира от ползвателя и не трябва да съвпада с никоя вградена MATLAB команда (например sin). След името на М-функцията в обикновени скоби следва списъкът на входните аргументи (един или повече), отделени със запетаи. В разглеждания пример входни аргументи за нашата М-функция са амплитудата A, честота f и начална фаза theta. След този първи програмен ред следва самият изчислителен код.

За съхраняване на програмата от менюто File на редактора на М-файлове избираме Save As , при което в полето File name автоматично се появява името на програмата f1 и следва само да натиснем бутона Save (т.е. да потвърдим).

За стартирането на програмата следва в командния прозорец на MATLAB да се изпише нейното име и да се зададат конкретни стойности на входните аргументи. Например при

Page 13: MATLA_how

f1(2, 1000, pi/2)

ще се генерира синусоида с параметри A = 2 V, f = 1 kHz и theta = pi/2 rad. Без използването на входни и изходни аргументи тази М-функция може да се запише като скрипт-файл така.

clear; close all;A = 2;f = 1000;theta = pi/2;fs = 100*f; dt = 1/fs; t = 0:dt:5/f;s = A*sin(2*pi*f*t + theta);

Основната разликата се състой в липсата на служебната дума function, като и на списък от входни и изходни аргументи. Наличието на командите clear и close all в началото на скрипт-файловете не е задължително, но е целесъобразно. Командата clear изчиства всички променливи от паметта на MATLAB, а командата close all затваря всички графични прозарци.

За съхраняване на скрипт-файловете от менюто File на редактора на М-файлове отново избираме Save As , при което в полето File name ползвателя следва да запише име на програмата (например f1) и следва да потвърди с бутона Save. Стартирането на скрипт-файловете може да се извърши след написване на името на пограмата в командния прозарец и Enter или непосредствено от редактора на М-файлове, като от меню Debug се избере Run (това може да стане и с непосредсвеното натискане на клавиша F5 от клавиатурата).

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

набор от лесни за използване команди. Основните от тях са:dispinputmenukeyboardpauseКомандата disp осъществява извеждане в командния прозорец на MATLAB на стойностите на променлива или текст. Обръщането към нея има вида

disp(‘variable or text’)

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

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

Page 14: MATLA_how

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

x = [x1 x2 … xN];

Тогава извеждането на стойностите на няколко променливи на един ред ще има вида

disp( [x1 x2 … xN] );

Аналогично може да се обединят няколко текстови променливи. За обединяването на текст и числови променливи е целесъобразно да се използва функцията num2str. Записът

y = num2str(x);

преобразува числовата стойност на променливата x в текстови вид. Тогава, ако tx е някакъв текст, а x – числова променлива, извеждането им на един ред в командния прозорец може да осъществи при

disp( [ tx, num2str(x) ] );

Пример:x = 2.32;tx = 'The value of x is';disp([ tx, num2str(x) ])

дава

The value of x is 2.32

За въвеждане на информация в диалогов режим и осигуряване на възможност за избор на алтернативи може да се използва командата input. Форматът на тази команда има вида

x = input(‘Enter the value of x’);

В този случай изпълнението на програмата се прекратява до въвеждане на стойност на променливата x в командния прозорец на MATLAB от клавиатурата и натискане на бутона Enter.

Удобен инструмент за избор на алтернативи за последващи изчислителни процедури е функцията menu. Тя създава текущ прозорец меню на ползвателя. Функцията menu има формат

k = menu(‘ menu name’, ‘alternative 1’, … ‘alternative N’);

Page 15: MATLA_how

При използване на командата menu изпълнението на програмния код временно се прекратява до избор на една от валидните алтернативи. След избор на алтернатива на изходния параметър k се приписва номера на стойността на избраната алтернатива и изпълняването на програмата продължава.

Командата pause временно прекратява изпълняването на програмата докато ползвателя не натисне произволен бутон от клавиатурата. В случай, че след командата е записано някакво положително цяло число n (например pause(2) ) , то изпълняването на програмата се прекратява за n секунди.

В случай, че в текста на даден М-файл се среща командата keyboard, то изпълнението на програмата се прекратява и управлението се предава на клавиатурата. В този режим е възможно да се осъществяват произволни действия от клавиатурата, като проверка и редакция на данни. При това са достъпни всички команди и процедури в MATLAB. За завършване на работата в този режим е необходимо да се натисни Enter.

6. Изобразяване на двумерни графикиMATLAB предоставя богати възможности за изобразяване на двумерни и

тримерни графики. Тук ще бъдат разгледани само основните възможности на MATLAB, свързани с изобразяване на двумерни графики. Основните команди за настройка на произволна двумерна графика са:plotxlabelylabeltitlegridaxisstemsubplot

Най-често използваната команда за изчертаване на графики и изобразяване на резултати е plot. Тази команда има (основен) формат

plot(t, b)

и изчертава с непрекъсната линия стойностите на вектора t по оста x спрямо стойностите на вектора b по оста y. Опции за настройка на типа на линиите и цвета на графиката се получават при запис от вида plot(t,b, ‘option’). Видът на линиите може да бъде: ‘-’ непрекъсната (по подразбиране) , ‘:’ точки, ‘--' пунктирна линия, ‘-.’ редуващи се тирета и точки. Дискретните стойности на вектора b могат да се изобразят с множество символи, като: *, x, o, +. Следните символи дефинират някой основни цветове, използване за изобразяване на линиите: r – червен; b – син; g – зелен; k – черен; Например, plot(t,b, ‘-’) използва прекъсната линия за изчертаване, plot(t,b, ‘*’) използва само * за изчертаване на графиката, plot(t,b, ‘g’) използва непрекъсната (по подразбиране) зелена линия за изчертаване на графиката. Опциите за вида и цвета на графиката могат да се използват съвместно.

Page 16: MATLA_how

Например, plot(t,b, ‘g--') указва изчертаване на двумерна графика със зелена пунктирна линия.

Пример: % MATLAB код за изчертаване на синусоида с основна честота f = 50 Hzfs = 5000; dt = 1/fs; t = 0:dt:0.1; f = 50; s= sin(2*pi*f*t);plot(t, s, 'k') ,

0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

t

s

където fs е честотата на дискретизация (англ. sample frequency), dt е стъпката на времето, а t e векторът на времето с начална стойност 0 и крайна стойност 1. Следва да се отбележи необходимостта от удовлетворяване на условието fs>>f. За изчертаване на повече от една графика в една и съща координатна система следва да се използва запис от вида plot(t1, b1, t2, b2), при което се изчертават стойностите на b1 във функция на t1 и стойностите на b2 във функция на t2. За озаглавяване на координатните оси и графиката следва да се използват командите

xlabel('time (sec)'); ylabel('Step response'); title('My Plot'),

където в единични кавички са дадени примерни наименования на координатните оси и заглавието на графиката. По-добро онагледяване на графиката е възможно при използване на координатна решетка. Въвеждането и става непосредствено с командата grid. Често е целесъобразно указването на минималните и максималните стойности на координатните оси с цел по-добра визуализация на изобразявания графичен резултат (MATLAB прави това автоматично, но не винаги по най-добрия за нас начин). Това може да бъде направено от оператора след командата plot при използване на следния формат: axis([xmin xmax ymin ymax]), където xmin xmax ymin ymax са числа, указващи минималните и максималните стойности на координатните оси, които ще се изобразят.

За изобразяване на дискретни сигнали е целесъобразно използването на командата stem(t, s),

която изчертава изчислените дискрети на вектора s с празни кръгчета. Може да се използва формат на тази команда stem(t, s, 'filled'), при което кръгчетата ще бъдат

Page 17: MATLA_how

запълнени (оцветени).

Пример:% Изобразяване на графиката на намаляваща експонента.dt = 0.1; t = 0:dt:1;s = exp(-2*t);stem(t, s, 'k', 'filled')

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 10

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

t

s

За изобразяване на две и повече графики в различни подпрозорци на основния графичен прозорец следва да се използва командата subplot(mnp), която разделя основния графичен прозорец на решетка mхn подпрозорци, а p определя позицията на конкретния подпрозорец (графика), като с p=1 се означава най-горния ляв подпрозорец. Например, диаграма на Боде, която изобразява амлитудно-честотна и фазо-честотна характеристика (една под друга) в полулогартмичен мащаб (за изчертаване се използва командата semilogx) може да се изобрази при използване на запис от вида:

subplot(211),semilogx(w,magdb);subplot(212),semilogx(w,phase);

7. Програмиране в средата на MATLABОператорите за управление са необходими за организиране на изчислителни

процеси, които се записват във вид на програми (М-файлове) на език за програмиране от високо ниво. При това към операторите за управление на изчислителни процеси се отнасят оператори за безусловен преход, оператори за условен преход и оператори за организиране на цикли. Едно от предимствата на MATLAB е в това, че в MATLAB е възможно тези оператори да се използват и при работа на програмата в режим на “калкулатор”. Аритметичният оператор за цикъл има вида

for k = arraycommandsend

където k е брояч на цикъла, а array е вектор от стойности, който (обикновено) съдържа началната стойност на k, стъпката и крайното стойност на k. В разглежданият случай командите (commands) в цикъла се изпълняват многократно,

Page 18: MATLA_how

докато стойността на управляващата променлива k е в границите между началната и крайната стойност. За излизане от цикъла преди да се достигне крайната стойност на управляващата променлива (например при изпълняване на някакво условие) се използва оператора break. Ако в програмният код се срещне този оператор, изпълнението на цикъла се прекратява предсрочно и се изпълнява следващият след думата end оператор. Типичен пример за програмна конструкция от този вид има вида for k = array commands if logical condition break endend

Пример:% Сумиране на псевдослучайни числа с прекратяване на итерациите, ако сумата % достигне 1000. n = inf;x = 0;for i = 1:n x = x+rand; if x >= 1000 break endend

В MATLAB отсъства оператор за безусловен преход. Това е известен недостатък и затруднява връщането на изчислителния процес към произволен предишен или последващ оператор на програмата.

Всички оператори за цикъл и условен преход MATLAB започват със служебната дума for, if, while или switch и завършват със служебната дума end.

Операторите за цикъл могат да бъдат вложени (цикъл в цикъл). Като конкретен пример, нека разгледаме генерирането на матрицата A = sin(m)*cos(n), за m, n = 1:10. При използването на for-end конструкция програмният код би имал вида

A = zeros(10);for m=1:10 for n=1:10 A(m,n) = sin(m)*cos(n); endend

Използването на цикли следва да си използва само при невъзможност за реализиране на линеен изчислителен алгоритъм понеже значително увеличава

Page 19: MATLA_how

изчислителното време. Горният резултат в MATLAB може да се постигне лесно с използване на линейна процедура:

k = 1:10; A = sin(k)*cos(k) ';

Разгледаната линейна процедура за генериране на матрицата А се нарича векторизиране и следва да се използва винаги, когато това е възможно.

Друга често срещана програмна конструкция е използването на оператор за цикъл с предусловие. Основният вид на тази конструкция има вида

while expressioncommands end

където expression е някакво условие, реализирано (най-често) при използване на оператори за сравнение (== , >=, ~= и др.) и логически оператори (и / или / не). Командите в цикъла се изпълняват само в случай, че е изпълнено условието след думата while. При това сред операторите вътре в цикъла следва да има такива, които изменят стойностите на една от променливите, указани в условието на цикъла. Пример:k =1;while k<= 10mlog = 10*log10(k);disp([k, mlog])k = k +1;end

Програмни конструкции от вида while-end се използват най-често тогава, когато предварително не е известен необходимият брой итерации в изчислителния алгоритъм.

Пример: % Последователно делене на pi/2 докато частното е по-голямо от 0.01.q = pi;while q > 0.01q = q/2;end

При реализирането на нелинейни изчислителни алгоритми в MATLAB е предвидена възможност за реализиране на условен преход с помощта на т.нар. if-end конструкция. В най-простият случай тази конструкция има вида

if expression commands

Page 20: MATLA_how

end

Тази програмна конструкция осъществява условен преход, като проверява за изпълняване на поставеното в expression условие и само в този случай се изпълняват командите (изразите) в commands. При неизпълнение на зададеното условие се изпълняват операторите след end.Усложнен вариант на тази конструкция има вида

if expression1commands1 ( if expression 1 is true)elseif expression 2commands2 ( if expression 2 is true)elseif expression 3commands3 ( if expression 3 is true)..elsecommands ( if all previous expressions evaluate to false)endТук последователно се проверяват условията в expression1, expression2 и т.н. Изпълняват се само командите commands след първото условие, което се удовлетвори. Ако не се удовлетворява нито едно условие след операторите elseif, обработват се командите след оператора else.

Пример: x = rand; if (x < 0.25) disp('0<x<0.25'); elseif (x < 0.5) disp('0.25<x<0.5'); elseif (x < 0.75 disp('0.5<x<0.75'); else disp('0.75<x<1'); end

Последната програмна конструкция която ще бъде разгледана е т. нар. switch-case конструкция. Тя има вида

switch expression case value1 (executes if expression evaluates to value1)commandscase value2 (executes if expression evaluates to value2)commands..

Page 21: MATLA_how

.otherwisecommandsend

При тази конструкция се осъществява разклоняване на изчислителния алгоритъм в зависимост от стойността на някаква променлива или израз, като се сравняват получените стойности в резултат на изчисление след думата switch със стойности, указани след думата case. Съответната група оператори след case се изпълнява, ако стойностите на израза (expression) съвпадат с указаните след case. Ако стойностите на израза не съвпадат с нито една от стойностите в групите case се изпълняват командите след otherwise. В следващият пример се генерира цяло число от множеството {1, 2, ... , 10} и се присвоява на променливата x. Ако x=1 или x=2 на командния прозорец на MATLAB ще се изобрази Probability = 20%. В случай, че x=3, 4 или 5 - Probability = 30% , а във всички останали случаи - Probability = 50%.

x = ceil(10*rand); switch x case {1,2} disp('Probability = 20%'); case {3,4,5} disp('Probability = 30%'); otherwise disp('Probability = 50%');end

8. Основни MATLAB функции за моделиране на цифрови комуникационни системи

Функцията rand генерира равномерно разпределени случайни числа. rand(M,N) е MхN матрица от равномерно разпределени случайни числа в интервала (0.0, 1.0). rand(M,N,P,...) генерира многомерен масив с равномерно разпределени случайни числа.

rand без дефиниране на аргументи е скалар, чиято стойност се изменя всеки път, когато функцията се използва.

Функцията randn генерира нормално разпределени случайни числа.

Page 22: MATLA_how

randn(M,N) генерира MхN матрица от нормално разпределени случайни числа с нулева средна стойност и дисперсия единица. randn(M,N,P,...) генерира многомерен масив от нормално разпределени случайни числа. randn без дефиниране на аргументи е скалар, чиято стойност се изменя всеки път, когато функцията се използва.

Функцията randint генерира матрица от равномерно разпределени случайни числа.

OUT = randint генерира "0" или "1" с равна вероятност. OUT = randint(M) генерира MхM матрица от случайни двоични числа. "0" и "1" се срещат с равна вероятност. OUT = randint(M,N) генерира MхN матрица от случайни двоични числа. OUT = randint(M,N,RANGE) генерира MхN матрица от случайни числа. RANGE може да бъде скалар или двуелементен вектор. Ако RANGE е скалар, тогава изменението на изходните числа е в обхвата [0, RANGE-1].

Функцията randsrc генерира матрица от случайни числа с използване на определена азбука. OUT = randsrc генерира "-1" или "1" с еднаква вероятност. OUT = randsrc(M,N) генерира MхN матрица от случайни биполярни числа. "-1" и "1" се срещат с еднаква вероятност.

OUT = randsrc(M,N,ALPHABET) генерира MхN матрица от случайни числа с указване на азбука в ALPHABET. Азбуката може да бъде вектор-ред с възможните елементи, който randsrc може да генерира или матрица с два реда.

OUT = randsrc(M,N,ALPHABET,STATE) установява генератора на равномерно разпределени числа в състояние STATE.

Функцията awgn добавя адитивен бял Гаусов шум. Основният формат има вида Y = awgn(X,SNR,'measured', 1234,'dB')

където X е входният сигнал, към който се добавя шум, SNR е отношението сигнал/шум в децибели, а генераторът на псевдослучайни числа randn е установен в състояние 1234.

Page 23: MATLA_how

Функцията modmap преобразува цифров в аналогов сигнал. modmap(METHOD...) изчертава сигнално множество от определен тип, указан в METHOD. Y = modmap(X, Fd, Fs, ‘METHOD’...) преобразува цифровия сигнал X в аналогов сигнал Y.

Валидни методи за преобразуване/модулация са ask - M-позиционна амплитудна модулация. рsk - M-позиционна фазова модулация. qask - M-нивова квадратурна амплитудна модулация. fsk - M-позиционна честотна модулация. msk - честотна модулация с минимална девиация.

Функцията dmodce генерира сигнал с цифрова модулация. Основният формат на функцията има вида

Y = dmodce(X, Fd, Fs, ‘METHOD’)

и преобразува “информационния” сигнал Х в комплексна обвиваща на цифровия модулиран сигнал Y. Честотата на следване на цифровия сигнал на съобщението X е Fd (Hz), а честотата на Y е Fs (Hz), където Fs/Fd е цяло положително число. METHOD е стринг и дефинира един от валидните методи за цифрова модулация, посочени при описването на функцията MODMAP.

Функцията ddmodce осъществява цифрова демодулация. Тази функция има синтаксис Z = ddmodce(Y, Fd, Fs, ‘METHOD’...),

който е аналогичен на функцията dmodce.

Функцията eyediagram генерира око-диаграма. eyediagram(X, N) генерира око-диаграма на сигнала X при използване на N отчета. N трябва да бъде цяла положително число, по-голямо от 1. X може да бъде реален или комплексен вектор, или матрица с две колони, където реалният сигнал е разположен в първата колона, а имагинерният – в следващата колона. Ако X е реален вектор, функцията eyediagram генерира единствена око-диграма. Ако X е двуколонна матрица или комплексен вектор, eyediagram генерира две око-диаграми- една за реалния сигнал и една за имагинерния сигнал. eyediagram(X, N, PERIOD) генерира око-диаграма на X със специфициран период PERIOD. Този параметър се използва за определяне на ограничението на

Page 24: MATLA_how

хоризонталната ос. PERIOD трябва да бъде положително число. По подразбиране PERIOD =1. Хоризонталната ос се ограничава от -PERIOD/2 до +PERIOD/2. eyediagram(X, N, PERIOD, OFFSET) генерира око-диаграма с въвеждане на изместване. Параметърът OFFSET определя кои точки от око-диаграмата са центрирани по хоризонталната ос като се започне с първа точка (OFFSET+1) и се продължи с всяка N-та точка. OFFSET трябва да бъде неотрицателно число в интервала 0 <= OFFSET < N. По подразбиране OFFSET = 0. eyediagram(X, N, PERIOD, OFFSET, PLOTSTRING) генерира око-диаграма, за която типът на линиите, изчертаваните символи и цветовете са определят от PLOTSTRING. PLOTSTRING може да бъде всеки стринг, използван от функцията plot. По подразбиране PLOTSTRING = 'b-'.

Функцията scatterplot генерира векторна диаграма. scatterplot(X) генерира векторна диаграма на X. X може да бъде реален или комплексен вектор, или матрица с две колони, където реалният сигнал е разположен в първата колона, а имагинерният – в следващата колона.

scatterplot(X, N) генерира векторна диаграма на X с използване на коефициент на децимация N. В този случай се изчертава всяка N-та точна на X, като се започва от първата стойност. По подразбиране N=1. scatterplot(X, N, OFFSET) генерира векторна диаграма на X с въвеждане на изместване. OFFSET е броят на отчетите които се изпускат в момента на започване на X преди изчертаването на векторната диаграма. По подразбиране OFFSET = 0. scatterplot(X, N, OFFSET, PLOTSTRING) генерира векторна диаграма, за която типът на линиите, изчертаваните символи и цветовете са определят от PLOTSTRING. PLOTSTRING може да бъде всеки стринг, използван от функцията PLOT. По подразбиране PLOTSTRING = 'b-'.

animatescattereye – анимация на око-диаграма и векторна диаграма.

Форматът на тази функция има вида

animatescattereye(X, N, PAUSETIME, NUMSHIFTS, ACTION, SEPARATION)

и осъществява синхронизирано анимиране на око-диаграма и векторна диаграма, като изчертава двете диаграми след завършване на анимацията. Аргументи на функцията са: X – реален или комплексен сигнал с приложена филтрация, модулация и възможно добавяне на шум. N – коефициент на децимация за векторната диаграма и период на око-диаграмата.

Page 25: MATLA_how

Обикновено се задава равен на коефициента на свръхдискретизация (броя на отчетите за сигнален символ). PAUSETIME – времето между стъпките на анимацията. NUMSHIFTS – броят на изпълняваните стъпки в анимацията. ACTION – определя вида на анимацията. Един от стринговете 'lin' или 'lr'. SEPARATION – определя разделянето на точките във векторната диаграма.

Функцията rcosine проектира филтър от тип “повдигнат косинус”. NUM = rcosine(Fd, Fs) проектира филтър от тип “повдигнат косинус” с крайна импулсна характеристика и цифрова предавателна честота Fd. Честотата на дискретизиране на филтъра е Fs. Fs/Fd трябва да бъде положително цяла число. По подразбиране т.нар. “фактор на спад на характеристиката на филтъра” е 0.5, а закъснението на филтъра е 3/Fd секунди. [NUM, DEN] = rcosine(Fd, Fs, TYPE_FLAG) позволява специфичен дизайн на филтъра. TYPE_FLAG е стринг и може да бъде can be 'default', 'normal', 'fir' , 'iir', 'sqrt' или комбинация, като 'iir/sqrt'. Редът на следване на аргументите е без значение. [NUM, DEN] = rcosine(Fd, Fs, TYPE_FLAG, R) определя коефициента на спад на характеристиката на филтъра R, който може да бъде произволно цяло число в интервала [0, 1]. [NUM, DEN] = rcosine(Fd, Fs, TYPE_FLAG, R, DELAY) определя закъснението на филтъра DELAY, което трябва да бъде цяло положително число. DELAY/Fd е закъснението на филтъра в секунди.

Функцията rcosflt филтрира входния сигнал с използване на филтър от тип “повдигнат косинус”.

Y = rcosflt(X, Fd, Fs, TYPE_FLAG, R, DELAY) филтрира входния сигнал X с използване на филтър с крайна импулсна характеристика. Честотата на дискретизиране на входния сигнал X е Fd (Hz). Честота на изходният сигнала Y е Fs (Hz). Fs/Fd трябва да бъде цяло положително число. TYPE_FLAG задава специфични опции при проектиране на филтъра. R определя фактора на спад на характеристиката на филтъра, който може да бъде произволно цяло число в интервала [0, 1]. Например R = .5 означава, че лентата на филтъра е 1.5 пъти по-голяма от входната честота Fd. Понеже R е нормализиран към входната честота Fd, то този параметър е безразмерен с типични стойности между 0.2 и 0.5. DELAY определя груповото закъснение на филтъра. При линейни филтри, груповото закъснение е също закъснението между входния сигнал и пиковата реакция на

Page 26: MATLA_how

филтъра. DELAY също така определя дължината на импулсната реакция на филтъра. Това закъснение е Fs/Fd * (2 * DELAY + 1). Изходният сигнал Y е свръхдискретизирано и филтрирано копие на входния сигнал X. Дължината на изходният вектор Y е Fs/Fd * (length(X) + 2*DELAY).