Основи роботи в MATLAB

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

Історична довідка

MATLAB як мова програмування була розроблена Клівом Моулером (англ. Cleve Moler) наприкінці 1970-х років, коли він був деканом факультету комп'ютерних наук в Університеті Нью-Мексико.
Метою розробки служила задача дати студентам факультету можливість використання програмних бібліотек Linpack і EISPACK без необхідності вивчення Фортрану. Незабаром нова мова поширилася серед інших університетів і була з великим інтересом зустрінутий вченими, що працюють в області прикладної математики.
До цих пір в Інтернеті можна знайти версію 1982 року, написану на Фортрані, поширювану з відкритим вихідним кодом. Інженер Джон Літтл (англ. John N. (Jack) Little) познайомився з цією мовою під час візиту Клива Моулера в Стенфордський університет в 1983 році. Зрозумівши, що нова мова володіє великим комерційним потенціалом, він об'єднався з Клівом Моулером і Стівом Бангертом (англ. Steve Bangert). Спільними зусиллями вони переписали MATLAB на C і заснували в 1984 компанію The MathWorks для подальшого розвитку. Ці переписані на С бібліотеки довгий час були відомі під ім'ям JACKPAC.
Спочатку MATLAB призначався для проектування систем управління (основна спеціальність Джона Літтла), але швидко завоював популярність у багатьох інших наукових і інженерних областях. Він також широко використовувався і в освіті, зокрема, для викладання лінійної алгебри та чисельних методів.

Про MatLab

MatLab – одна з найстаріших, ретельно пророблених і провірених часом систем автоматизації математичних розрахунків, побудована на розширеному представленні і застосуванні матричних операцій. Звідси й пішла назва системи – MATrix LABoratory – матрична лабораторія.
Matlab поставляється як комплекс Matlab + Simulink + Toolbox + Blockset, де розділами системи Toolbox і Blockset корпорація MathWorks називає пакети розширення для систем Matlab і Simulink, відповідно.
Однією із основних задач системи Matlab завжди було надання користувачам потужної мови програмування, орієнтованої на технічні і математичні розрахунки і здатної перевершити можливості традиційних мов програмування, котрі багато років використовувались для реалізації чисельних методів. При цьому особлива увага приділялась як підвищенню швидкості обчислень, так і адаптації системи до розв’язку самих різноманітних задач користувачів.

Інструменти MatLab

