Програмен език MATLAB

1 Основни сведения за MATLAB
1.1 Въведение
MATLAB е диалогова програмна система за научно-технически пресмятания и визуализиране на резултатите от тях. Тя интегрира в себе си възможности за аналитични преобразувания, числени пресмятания и графично представяне на получените резултати. Ориентирана е към работа с масиви от данни - вектори, матрици, многомерни масиви, масиви от клетки и масиви от записи. Оттук идва и наименованието MATLAB - MATrix LABoratory (матрична лаборатория). Системата позволява с един-единствен оператор да се извършват едновременно действия над всички елементи на масива, без да е необходимо да се организират цикли, както е при обикновените "скаларни" езици от типа на C и FORTRAN.
В системата MATLAB са вградени функции за решаване на основни задачи от линейната алгебра и числения анализ, за обработка на експериментални данни, за двумерна и тримерна графика, за анимация и др. Ядрото на системата непрекъснато се допълва с пакети приложни програми, наречени инструменти (toolboxes), решаващи проблеми в определени области на науката и техниката. В момента в MATLAB R2010a те наброяват около 80. Тук са изброени наименованията и предназначението на някои от най - често използваните сред тях:*Simulink - блочно моделиране на динамични системи;
*Symbolic - символни преобразувания;
*Optimization - оптимизация;
*Spline - сплайн-апроксимация;
*Statistics - статистически изчисления;
*Fuzzi Logic - размити множества;
*Partial Differential Equations - частни диференциални уравнения;
*Control System - автоматично управление;
*Nonlinear Control Design - нелинейни системи за управление;
*Robust Control - робастно управление;
*System Identification - идентификация на системи;
*Signal Processing - обработка на сигнали.
MATLAB има вграден програмен език от високо ниво, което позволява работа на системата не само в ''режим на калкулатор'', но и в ''програмен режим''. Това дава възможност на всеки потребител да създава свои собствени програми и функции, решаващи определени задачи от областта на научните му интереси. Веднъж написани, тези програми се изпълняват по същия начин, както и останалите функции на системата. С други думи, вие имате възможност да създавате свои собствени програмни инструменти.
MATLAB не изостава и в съвременната тенденция за интегриране на едни програмни системи с други, широко приложими и мощни програмни средства в дадена област. От работната среда на MATLAB вие можете да изпълнявате функции и оператори от ядрото на MAPLE, водеща сред системите за компютърна алгебра. Програмният инструмент Notebook, чрез който се осъществява интеграцията на MATLAB с MS Word, ви дава възможност, работейки с Word, да създавате документи, които съдържат едновременно обикновен текст, команди на MATLAB и резултатите от тяхното изпълнение - изрази, формули и графики.
Благодарение на практически неограничените възможности на системата, нейната гъвкавост и удобната за работа операционна среда, MATLAB е мощно средство за изчисления, анализи и оптимизация в различни области.
1.2 Графичен интерфейс на MATLAB
Графичният интерфейс на MATLAB 7 се състои от 4 основни прозореца.
1.2.1 Команден прозорец - Command Window
Това е основният прозорец, в който въвеждаме командите вдясно от промпта ">>" и получаваме числените резултати, след като натиснем клавиша Enter. Графичните резултати се извеждат в отделен прозорец. При въвеждане на командите са в сила следните правила:#Ако командата завършва със символа ";", резултатът от нейното изпълнение не се извежда. Това се използва, за да се подтисне извеждането на междинни резултати и на много дълги масиви от данни.
#Ако командата не завършва със символа ";", съответно резултатът се извежда.
#Наличието или липсата на символа ";" в края на графични команди не оказва никакво влияние върху резултатите от изпълнението им.
#Прекалено дългите команди могат да се пренасят на нов ред с помощта на многоточие "...", разположено в мястото на пренасяне.
#Ако се пресмята даден израз, без резултатът да се присвоява на някаква променлива, той автоматично се присвоява на системната променлива "ans" (от answer - отговор).
#Въведените в дадена работна сесия команди се запомнят от системата. Те могат да бъдат извикани от командния ред с помощта на клавиша ↑ и да бъдат коригирани и изпълнявани с натискане на Enter. Така се пести време и усилия при последователно въвеждане на сложни изрази, които се различават незначително един от друг.
#Няколко команди могат да се въведат на един ред. При това за разделител се използва или запетая "," (не се подтиска извеждането на резултатите), или точка и запетая ";" - символ който подтиска извеждането на резултата от предишната команда.
#Символът процент "%" се използва за начало на коментар.
По-долу е представен един примерен сеанс на работа с MATLAB в диалагов режим, записан във файл с командата diary.
<code>
>> A = [2 5 3
7 4 8
4 2 7]
A =
2 5 3
7 4 8
4 2 7
>> b = [1 3 5];
>> x = A\b
??? Error using ==> \
Matrix dimensions must agree.
>> x = A\b' % транспониране на вектора b!
x =
-0.9701
-0.2090
1.3284
>> A*x % проверка на резултата
ans =
1.0000
3.0000
5.0000
>> clear % изчистване на работното пространство
>> A
??? Undefined function or variable 'A'.
>> x = -pi:pi/100:pi; % задаване на вектор
>> x(1)
ans =
-3.1416
>> x(100), x(201)
ans =
-0.0314
ans =
3.1416
>> x(202)
??? Index exceeds matrix dimensions.
</code>
Обърнете внимание на съобщенията за грешки, които често ще срещате в началото, когато все още се учите да работите с MATLAB:* Съобщението<code>??? Error ...
Matrix dimensions must agree.</code>
ще получавате често, когато оперирате с вектори и матрици и нарушавате изискванията към размерностите на отделните операнди. В случая командата >> x = A\b с помощта на която решаваме системата линейни алгебрични уравнения ''Ax = b'', е грешна, защото векторът на десните части b трябва да е вектор-стълб, а ние сме го задали като вектор-ред. Грешката лесно се отстранява, като извикаме с клавиша &uarr; старата команда и транспонираме вектора b с добавянето на единичен апостроф.* Съобщението<code>
??? Undefined function or variable 'A'.
</code>
се извежда, когато използвате променлива, която не е била дефинирана. Най-често до тази ситуация се стига, когато сгрешите името на дадена, дефинирана преди това променлива, която системата естествено приема за нова, и следователно недефинирана. Помнете, че системата е case sensitive, т. е. чувствителна към изписването на имената на променливите с малки или с главни букви.* Съобщението<code>
??? Index exceeds matrix dimensions.
</code> се получава, когато при обръщение към елемент от масив някой от индексите надхвърли съответния размер на масива.
1.2.2 Работно пространство - Workspace
Всички променливи, които сте дефинирали през текущата сесия, се съхраняват в т. нар. ''работно пространство'' (Workspace). В прозореца Workspace се извежда пълна информация за тези променливи: име, размерност, големина и клас. Обърнете внимание, че дори и скаларните величини в MATLAB се разглеждат като матрици с размерност 1х1. Вие можете да изтриете някои от променливите или да коригирате стойностите на отделни елементи от масивите, като извикате Array Editor (редактор на масиви) с двойно щракване върху името на масива.
Цялото работно пространство може да бъде записано във файл с разширение .mat, като се избере командата Save Workspace As... от менюто File. Така съхранените данни могат да се използват в следваща сесия, като се зареди .mat файла с командата File&rarr;Import Data.
Получаването на информация за работното пространство, както и коригирането и съхраняването на данните във файл може да става и от командния прозорец. Затова най - добре ще направите, ако държите прозореца Workspace затворен, за да освободите повече място за Command Window.
1.2.3 История на командите - Command History
Системата MATLAB запомня всички въведени команди не само от текущата сесия, но и от предишни сесии. Тези команди се извеждат в прозореца Command History. Върху тях можем да извършим следните операции:*При двойно щракване върху дадена команда тя веднага се копира и изпълнява в командния прозорец.
*С помощта на мишката можем да направим копие на дадена команда или няколко маркирани команди в командния прозорец, като ги "завлечем" (Drag&Drop) до промпта ">>". За изпълнението им трябва допълнително да натиснем клавиша Enter.
*Ако щракнем с десен бутон на мишката върху маркирана последователност от команди, се появява контекстно меню, от което можем да изберем едно от следните действия:: Copy - копира в Clipboard.
:Evaluate Selection - копира избраните команди в командния прозорец и ги изпълнява.:Create M-file - отваря с редактора medit на MATLAB нов m-файл, в който автоматично се вграждат избраните команди. Това е много рационален начин за създаване на програми след успешно направени пресмятания в диалогов режим. Достатъчно е да се направят някои корекции, да се вмъкнат оператори за въвеждане на данни и отпечатване на резултатите и програмата е готова. Остава да се съхрани на твърдия диск с командата File&rarr;Save As.: Delete Selection - изтрива маркираните команди.: Delete to Selection - изтрива всички команди преди първата маркирана команда.: Delete Entire History - изтрива всички команди, включително и немаркираните.
1.2.4 Текуща директория - Current Directory
В този прозорец се извежда списък на всички файлове от текущата директория, до която системата има директен достъп, дори и ако не е обявена за достъпна с командата path. Обикновено в текущата директория се записват и създадените от вас файлове. При стартиране на MATLAB текуща директория по подразбиране е work, създадена автоматично от системата при нейното инсталиране.
По всяко време на работната сесия можете да смените текущата директория. Тази операция може да бъде извършена и от командния прозорец. По важните команди в него са:: Open - отваряне на файла с редактора medit на MATLAB;: Run - изпълнение на скриптов файл (файл, съдържащ команди на MATLAB);: View Help - извеждане на помощна информация, разположена до първия празен ред или до първата команда в .m-файла;: Rename - преименуване на файла;: Delete - изтриване на файла;: Add to path - добавяне на текущата директория към списъка на достъпните за системата директории.
От беглото описание на допълнителните четири прозореца става ясно, че рядко ще имате нужда от всичките едновременно. Вие сами може да конфигурирате работното си място, като изберете от менюто View кои прозорци да се извеждат. За препоръчване е да държите отворени прозорците: Command Window, Command History и Current Directory.
Системата позволява създаването на нови директории в произволно място на твърдия диск, в които да разполагате своите програмни файлове. За да можете да ги изпълнявате по всяко време, независимо от това, коя е текущата директория, трябва да ги добавите към списъка на достъпните. За целта изберете от основното меню командата File &rarr; Set Path. Появява се панелът Set Path. В него с помощта на бутоните може да се извърши следното:: Add Folder - добавяне на дадена директория към MATLAB search path - пътя за достъп на MATLAB;: Add with Subfolders - добавяне на дадена директория с всичките и&#768; поддиректории;
Една маркирана директория може да преместите, както следва:: Move to - в началото на списъка;: Move Up - една стъпка нагоре;: Move down - една стъпка надолу;: Move to Bottom - в края на списъка;: Remove - премахване на директорията от списъка.
След като завършите корекциите, натиснете бутона Save, ако искате те да останат в сила и за следващите сесии. Ако затворите панела без да натиснете Save, настройките остават в сила само за текущата сесия!Забележка: Неподходяща последователност на директориите в списъка Path може да породи неочаквана ситуация, когато една изпитана ваша програма или функция на някой Toolbox изведнъж престава да работи нормално. Причината за това може да е следната: вашите програми, както и функциите на програмните интрументи, се съхраняват в така наречените m-файлове. При подаване на дадена команда, която съдържа името на m-файл, системата го търси най-напред в текущата директория, а след това претърсва достъпните директории в последователност, съответстваща на реда им в Path-списъка. Поради големия брой m-файлове съществува реална възможност за дублиране на имена и системата може да открие най-напред файла, който не сте имали предвид. При такава ситуация се опитайте да направите подходящо разместване в списъка на достъпните директории или да промените името на вашия файл и на функцията, която се съхранява в него.
1.3 Системни команди. Help. Demo
Почти всички операции, извършвани с помощта на менютата и бутоните на прозорците в графичния интерфейс, могат да бъдат извършвани и чрез подаване на команди в командния прозорец. Повечето от тези команди съществуваха и в старите версии, където при сравнително примитивния тогавашен интерфейс бяха единствената възможност за извършване на съответните действия. Това обаче не означава, че те са някакъв архаизъм, който би трябвало да отпадне в близко бъдеще. Тези команди могат да бъдат използвани не само за работа в диалогов режим, но и да бъдат вграждани в програми. Ето защо те се оказват незаменими при програмно решаване на сложни задачи.
1.3.1 Системни команди
1.3.1.1 Синтаксис на командите
Въвеждането на команди в MATLAB може да става в два различни форма&#768;та::''Функционален формат'' (FUNCTION format): В този формат командата се състои от името на функцията, следвано от един или повече ''входни аргументи'', заградени в кръгли скоби и разделени помежду си с запетаи:: function_name(arg1, arg2, ..., argN)
: Резултатът от изпълнението на функцията може да се присвои на няколко променливи, наречени ''изходни аргументи'', които се заграждат в квадратни скоби и са разделени помежду си със запетаи:: [out1, out2, ...] = function_name (arg1, arg2, ...):''Команден формат'' (COMMAND format): В този формат командата се състои от името на функцията, следвано от един или повече входни аргументи, разделени помежду си с интервали:: function_name arg1 arg2 ... argN
За разлика от функционалния формат тук резултатът от изпълнението на функцията не може да се присвоява на името на някаква променлива. С други думи, в командния формат няма изходни аргументи.:Забележки::* Двата форма&#768;та се различават и по начина на подаване на входните аргументи. Във функционален формат се подават техните стойности (passing by value), докато в командния формат входните аргументи се третират като низове (последователности от символи).
:Ще поясним тази забележка със следния пример:
<code>
>> A = pi;
>> disp (A) % Function format
3.1416
>> disp A % Command format
A
</code>:* Във функционалния формат подаването на низ като входен аргумент може да стане по два начина:
:** Директно подаване на низа, заграден в единични апострофи.
:** Предварително присвояване на низа, заграден в апострофи, на името на някаква променлива. След това тази променлива се подава на функцията като входен аргумент, но без да се загражда в апострофи!
Пример: : Създаване на поддиректория "dinamika" в текущата директория::>> mkdir ('dinamika')
:>> dirname = 'dinamika';
:mkdir(dirname)
:* Повечето функции в MATLAB могат да работят с различен брой входни и изходни аргументи. Една част от тях са задължителни, а останалите - не (optional arguments). В зависимост от броя и типа на подаваните аргументи една и съща функция може да извършва различни действия.:При необходимост, допълнителна информация можете да получите с помощта на командите help или helpwin.
Системните команди, които са разгледани тук, можем да разделим условно на следните групи::*команди за управление на работното пространство;
:*команди за работа с файлове;
:*команди за настройване пътя за достъп;
:*команди за управление на командния прозорец;
:*команди на операционната система;
1.3.1.2 Команди за управление на работното пространство
>> workspace - отваря браузъра на Workspace, с помощта на който могат да се разглеждат, редактират, запазват или изтриват променливите от работното пространство.
>> who - дава информация за променливите от работното пространство::>> who - списък на променливите от работното пространство;:>> whos - като горното, но с допълнителна информация за всяка променлива;:>> who -file ''filename'' - списък на променливите във файла с данни filename.mat;:>> s = who - зарежда в масива от клетки s имената на всички променливи от работното пространство.
>> clear - изтриване на променливи от работното пространство::>> clear - изтрива всички променливи от работното пространство;
:>> clear global - изтрива всички глобални променливи;
:>> clear var1 var2 ... - изтрива само указаните променливи.
>> pack - дефрагментиране на работното пространство:
Командата pack записва всички променливи от работното пространство в текущата директория, изчиства паметта и след това ги презарежда. Препоръчва се това да се прави в специална за целта директория в следната последователност на командите:
<code>
>> cwd = pwd % запис на текущата директория;
>> cd(tempdir) % преминаване в директорията tempdir (името е произволно), в която ще се
% записват временно променливите от работното пространство;
>> pack % извършване на самото дефрагментиране;
>> cd(cwd) % връщане в предишната директория.
</code>
>> save - запис на променливите от работното пространство в двоичен файл с разширение .mat::>> save - запис на всички променливи от работното пространство във файл matlab.mat;
:>> save ''filename'' - запис на всички променливи във файл filename.mat;
:>> save ''filename'' x y z - запис само на променливите x, y, z;
:>> save ... -ASCII - записва данните в ASCII (текстов) формат;
:>> save ... -ASCII -double - запис в ASCII формат с 15 цифри;
:>> save ... -append - добавяне на данните към съществуващ mat-файл.
>> load - зареждане на променливи в работното пространство от файл;
:>> load - зарежда всичките променливи от файла matlab.mat;
:>> load ''filename'' - зарежда всички променливи от файла filename.mat;
:>> load ''filename'' x y z - зарежда само променливите x, y, z.
>> quit - приключване на текущата сесия (излизане от MATLAB).
1.3.1.3 Команди за работа с файлове
>> what - извежда списък само на тези файлове от дадена директория, които имат специфични за MATLAB разширения. Файловете с други разширения не се извеждат. Използвайте командата dir за извеждане на всичките файлове.
:>> what - списък на специфичните за MATLAB файлове от текущата директория;
:>> what ''dirname'' - като последната команда, но за явно указаната директория dirname; не е необходимо да се указва пълния път, а само името на директорията;
:>> w = what (' ''dirname'' ') - записва резултата от командата what в масива от записи w със следните полета:
:*path - пътя до директорията (пълния адрес);
:*m - масив от клетки с имената на m - файловете;
:*mat - масив от клетки с имената на mat-файловете;
:*mex - масив от клетки с имената на mex-файловете;
:*mdl - масив от клетки с имената на mdl-файловете;
:*p - масив от клетки с имената на p-файловете;
:*classes - масив от клетки с имената на класовете.
>> which - извежда пълния адрес (path) на даден файл:
:>> which ''filename'' - извежда пълния адрес на файла filename.m;
:>> which ''filename.ext'' - извежда пълния адрес на файла, чието име е filename.ext;
Забележка: Ако файлът е с разширение, различно от .m, то трябва непременно да се укаже.
:>> s = which (' ''filename'' ') - адресът се записва като стринг в променливата s, вместо да се извежда на екрана.
>> lookfor - претърсване на всички m-файлове по ключова дума:
:>> lookfor keyword - търси ключовата дума keyword в първия ред с коментари на всички m-файлове, до които системата има достъп. Извежда първия ред на всички файлове, в които е открита ключовата дума;
:>> lookfor keyword -all - търсенето на ключовата дума е в целия първи блок от коментари (до първата MATLAB команда или до първия празен ред) на m-файловете.
Поради сходството на последните три описани оператора, ще дадем в резюме тяхното действие::>> what - списък на m-файловете в определена директория;:>> which - търси директория, съдържаща даден файл;:>> lookfor - намира файлове по дадена ключова дума.
>> exist - проверява дали е дефинирана дадена (exist - съществува) променлива, функция, файл или директория::>> exist ('A') връща::0 - ако А не съществува (0 в MATLAB представлява логическата константа "false");
:1 - ако А е променлива от работното пространство;
:2 - ако А е m-файл от MATLAB Search Path;
:3 - ако А е mex-файл от MATLAB Search Path;
:4 - ако А е mdl-файл от MATLAB Search Path;
:5 - ако А е вградена MATLAB функция;
:6 - ако А е p-файл от MATLAB Search Path;
:7 - ако А е директория.
:>> exist ('A', 'var') - проверява само за променливи;
:>> exist ('A', 'file') - проверява само за файлове и директории;
:>> exist ('A', 'dir') - проверява само за директории.
>> edit - редактиране на m-файл:
:>> edit - стартира редактора в нов прозорец;
:>> edit ''filename'' - отваря файла filename.m;
:>> edit ''filename.ext'' - отваря текстов файл с разширение .ext.
Забележка. По подразбиране се използва вграденият редактор medit на MATLAB. При желание можете да използвате любимия си текстов (ASCII) редактор, например Notepad, като изберете File &rarr; Preferences... &rarr; Editor/Debugger, изберете с щракване в празното кръгче опцията Text Editor и въведете в съответното поле пълния адрес на желания редактор. Можете, вместо да въвеждате адреса, да използвате браузера, като щракнете бутона вдясно от полето.
>> type - извежда съдържанието на даден файл в командния прозорец:
:>> type ''filename'' - извежда файла filename.m;
:>> type ''filename.ext'' - извежда указания ASCII файл.
>> dbtype - номерира редовете на извеждания файл:
:>> dbtype ''filename'' - извежда целия файл;
:>> dbtype ''filename m:n'' - извежда само редове с номера от m до n.
>> open - отваря масив или файл в съответствие с разширението му:
open ''objectname'' .
В зависимост от типа на обекта с име objectname се извършват следните действия:Тип на обекта, Действие
масив, отваря го в редактора Array Editor;
.mat файл, отваря файла и зарежда променливите в работното пространство като масив от записи; полетата на този масив съответстват на имената на променливите!;
.fig файл, отваря фигурата;
.m файл, отваря файла в редактора на MATLAB;
.html файл, отваря файла в Help Browser.
:Забележка: Ако обектът е файл с разширение, различно от .m, то трябва непременно да се укаже явно!
>>pcode - създава псевдокод (p-code) на даден m-файл::>>pcode ''filename'' - създава р-код на файла filename.m, разположен в текущата директория или в някоя от достъпните директории. Новият файл има разширение .p и се разполага в текущата директория;
:>>pcode ''fname1 fname2....'' - създава р-кодове на указаните m-файлове;
:>>pcode ''*.m'' - създава р-кодове на всички m-файлове от текущата директория;
:>>pcode ''dirname/*.m'' - създава р-кодове на всички m-файлове от указаната директория dirname;
:>>pcode ''...-inplace'' - създава р-кодовете в същите директории, в които са и съответните m-файлове!:Забележки::# р-кодовете се изпълняват сравнително по - бързо от съответните m-файлове;
:# Ако в една директория са разположени m-файлове и техните р-кодове, при включване на името на един от файловете (без разширението) в дадена команда, системата изпълнява съответния р-код!
:# Ако m-файлът и съответният р-код са в различни директории, системата изпълнява този от тях, който е в текущата директория или в директорията, която предхожда другата в списъка на достъпните директории.
:# Използвайте р-код и когато желаете да скриете оригиналния (source) код на вашите програми от чужди лица.
1.3.1.4 Команди за настройване на пътя за достъп
>>path - извеждане и настройка на списъка на достъпните директории - MATLAB Search Path:
:>>path - извежда списъка на достъпните директории;
:>>path (path, '' 'newdir' '' ) - добавя нова директория в края на текущия списък;
:>>path ('' 'newdir' '', path) - добавя нова директория в началото на текущия списък.:Пример::>>path(C:\MATLAB\R2010a\Dinp_2003', path) - добавя в началото на текущия списък директорията Dinp_2003.
>>addpath - добавя нови директории към текущия Search Path:
:>>addpath ''dir1 dir2 ...'' - добавя указаните директории в началото на текущия списък;
:>>addpath ''dir1 dir2 ... -end'' - добавя указаните директории в края на текущия списък.:Пример::>>addpath C:\MATLAB\R2010a\Study - добавя директорията Study в началото на списъка.
>>rmpath - премахва директории от текущия Search Path.
:>>rmpath ''dir1 dir2 ...'' - премахва от списъка указаните директории.
:Пример::>>rmpath C:\MATLAB\R2O10a\Anketa - премахва директория Anketa.
:Забележки::# В горните команди трябва да се указват пълните адреси на директориите.
:# Ако адресът съдържа интервал, в последните две команди този адрес трябва да се загражда в единични апострофи! В противен случай интервалът се възприема от системата като разделител между два различни адреса.
>>pathtool - активира MATLAB Set Path Tool - инструмент за визуализация и редактиране на списъка на достъпните директории.