Програмування в MATLAB

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

Програмування в середовищі MATLAB

Інколи при роботі з MATLAB в режимі калькулятора з’являється необхідність повторення проведених дій. Тому розрахунки зі складними переходами по визначеним умовам, з часто повторюваними діями потребують спеціального оформлення у вигляді програм.


Розробка алгоритмів

MATLAB надає зручні засоби для розробки алгоритмів, включаючи високорівневі з використанням концепцій об'єктно-орієнтованого програмування. У ньому є всі необхідні засоби інтегрованого середовища розробки, включаючи відладчик і профайлер. Функції для роботи з цілими типами даних полегшують створення алгоритмів для мікроконтролерів і інших додатків, де це необхідно.


Візуалізація даних

У складі пакету MATLAB є велика кількість функцій для побудови графіків, у тому числі тривимірних, візуального аналізу даних і створення анімованих роликів. Вбудована середу розробки дозволяє створювати графічні інтерфейси користувача з різними елементами управління, такими як кнопки, поля введення і іншими. За допомогою компонента MATLAB Compiler ці графічні інтерфейси можуть бути перетворені в самостійні додатки, для запуску яких на інших комп'ютерах необхідна встановлена ​​бібліотека MATLAB Component Runtime.

Функції функцій

Багато важливих універсальних процедур в MATLAB використовують в якості змінного параметра ім'я функції, з якою вони оперують. Тому при зверненні до таких процедур необхідно вказувати ім'я М-файла, що містить текст іншої процедури (функції).
Такі процедури називають функціями функцій.
Для того щоб скористатись функцією функцій, користувач повинен створити М-файл, в якому буде вираховуватись значення потрібної («внутрішньої») функції по відомому значенню її аргументу.

М-файли і їх типи.

Функції та процедури що працюють в середовищі MATLAB зберігаються у вигляді коду в М-файлах.
В середовищі Матлаб програми створюються або за допомогою власного вбудованого редактора або будь-якого зовнішнього.

М-файли є двох типів:

  • Файли-функції
  • файли-сценарії.

Зберігаються з розширенням .m, тому їх неможна розрізнити по розширенню імені.

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

Правила оформлення М-файлів:

  • Кожен оператор записується в новому рядку.
  • В рядку можна розмістити декілька операторів через крапку з комою або кому.
  • Довгий оператор можна записувати в дек. рядків. При цьому рядок повинен завершуватись трьома крапками.
  • Для виводу проміжних результатів треба НЕ ставити в кінці оператора знак “;”.
  • Коментарій виділяється знаком “%”.
  • В програмах MATLAB немає символу що позначає кінець програми.
  • Змінні не описуються і не оголошуються. Будь-яке ім'я при виконанні сприймається як ім'я “змінної”.

Найбільша різниця в різному сприйманні системою імен змінних в файлах цих двох типів.
В файлах функціях всі імена змінних, що знаходяться всередині файлу, а також змінні, визначені в заголовку сприймаються як локальні.
В файлах-сценаріях всі використовувані змінні створюють деяку робочу область (workspace). Значення змінних зберігаються на протязі всього сеансу роботи з системою. Робоча область єдина для всіх файлів-сценаріїв що викликаються під час роботи з системою.

Перший рядок (заголовок) файлу функції має наступний вигляд:

function <ПВХВ> = <ім'я процедури>(<ПВВ>)

ПВХВ – перелік вхідних величин ПВВ – перелік вихідних величин

Файли-сценарії такого рядка не мають.

Приклад виклику функції функції

quad(‘<ім'я функції>’, a, b) ode45(‘<ім'я функції>’, tspan, y0, options)

Приклад М-файла

Файл ► Новий ► М-файл

function y = F1(x,d)
% Процедура, що вираховує значення
% функції
% y = (d^3)*ctg(x)*sqrt(sin(x)^4 – cos(x)^4).
% Звертання (виклик) – y = F1(x,d).
y = (d^3)*ctg(x)*sqrt(sin(x)^4 – cos(x)^4)

Зберегти файл з ім'ям F1.m

Робота прикладу

>> y = F1(1,0.1)

Отримаємо результат: y = 4.1421e-004

>> zet = 0 : 0.3 : 1.8; >> my = F1(zet,1)

Результат: Warning: Divide by zero Ділення на нуль


Графічне оформлення результатів