Для MATLAB є можливість створювати спеціальні набори інструментів (англ. toolbox), що розширюють його функціональність.
Набори інструментів є колекції функцій, написаних на мові MATLAB для вирішення певного класу задач. Компанія Mathworks поставляє набори інструментів, які використовуються в багатьох областях, включаючи такі:
Цифрова обробка сигналів, зображень і даних: DSP Toolbox, Image Processing Toolbox, Wavelet Toolbox, Communication Toolbox, Filter Design Toolbox - набори функцій, що дозволяють вирішувати широкий спектр завдань обробки сигналів, зображень, проектування цифрових фільтрів і систем зв'язку.
Системи управління: Control Systems Toolbox, μ-Analysis and Synthesis Toolbox, Robust Control Toolbox, System Identification Toolbox, LMI Control Toolbox, Model Predictive Control Toolbox, Model-Based Calibration Toolbox - набори функцій, що полегшують аналіз і синтез динамічних систем, проектування, моделювання та ідентифікацію систем управління, включаючи сучасні алгоритми управління, такі як робастної управління, H ∞-управління, ЛМН-синтез, μ-синтез та інші.
Фінансовий аналіз: GARCH Toolbox, Fixed-Income Toolbox, Financial Time Series Toolbox, Financial Derivatives Toolbox, Financial Toolbox, Datafeed Toolbox - набори функцій, що дозволяють швидко і ефективно збирати, обробляти і передавати різну фінансову інформацію.
Аналіз і синтез географічних карт, включаючи тривимірні: Mapping Toolbox.
Збір та аналіз експериментальних даних: Data Acquisition Toolbox, Image Acquisition Toolbox, Instrument Control Toolbox, Link for Code Composer Studio - набори функцій, що дозволяють зберігати й обробляти дані, отримані в ході експериментів, у тому числі в реальному часі. Підтримується широкий спектр наукового та інженерного вимірювального обладнання.
Візуалізація та подання даних: Virtual Reality Toolbox - дозволяє створювати інтерактивні світи і візуалізувати наукову інформацію за допомогою технологій віртуальної реальності та мови VRML.
Засоби розробки: MATLAB Builder for COM, MATLAB Builder for Excel, MATLAB Builder for NET, MATLAB Compiler, Filter Design HDL Coder - набори функцій, що дозволяють створювати незалежні програми з середовища MATLAB.
Взаємодія з зовнішніми програмними продуктами: MATLAB Report Generator, Excel Link, Database Toolbox, MATLAB Web Server, Link for ModelSim - набори функцій, що дозволяють зберігати дані в різних видів таким чином, щоб інші програми могли з ними працювати.
Бази даних: Database Toolbox - інструменти роботи з базами даних.
Наукові та математичні пакети: Bioinformatics Toolbox, Curve Fitting Toolbox, Fixed-Point Toolbox, Fuzzy Logic Toolbox, Genetic Algorithm and Direct Search Toolbox, OPC Toolbox, Optimization Toolbox, Partial Differential Equation Toolbox, Spline Toolbox, Statistic Toolbox, RF Toolbox - набори спеціалізованих математичних функцій, що дозволяють вирішувати широкий спектр наукових і інженерних задач, включаючи розробку генетичних алгоритмів, вирішення завдань в приватних похідних, цілочисельні проблеми, оптимізацію систем та інші.
Нейронні мережі: Neural Network Toolbox - інструменти для синтезу і аналіз нейронних мереж.
Нечітка логіка: Fuzzy Logic Toolbox - інструменти для побудови та аналізу нечітких множин.
Символьні обчислення: Symbolic Math Toolbox - інструменти для символьних обчислень з можливістю взаємодії з символьним процесором програми Maple.
Крім перерахованих вище, існують тисячі інших наборів інструментів для MATLAB, написаних іншими компаніями і ентузіастами.

Запуск системи і робота в діалоговому режимі

На початку запуску автоматично виконується команда matlabrc, яка виконує завантажувальний файл matlabrc.m. Цей файл виконує початкове налаштування термінала системи і задає ряд її параметрів. У томі числі, можуть бути вказані шляхи доступу до інших файлів, необхідних для коректної роботи системи.
Сеанс роботи з Matlab прийнято називати сесією (session). Сесія, по суті, являється поточним документом, відображаючим роботу користувача в системі. Вона включає рядки вводу, виводу та повідомлень про помилки. Вхідні в сесію визначення змінних функцій, розміщених в буфері, але не саму сесію, можна записати на диск (файли формату .mat). Фрагменти сесії можна оформити у вигляді щоденника (за допомогою команди diary).
Система створена таким чином, що будь-які обчислення можна виконати в режимі прямих обчислень, тобто без підготовки програми. Такий підхід відбувається по правилу «задав питання, отримав відповідь»:
>> x=1;
>> cos(x)^2+sin(x)^2
ans =
1
>> 2*log(ans)^3-5/tan(2*sqrt(4))
ans =
-4.3185
>> w=2*log(1)^3-5/tan(2*sqrt(4))
w =
-4.3185