Обчислювальна програма в більшості випадків призначена для дослідження деяких явищ, поведінки пристроїв що розроблюються.
Інформація що отримується в результаті виконання таких програм, як правило має вигляд ряду чисел кожне з яких відповідає значенню конкретного параметра (аргументу). Таку інформацію зручно представляти в графічному вигляді.
Для створення графічного інженерного документа в MATLAB необхідно використовувати функцію subplot.

subplot (m, n, p)

m – вказує на скільки частин розбивається графічне вікно по вертикалі
n – по горизонталі
p – номер підвікна в якому буде будуватись графік

Розглянемо як виконується розбивка графічного вікна на окремі поля для графіків і текстове під вікно.
Наприклад треба розділити все поле графічного вікна на три частини так, щоб в верхній частині вікна знаходилось поле виводу тексту, а в нижніх двох третинах – єдине поле для виводу графіків. Це можна зробити так:

  • перед виводом текстової інформації в графічне вікно треба використати команду subplot(3,1,1), за допомогою якої графічний екран буде розділений на три однакові частини по вертикалі (підвікна) і для наступного виводу буде використана верхня частина.
  • Для того щоб вивести графіки в графічне підвікно введіть команду subplot(3,1,[2 3]), в результаті виконання графічне вікно, як і раніше, розділиться по вертикалі на три підвікна, але для виводу графічної інформації використано простір що зайнятий двома нижніми під вікнами.

Розглянемо роботу функції subplot().
Введемо наступні команди в вікні Command Window:

subplot(3,4,[5 6 7]) subplot(3,4,1:3) subplot(3,4,9:11) subplot(3,4,[4 8 12])

Виконавши цей код система відобразить

Subplot matlab.JPG

Для виводу графіків на полотно достатньо ввести вираз подубови графіка одразу після оголошення параметрів полотна:
subplot(3,4,[5 6 7])
plot(x*2);
subplot(3,4,1:3)
plot(x*2+3)
subplot(3,4,9:11)
plot(x*3-12)
subplot(3,4,[4 8 12])
plot(x*20)

Subplot2 matlab.JPG

Ввід і вивід інформації в діалоговому режимі

Для забезпечення взаємодії з користувачем у процесі виконання М-файлу в системі MatLAB використовуються такі команди: disp, sprintf, input, menu, keyboard, pause.
Команда disp здійснює вивід значень вказаної змінної або вказаного тексту в командне вікно. Звернення до неї має вигляд:
disp (<змінна або текст в апострофах>) Особливістю цієї команди є те, що аргумент у неї може бути тільки один. Тому без спеціальних заходів неможливо здійснити вивід кількох змінних ,так як і об'єднання тексту з чисельними значеннями деяких змінних, що часто необхідно для зручного представлення інформації.
Для усунення цього недоліку використовують декілька способів. Щоб вивести значення декількох змінних в один рядок (наприклад, при створенні таблиць даних), потрібно створити єдиний об'єкт, який містив б всі ці значення. Це можна зробити, об'єднавши відповідні змінні в вектор, користуючись операцією створення вектора-рядка:
x = [x1 x2 ... x]. Тоді вивід значень декількох змінних в один рядок буде мати вигляд:
disp ([x1 x2 ... x]) Наведемо приклад:

» x1=1.24; x2=-3. 45; x3=5.76; x4=-8. 07; » disp([x1 x2 x3 x4])

1. 2400 -3. 4500 5. 7600 -8. 0700

Аналогічно можна сполучати кілька текстових змінних, наприклад:

» x1=' psi '; x2=' fi '; x3=' teta '; x4=' w1 '; » disp([x1 x2 x3 x4]) psi fi teta w1

Введення інформації з клавіатури в діалоговому режимі можна здійснити за допомогою функції input. Звернення до неї має вигляд:
x = input ('<запрошення>') призводить до наступних дій ПК: виконання операторів програми припиняється, ПК переходить в режим очікування закінчення вводу інформації з клавіатури. Після закінчення введення з клавіатури (яке визначається натисканням клавіші <Enter>) введена інформація запам'ятовується в програмі під ім'ям "х", і виконання програми продовжується.
Зручним інструментом вибору деякої з альтернатив майбутніх обчислювальних дій є функція menu MatLAB, яка створює поточне вікно меню користувача. Функція menu має такий формат звернення:
k = menu ( 'Заголовок меню', 'Альтернатива1', 'Альтернатива2',...,' Альтернатива n ').

Таке звернення призводить до появи на екрані меню, зображеного на рис.:

Menu matlab.JPG