З цього лістінгу можна зробити висновки:

  • Для вказання вводу початкових даних використовується символ >>;
  • Дані вводяться за допомогою простого строкового редактора;
  • Для блокування виводу результату обчислень деякого виразу, після нього треба ставити знак ; (крапка з комою);
  • Якщо не вказана змінна для значення результату обчислень, то Matlab автоматично назначить змінну ans;
  • Знаком присвоєння є звичний математичний знак = ;
  • Вбудовані функції (наприклад cos) пишуться строковими буквами, а їх аргументи вказуються в круглих дужках;
  • Результати обчислень виводяться в рядках виводу (без знаку >>);

    В деяких випадках зручно записати математичне значення декількома рядками. Це можна зробити використовуючи знак переносу «…» (багатокрапка).

    Основні об’єкти Matlab

    Центральним поняттям всіх математичних систем являється математичний вираз. Він задає те, що має бути обчислене в числовому (рідше в символьному) вигляді. Приклади простих математичних виразів:
    2-4
    3.256*exp(8)
    2+sin(x)/(4*cos(y))

    Математичні вирази будуються на основі чисел, констант, змінних, операторів, функцій та різних спец знаків.

    Числа

    Число – найпростіший об’єкт мови Matlab, який представляє кількісні дані. Числа можна вважати константами, імена яких співпадають з їх значеннями. Вони можуть бути цілими, дробовими, з фіксованою і плаваючою крапкою. Можливе представлення з вказанням мантиси та порядку числа. В мантисі ціла частина відділяється від дробової комою, а не крапкою. Для відокремлення порядку числа від мантиси використовується символ е.
    Числа можуть бути комплексними : z = Re(x) + Im(x) * i. Уявна частина має множник i або j, що означає корінь квадратний з -1:
    >> i
    ans =
    0 + 1.0000i
    >> j
    ans =
    0 + 1.0000i
    >> k=3+7i
    k =
    3.0000 + 7.0000i
    >> real(k)
    ans =
    3
    >> imag(k)
    ans =
    7

    За замовчуванням Matlab повертає числа в короткому записі в форматі з фіксованою комою (5 знаків). Тому при роботі з числовими даними можна задавати різні формати представлення чисел. Але обчислення завжди проводяться в форматі чисел з подвійною точністю. Для установки формату представлення чисел використовується команда
    >> format name
    де name – ім.’я формату. Для числових даних name може бути наступним:

    Short (default) - Короткий запис в форматі з фіксованою комою (5 знаків)
    Long - Довгий запис в форматі з фіксованою комою (15 знаків)
    Short e - Короткий запис в форматі з плаваючою комою (5 знаків +3 знаки порядку)
    Long e - Довгий запис в форматі з плаваючою комою (15 +3 знаки)
    Hex - Запис в вигляді шістнадцяткового числа
    Bank - Запис до сотих частин (грошові одиниці)
    + - Записується тільки знак числа
    Rational - Запис у вигляді раціонального дробу
    Число всередині системи зберігається з усіма введеними цифрами. Виводяться на екран числа у формі встановленого формату. Введене значення і результати обчислень зберігаються з похибкою, що становить приблизно (точне значення в 15-ти десяткових розрядах). Діапазон дійсних чисел знаходиться в межах від Неможливо розібрати вираз (невідома помилка): 10 ^-308)

    до Неможливо розібрати вираз (невідома помилка): 10 ^308)
    

    .

    Цілі числа. У системі вони не виділяються явно. Наберемо і виконаємо окремо кожну команду:
    a=2 a=2.0 a=2; a=1:6 b=1:20 c=10:-2:5
    Командне вікно. Командний рядок. Редагування командного рядка. Буфер виконаних команд. Як вибирати інформацію з командного вікна і з буфера виконаних командних рядків. Не можна допускати збігу імені змінної з ім'ям якої-небудь команди. Речові числа. Виконаємо окремо наступні команди:
    d=0.5:0.3:2.5 d=.5:.3:2.5 d=.5+1:.3-.1:2.5*2 length(d)
    d(end) d(end-2) d(1) d(0) d(2:7) d(7:-1:2) d(150)
    f=linspace(1.5,30,143); length(f)
    Індекси завжди починаються зі значення 1. Команди набираються на малому латинською регістрі. Можлива багато-параметрічність команд.

    Константи

    Константа – наперед визначене числове або символьне значення, представлене унікальним іменем. Числа (наприклад 1, -256 і 0.024) являються безіменними числовими константами. Інші види констант в Matlab прийнято називати системними змінними. Вони задаються системою при завантаженні, але можуть переозначатись. Основні системні змінні:
    i, j – уявна одиниця;
    Pi – число π (пі);
    Eps – похибка операцій над числами з плаваючою комою (2-52);
    Realmin – найменше число з плаваючою комою (2-1022);
    Realmax - найбільше число з плаваючою комою (21023);
    Inf – значення машинної нескінченності;
    Ans – результат останньої операції;
    NaN – вказує на нечисловий характер даних (Not-a-Number);

    Наприклад: >> 2*pi
    ans =
    6.28
    >> eps %формат bank
    ans =
    0.00
    >> format short e
    >> eps
    ans =
    2.2204e-016
    >> 1/0
    Warning: Divide by zero.
    ans =
    Inf
    >> 0/0
    Warning: Divide by zero.
    ans =
    NaN

    Символьна константа – це ланцюжок символів, записаних між апострофами, наприклад:

    >> '3+cos(z)/log(5)'
    ans =
    3+cos(z)/log(5)
    >> '25.05.2009 о 14:00 - футбол'
    ans =
    25.05.2009 о 14:00 - футбол

    Текстові коментарі

    Оскільки Matlab використовується для достатньо складних обчислень, важливе значення має їх наглядний опис. Це досягається за допомогою текстових коментарів. Коментарі вводяться за допомогою символа %, наприклад так:
    %it is factorial function

    Зазвичай перші рядки m-файлів служать для опису їх призначення, яке виводиться на екран після команди:
    >> help Ім’я_файлу

    Змінні

    Змінні – це іменовані об’єкти, здатні зберігати деякі дані. В залежності від цих даних змінні можуть бути числовими або символьними, векторними або матричними. Щоб присвоїти змінній деяке значення, треба виконати операцію присвоювання: Ім’я_змінної = Вираз
    Типи змінних наперед не декларуються. Вони приймають тип присвоюваного виразу. Ім’я змінної (її ідентифікатор) може містити яку завгодно кількість символів, але запам’ятовуються і ідентифікуються тільки перші 31.
    Ім’я має бути унікальним, повинне починатися з букви, може містити букви, цифри та символ підкреслювання _. Недопустимо включать в імена змінних пробіли і спеціальні знаки, наприклад +,-,/,* і т. п.
    В пам’яті комп’ютера змінні займають місце - робочу область. Для очистки робочої області використовується функція clear:
    >> clear – знищує означення всіх змінних;
    >> clear x – знищує означення змінної x;
    >> clear a, y, z – знищує означення декількох змінних.

    Оператори

    Оператор – це спеціальне позначення для певної операції над даними – операндами. Найпростішими арифметичними операторами є знак суми +, віднімання –, множення * та ділення /. Слід відмітити, що більшість операторів відноситься до матричних операцій. Наприклад, оператори множення * та ділення / обчислюють добуток та частку від двох масивів, векторів або матриць. Є ряд спеціальних операторів, наприклад оператор \ означає ділення справа наліво, а оператори .* і ./ означають поелементне множення та поелементне ділення масивів.
    Дуже часто необхідно виконати формування впорядкованих числових послідовностей. Такі послідовності потрібні для створення векторів чи значень абсциси при побудові графіків. Для цього в Matlab використовується оператор : (двокрапка).
    Початкове_значення:Крок:Кінцеве_значення;

    Дана послідовність створює зростаючу послідовність чисел, котра починається з початкового значення, йде з вказаним кроком і завершується кінцевим значенням. Якщо крок не задано, то по замовчуванню він рівний 1. Якщо початкове значення більше за кінцеве, то виводиться повідомлення про помилку. Приклади застосування даного оператора:
    >> i=1:4
    i =
    1 2 3 4
    >> i=0:0.2:1
    i =
    0 0.2000 0.4000 0.6000 0.8000 1.0000
    >> j=5:-1:1
    j =
    5 4 3 2 1
    >> 4:2
    ans =
    Empty matrix: 1-by-0

    Повний список операторів можна отримати виконавши команду
    >> help ops

    Функції

    Функції – унікально іменовані об’єкти, що виконують визначені перетворення своїх аргументів, і при цьому повертають результати своїх перетворень. Результат обчислення функції з одним вихідним параметром підставляється на місце її визову, що дозоляє використовувати функції в математичних виразах. Функції в загальному випадку мають список аргументів (параметрів). Якщо функція повертає декілька значень, то вона записується у вигляді
    [Y1, Y2, …] = func(X1, X2, …)

    де Y1, Y2, … - список вихідних параметрів, і X1, X2, … - список вхідних аргументів.
    Функції можуть бути вбудованими і зовнішніми, або m-функціями. Вбудованими є найбільш поширені елементарні функції, наприклад, sin(x) і exp(x), тоді як функція sinh(x) є зовнішньою функцією. Зовнішні функції містять свої означення в m-файлах. Вбудовані функції зберігаються в відкомпільованому ядрі системи Matlab, тому вони виконуються дуже швидко.
    Мова програмування системи Matlab пропонує ряд ефективних можливостей для задання функцій користувача. Одна з таких можливостей залючається в застосуванні функції inline, аргументом якої треба в апострофах задати вираз, що задає функцію однієї чи декількох змінних. В приведеному прикладі задана функція двох змінних:
    >> func1=inline('sin(x).^2+cos(y).^2')
    func1 =
    Inline function:
    func1(x,y) = sin(x).^2+cos(y).^2
    >> func1(1,0)
    ans =
    1.7081

    Можна також задавати свої функції у вигляді m-файлів. У вікні редактора m-файлів (File – Nev – M-File) створити m-файл з ім’ям func3 і лістингом:
    function y=func3(x,y)
    y=sin(x).^2+cos(y).^2

    Записавши його на диск, командою
    type func3
    можна вивести лістинг функції. Звертання до функції відбувається як до звичайної, підставляємо в список параметрів потрібні змінні.

    Введення векторів

    Вектори - рядки :
    a=1:6 linspace(1,6,10)
    Вектори – стовбці :
    a=(1:6)' linspace(1,6,10)'
    Оператори .' і ' :
    y1=linspace(1,6,4)'; y2=y1; y=y1+i*y2; y.' y'
    Команди linspace і: застосовуються для задання тільки речових векторів. Введення матриць. A(i,j) - елемент із i-го рядка та j-го стовбця. A(k) – k-й елемент таблиці, витягнутий в стовбець.
    A=[1,2;3,4] A=[1;2,3;4] A(2,2) A(3) A(5) size(A) A(3,4)=10 size(A)
    A(5)=6 size(A) A(22)=3 A=A(:) A(22)=3 size(A) [m,n]=size(A)
    A=reshape(1:24,4,6) size(A) A([1,end],:)=[] A(:,[1,end])=[] size(A)


    Формування векторів і матриць

    Matlab – система, спеціально призначена для проведення складних обчислень над векторами, матрицями та масивами – в томі числі багатовимірними. При цьому вона по замовчуванню вважає, що кожна задана змінна – це вектор, матриця або масив. Все визначається конкретним значенням змінної. Наприклад, якщо задано x=1, то це значить, що x – це вектор з єдиним елементом, що приймає значення 1. Якщо треба задати вектор із декількох елементів, то їх значення варто перечислити в квадратних дужках, відокремлюючи пробілами. Наприклад, присвоювання
    >> V = [1 2 3 4]
    V =
    1 2 3 4

    Задає вектор V, що має 4 елементи.
    Для визначення матриці треба вказати декілька рядків. Для їх відокремлення слугує знак ; (крапка з комою). Ввід
    >> M=[1 2 3;3 2 4; 0 3 0]
    M =
    1 2 3
    3 2 4
    0 3 0

    задає квадратну матрицю. Також можливо вводити елементи матриць та векторів у вигляді арифметичних виразів, що містять будь-які доступні для системи функції.
    Для вказання окремого елемента вектора чи матриці використовуються вирази виду V(k) чи M(i, j). Наприклад, якщо задати
    >> M(3, 2)
    ans =
    3

    Якщо треба присвоїти елементу нове значення, треба записати
    >> M(3, 2)=10
    M =
    1 2 3
    3 2 4
    0 10 0

    Вираз M(i) з одним індексом дає доступ до елементів матриці, розвернутим в один стовпчик. Така матриця отримується, якщо в початковій записати стовпці підряд. Це ілюструє наступний приклад.
    >> M=[1 2 3;4 5 6;7 8 9]
    M =
    1 2 3
    4 5 6
    7 8 9
    >> M(2)
    ans =
    4
    >> M(8)
    ans =
    6

    Можна задавати вектори і матриці з комплексними елементами, наприклад:
    >> i=sqrt(-1);
    >> CM=[1 2;3 4]+i*[5 6;7 8]
    CM =
    1.0000 + 5.0000i 2.0000 + 6.0000i
    3.0000 + 7.0000i 4.0000 + 8.0000i

    Поряд з операціями над окремими елементами матриць і векторів система дозволяє виконувати операції множення, ділення та піднесення до степеня зразу над всіма елементами, тобто над масивами. Для цього перед знаком операції ставиться крапка (.*, ./, .^). Існує також ряд спеціальних функцій для задання векторів та матриць. Наприклад, функція magiс(n) задає магічну матрицю n×n.
    Для формування матриць і виконання ряду матричних операцій виникає необхідність видалення окремих стовпців і рядків матриці. Для цього використовується пусті квадратні дужки. Видалимо другий стовпчик матриці A
    >> A=[1 1 1;2 2 2;3 3 3]
    A =
    1 1 1
    2 2 2
    3 3 3
    >> A(:,2)=[]
    A =
    1 1
    2 2
    3 3

    Тепер видалимо третій рядок:
    >> A(3,:)=[]
    A =
    1 1
    2 2

    Елементи xy графіки

    Як відкривати графічне вікно:
    figure whitebg zoom on
    Тепер побудуємо графік функції y=sin(2x), 0<=x<=5, виконавши рядок:
    x=0:1e-3:5; y=sin(2*pi*x); plot(y) plot(x,y) ,grid
    Використання режиму zoom:
    k=100; y=sin(2*pi*k*x); plot(y)
    Автоматичне чергування кольорів. Тепер будемо, як правило, нумерувати рядки
    1;x=linspace(0,1,20); k=.1:.1:.8; y=k'*x; plot(x,y)
    Тут визначається вектор-рядок x=0:20, потім вектор-рядок k з 8 кутових коефіцієнтів, далі виходить матриця y=k'*x як добуток вектора-стовпця k' на вектор-рядок x. Рядки цієї матриці складаються з точок відповідних прямолінійних відрізків. Нарешті, будуються графіки цих відрізків як функцій від x - перша нижня лінія (вона жовта) відповідає k=.1, остання, теж жовта, - для k=.8. Ми бачимо, що кольори, яких всього 7, чергуються циклічно в такому порядку (під українськими англійські назви):
    жовтий фіолетовий голубий красний зелений синій білий
    yellow magenta cyan red green blue white
    Викличемо рядок 1 і відредагуємо в ній команду plot:
    1;x=linspace(0,1,20); k=.1:.1:.8; y=k'*x; plot(x,y,'g.')

    Тобто додамо там третій (текстової, бо він в апострофа) аргумент. Всі криві на малюнку стануть зеленими (green), а лінії будуть зображуватися окремими точками. Аналогічно вживаються й інші кольори з цього списку - за першою літерою. У текстовому аргументі може бути до трьох символів. Для зображення точок графіка крім. вживаються ще: -- -. * х 0 + і деякі інші символи.