Виконання програми тимчасово призупиняється, і система чекає вибору однієї з кнопок меню. Після відповіді вихідному параметру "k" присвоюється значення номера обраної альтернативи (1, 2, ..., n).
У загальному випадку число альтернатив може бути до 32. Тепер, в залежності від отриманого значення цього параметра, можна побудувати процес розгалуження обчислень, наприклад, вибору параметра, значення якого потрібно змінити.
Команда pause тимчасово припиняє виконання програми до тих пір, поки користувач не натисне будь-яку клавішу клавіатури. Якщо після назви команди вказати в дужках деяке позитивне ціле число n, то затримка виконання програми буде здійснена протягом n секунд.
Якщо в тексті М-файлу зустрічається команда keyboard, то виконання М-файлу припиняється, і управління передається клавіатурі.
Цей спеціальний режим роботи супроводжується появою в командному вікні MatLAB нового виду запрошення до дій К>> У цьому режимі користувач може здійснити будь-які дії, перевірити або змінити дані. При цьому йому доступні всі команди та процедури системи MatLAB. Для завершення роботи в цьому режимі необхідно ввести команду return. Тоді система продовжить роботу програми з оператора, наступного за командою keyboard.


Робота з файлами

Створення програм часто припускає збереження результатів розрахунків у файли для їх подальшого аналізу, обробки, зберігання і т.п. У зв'язку з цим у MatLab реалізовані різні функції по роботі з файлами, що містять дані в самих різних форматах. Функції save і load save <ім'я файлу> <імена змінних>% збереження даних load <ім'я файлу> <імена змінних>% завантаження даних

Функція save дозволяє зберігати довільні змінні програми у файл, який буде (за замовчуванням) розташовуватися в робочому каталозі (зазвичай піддиректорія work) і мати розширення mat. Функція load дозволяє завантажити із зазначеного mat-файл раніше збережені змінні. function save_load x = 29; y = 5; s = 'hello';

save params x y s; x = 44 y = 0; s = ;

load params x y s; disp(x); disp(y); disp(s); На екран будуть виведені тіж самі значення, що були перші збережені.

Функції fwrite і fread Недоліком розглянутих функцій save і load є те, що вони працюють з певними форматами файлів (зазвичай mat-файли) і не дозволяють завантажувати або зберігати дані в інших форматах. Тим часом буває необхідність завантажувати інформацію, наприклад, з бінарних файлів, створених іншими програмними продуктами для подальшої обробки результатів у MatLab. З цією метою були розроблені функції

fwrite (<ідентифікатор файлу>, <змінна>, <тип даних>) та <змінна> = fread (<ідентифікатор файлу>); <змінна> = fread (<ідентифікатор файлу>, <розмір>); <змінна> = fread (<ідентифікатор файлу>, <розмір>, <точність>); Тут <ідентифікатор файлу> - це покажчик на файл, з яким передбачається працювати. Щоб отримати ідентифікатор, використовується функція <ідентифікатор файлу> = fopen (<ім'я файлу>, <режим роботи>); Наприклад fid = fopen ('my_file.dat', 'rb');% відкриття файлу на читання if fid == -1 % перевірка коректності відкриття

    error ('File is not opened');

end B = fread (fid, 5, 'double'); % читання 5 значень double disp (B); % відображення на екрані fclose (fid); % закриття файлу

Функції fscanf і fprintf

Оскільки вихідними результатами багатьох програм є текстові файли, в яких явним чином записані числа або текст, то використовуються дані функції. Наприклад, при експорті даних з MS Excel можна отримати файл формату [value, count] = fscanf(fid, format, size) и записи count = fprintf(fid, format, a,b,...) Тут value - результат зчитування даних з файлу; count - число прочитаних (записаних) даних; fid - покажчик на файл; format - формат читання (записи) даних; size - максимальне число зчитувальних даних; a, b, .. - Змінні для запису у файл. function fscanf_ex fid = fopen ('my_excel.dat', 'r'); if fid == -1

    error ('File is not opened');

end S = fscanf (fid, '% d,% f,% f,% f,% f,% d'); fclose (fid); Форматний рядок записан у вигляді '% d,% f,% f,% f,% f,% d'. Це означає, що спочатку має бути прочитане цілочисельне значення з файлу, потім, через кому має читатися другого дійсне значення, потім третє і так далі до останнього цілочисельного значення. Щоб зберегти вірний формат даних, функцію fscanf () у наведеному прикладі слід записати так: S = fscanf (fid, '% d,% f,% f,% f,% f,% d', [6 4]); Тоді на виході вийде матриця S розміром в 6 стовпців і 4 рядки з відповідними числовими значеннями.