русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Шановні українці! Матеріал був перекладений з російської мови. Тому можуть бути незначні помикли...

Урок 10 - М файли в Матлаб. M-file Matlab

1. Робота в редакторі М-файлів

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

Відкрийте меню File основного вікна MatLab і в пункті New виберіть підпункт M-file. Новий файл відкривається у вікні редактора М-файлів.

Наберіть в редакторі команди, що призводять до побудови двох графіків в одному графічному вікні:

x = [0:0.1:7];
f = exp(-x);
subplot(1, 2, 1)
plot(x, f)
g = sin(x);
subplot(1, 2, 2)
plot(x, g)

тепер Збережіть файл з ім'ям mydemo.m у підкаталозі work основного каталогу MatLab, вибравши пункт Save as меню File редактора. Для запуску на виконання всіх команд, що містяться у файлі, виберіть пункт Run у меню Debug. На екрані з'явиться графічне вікно Figure No.1, містить графіки функцій. Якщо Ви вирішили побудувати графік косінуса замість синуса, то просто змініть рядок g = sin(x) у М-файлі g = cos(x) і запустіть всі команди знову.

Примітка 1

Якщо при наборі зроблена помилка, і MatLab не може розпізнати команду, то відбувається виконання команд до неправильно введеної, після чого виводиться повідомлення про помилку в командне вікно.

Дуже зручною можливістю, що надається редактором М-файлів, є виконання частини команд. Закрийте графічне вікно Figure No.1. Виділіть за допомогою миші, утримуючи ліву кнопку, або клавішами зі стрілками при натиснутій <Shift>, перші чотири команди програми та виконайте їх з пункту Evaluate Selection меню Text. Зверніть увагу, що у графічне вікно вывелся тільки один графік, відповідний виконаним командам. Запам'ятайте, що для виконання частини команд їх слід виділити і натиснути <F9>. Виконайте наступні три команди програми і прослідкуйте за станом графічного вікна. Потренуйтеся самостійно, наберіть будь-які приклади з попередніх лабораторних робіт в редакторі М-файлами і запустіть їх.

Окремі блоки М-файлу можна постачати коментарями, що пропускаються при виконанні, але зручні при роботі з М-файлом. Коментарі в MatLab починаються зі знака відсотка і автоматично виділяються зеленим кольором, наприклад:

%побудова графіка sin(x) в окремому вікні

У редакторі М-файлів може бути одночасно відкрито декілька файлів. Перехід між файлами здійснюється за допомогою закладок з іменами файлів, розташованих внизу вікна редактора.

Відкриття існуючого М-файлу здійснюється за допомогою пункту Open меню File робочого середовища, або редактора М-файлів. Відкрити файл у редакторі можна і командою MatLab edit з командного рядка, вказавши в якості аргументу ім'я файлу, наприклад:

» edit mydemo

Команда edit без аргументу призводить до створення нового файлу.
Всі приклади, які зустрічаються в цьому і наступних лабораторних роботах, краще всього набирати і зберігати в М-файлах, доповнюючи їх коментарями, і виконувати з редактора М-файлів. Застосування цифрових методів і програмування в MatLab вимагає створення М-файлів.

2. Типи М-файлів

М файли в MatLab бувають двох типів: файл-програми (Script M-Files), що містять послідовність команд, і файл-функції (Function M-Files), в яких описуються функції, визначені користувачем.

Файл-програму (файл-процедуру) Ви створили при прочитанні попереднього підрозділу. Всі змінні, оголошені у файл-програмі, стають доступними в робочому середовищі після її виконання. Виконайте в редакторі М?файлів файл-програму, наведену в підрозділі 2.1, і наберіть команду whos у командному рядку для перегляду вмісту робочого середовища. У командному вікні з'явиться опис змінних:

» whos
Name Size Bytes Class
f 1x71 568 double array
g 1x71 568 double array
x 1x71 568 double array
Grand total is 213 elements using 1704 bytes

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

  • З редактора М-файлів так, як описано вище.
  • З командного рядка або інший файл-програми, при цьому в якості команди використовується ім'я М-файлу.

Застосування другого способу набагато зручніше, особливо, якщо створена файл-програма буде неодноразово використовуватися згодом. Фактично, створений М-файл стає командою, яку розуміє MatLab. Закрийте всі графічні вікна і введіть у командному рядку mydemo, з'являється графічне вікно, відповідне командам файл-програми mydemo.m. Після введення команди mydemo MatLab виробляє наступні дії.

  • Перевіряє, чи є введена команда ім'ям якої з змінних, визначених у робочому середовищі. Якщо введена змінна, то виводиться її значення.
  • Якщо введено не невелика, то MatLab шукає введену команду серед вбудованих функцій. Якщо команда виявляється вбудованою функцією, то відбувається її виконання.

Якщо введено не мінлива і не вбудована функція, то MatLab починає пошук М-файл з назвою команди і розширенням m. Пошук починається з поточного каталогу (Current Directory), якщо М-файл не знайдений, то MatLab переглядає каталоги, встановлені в шляху пошуку (Path). Знайдений М-файл виконується в MatLab.

Якщо жодна з перерахованих вище дій не призвело до успіху, то виводиться повідомлення в командне вікно, наприклад:

» mydem
??? Undefined function or variable "mydem".

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

Примітка 2

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

3. Установка шляхів

В MatLab версій 6.x визначається поточний каталог та шляхи пошуку. Установка цих властивостей проводиться або за допомогою відповідних діалогових вікон або командами з командного рядка.

Поточний каталог визначається у діалоговому вікні Current Directory робочого середовища. Вікно присутній у робочому середовищі, якщо вибрано пункт Current Directory меню View робочого середовища.
Поточний каталог вибирається із списку. Якщо його немає в списку, то його можна додати з діалогового вікна Browse for Folder, викликається натисненням на кнопку, розташовану праворуч від списку. Вміст поточного каталогу відображається в таблиці файлів.

Визначення шляхів пошуку здійснюється в діалоговому вікні Set Path навігатора шляхів, доступ до якого здійснюється з пункту Set Path меню File робочого середовища.

Для додавання каталогу натисніть Add Folder і в діалоговому вікні Browse for Path виберіть каталог. Додавання теки зі всіма його підкаталогами здійснюється при натисканні на кнопку Add with Subfolders. Шлях до доданої каталогу з'являється в поле MATLAB search path. Порядок пошуку відповідає розташуванню шляхів у цьому полі, першим проглядається каталог, шлях до якого розміщений вгорі списку. Порядок пошуку можна змінити або взагалі видалити шлях до якого-або каталогу, для чого виберіть каталог в поле MATLAB search path і визначити його положення за допомогою таких кнопок:
Move to Top - перемістити вгору списку;
Move Up - перемістити вгору на одну позицію;
Remove - видалити зі списку;
Move Down - перемістити вниз на одну позицію;
Move to Bottom - помістити вниз списку.

Після внесення змін слід зберегти інформацію про шляхи пошуку, натиснувши кнопку Save. За допомогою кнопки Default можна відновити стандартні установки, a Revert призначена для повернення до збережених.

4. Команди для установки шляхів.

Дії з установки шляхів в MatLab 6.x дублюються командами. Поточний каталог встановлюється командою cd, наприклад cd c:\users\igor. Команда cd, викликана без аргументу, виводить шлях до поточного каталогу. Для установки шляхів служить команда path, що викликається з двома аргументами:

path (path, "c:\users\igor") - додає каталог c:\users\igor з низьким пріоритетом пошуку;
path ("з: \users\igor",path) - додає каталог c:\users\igor з вищим пріоритетом пошуку.

Використання команди path без аргументів вмикає відображення на екрані списку шляхів пошуку. Видалити шлях зі списку можна за допомогою команди rmpath:

rmpath (c:\users\igor") видаляє шлях до каталогу c:\users\igor зі списку шляхів.

 Примітка 3

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

Приклад. Створіть в кореневому каталозі диска D (або будь-якому іншому диску або каталозі, де студентам дозволено створювати свої каталоги) каталог зі своїм прізвищем, наприклад, WORK_IVANOV, і запишіть туди М-файл mydemo.m під ім'ям mydemo3.m. Встановіть шляху до файлу і продемонструйте доступність файлу з командного рядка. Результати приведіть у звіті по лабораторній роботі.

Варіант рішення:

1. В кореневому каталозі диска Dстворюється каталог WORK_IVANOV.
2. В каталог WORK_IVANOV записується М-файл mydemo.m під ім'ям mydemo3.m.
3. Відкривається діалогове вікно Set Path меню File робочої середовищі MatLab.
4. Натискається кнопка Add Folder і в діалоговому вікні Browse for Path вибирається каталог WORK_IVANOV.
5. Додавання теки зі всіма його підкаталогами здійснюється при натисканні на кнопку Add with Subfolders. Шлях до доданої каталогу з'являється в поле MATLAB search path.
6. Для запам'ятовування шляху натискається клавіша Save діалогового вікна Set Path.
7. Виконується перевірка правильності всіх дій шляхом набору команди mydemo3 з командного рядка. На екрані з'явиться графічне вікно.

5. Файл-функції

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

5.1. Файл-функції з одним вхідним аргументом

Припустимо, що в обчисленнях часто необхідно використовувати функцію

.

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

function f = myfun(x)
f= ехр(-х)*sqrt((х^2+1)/(х^4+0.1));

Слово function у першому рядку визначає, що цей файл містить файл-функцію. Перший рядок є заголовком функції в якій розміщується ім'я функції і списки вхідних і вихідних аргументів. У прикладі, наведеному в лістингу, ім'я функції myfun, один вхідний аргумент х і один вихідний - f. Після заголовка слід тіло функції (вона в даному прикладі складається з одного рядка), де і обчислюється її значення. Важливо, що обчислена значення записується в f. Крапка з комою поставлена для запобігання виведення зайвої інформації на екран.

Тепер збережіть файл на робочому каталозі. Зверніть увагу, що вибір пункту Save або Save as меню File призводить до появи діалогового вікна збереження файлу в полі File name якого вже міститься назва myfun. He змінюйте його, збережіть файл-функцію у файлі з запропонованим ім'ям.

Тепер створену функцію можна використовувати так само, як і вбудовані sin, cos та інші, наприклад з командного рядка:

» =myfun(1.3)
У =
0.2600

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

Попередження

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

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

» х = [1.3 7.2];
» = myfun(x)
??? Error using ==> ^
Matrix must be square.
Error in ==> C:\MATLABRll\work\myfun.m
On line 2 ==> f = exp(-x)*sqrt((х^2+1)/(х^4+1));

Якщо ви вивчили роботу з масивами, то усунення цього недоліку не викличе труднощів. Необхідно просто при обчисленні функції використовувати поелементні операції.
Змініть тіло функції, як зазначено в наступному лістингу (не забудьте зберегти зміни у файлі myfun.m).

function f = myfun(x)
f = ехр(-х).*sqrt((х.^2+1)./(х.^4+0.1));

Тепер аргументом функції myfun може бути як кількість, так і вектор або матриця значень, наприклад:

» х = [1.3 7.2];
» = myfun(x)
У =
0.2600 0.0001

Змінна, в яку записується результат виклику функції myfun, автоматично стає вектором потрібного розміру.

Побудуйте графік функції myfun на відрізку [0, 4] з командного рядка або за допомогою файл-програми:

x = [0:0.5:4];
у = myfun(x);
plot(x, y)

MatLab надає ще одну можливість роботи з файл-функціями - використання їх у якості аргументів деяких команд. Наприклад, для побудови графіка є спеціальна функція fplot, що замінює послідовність команд, наведену вище. При натисненні fplot ім'я функції, графік якої потрібно побудувати, полягає в апострофи, межі побудови вказуються в вектор-рядку з двох елементів

fplot("myfun", [0 4])

Побудуйте графіки myfun за допомогою plot і fplot на одних осях, за допомогою hold on. Зверніть увагу, що графік, побудований за допомогою fplot, більш точно відображає поведінку функції, т. к. fplot сама підбирає крок аргументу, зменшуючи його на ділянках швидкого зміни відображеної функції. Результати приведіть у звіті по лабораторній роботі.

5.2. Файл-функції з декількома вхідними аргументами

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

function r = radius3(x, y, z)
r = sqrt(х.^2 + .^2 + z.^2);

Для обчислення довжини радіус-вектора тепер можна використовувати функцію radius3, наприклад:

» R = radius3(1, 1, 1)
R =
1.732

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

5.3. Файл-функції з кількома вихідними аргументами

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

Лістинг функції перекладу секунд у години, хвилини і секунди

function [minute, hour, second] = hms(sec)
hour = floor(sec/3600);
minute = floor((sec-hour*3600)/60);
second = sec-hour*3600-minute*60;

При натисненні файл функцій з кількома вихідними аргументами результат слід записувати в вектор відповідної довжини:

» [Н, М, S] = hms(10000)
H =
2
М =
46
S =
40

6. Основи програмування в MatLab

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

6.1. Оператор циклу for

Оператор призначений для виконання заданого числа повторюваних дій. Найпростіше використання оператора for здійснюється наступним чином:

for count = start:final step:
команди MatLab
end

Тут count - мінлива циклу, start - її початкове значення, final - остаточне значення, а step - крок, на який збільшується count при кожному наступному заході в цикл. Цикл закінчується, як тільки значення count стає більше final. Мінлива циклу може приймати не тільки цілі, але і речові значення будь-якого знака. Розберемо застосування оператора циклу for на деяких характерні приклади.
Нехай потрібно вивести сімейство кривих для , яке задано функцією, що залежить від параметра Наберіть текст файл-процедури в редакторі М-файлів і збережіть файл FORdem1.m, і запустіть його на виконання (з редактора М-файлів або з командного рядка, набравши в ній команду FORdem1 і натиснувши <Enter>):

% файл-програма для побудови сімейства кривих
x = [0:pi/30:2*pi];
for a = -0.1:0.02:0.1
y = exp(-a*x).*sin(x);
hold on
plot(x, y)
end

Примітка 4

Редактор М-файлів автоматично пропонує розташувати оператори всередині циклу з відступом від лівого краю. Використовуйте цю можливість для зручності роботи з текстом програми.

У результаті виконання FORdem1 з'явиться графічне вікно, яке містить необхідне сімейство кривих.

Напишіть файл-програму для обчислення суми

.

Алгоритм обчислення суми використовує накопичення результату, тобто спочатку сума дорівнює нулю (S = 0), потім в змінну k заноситься одиниця, обчислюється 1k!, додається до S і результат знову заноситься в S. Далі k збільшується на одиницю, і процес триває, поки останнім складовою не стане 1/10!. Файл-програма Fordem2, наведена в наступному лістингу, обчислює потрібну суму.

Лістинг файл-програми Fordem2 для обчислення суми

% файл-програма для обчислення суми
% 1/1!+1/2+! ... +1/10!

% Обнулення S для накопичення суми
S = 0;
% накопичення суми в циклі
for k = 1:10
S = S + 1/factorial(k);
End
% виведення результату в командне вікно S

Наберіть файл-програму в редакторі М-файлів, збережіть її в поточному каталозі у файлі Fordem2.m і виконайте. Результат відобразиться в командному вікні, оскільки в останньому рядку файл-програми S міститься без крапки з комою для виведення значення змінної S


1.7183

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

Перші два рядки з коментарями не випадково відокремлені порожнім рядком від решти тексту програми. Саме вони виводяться на екран, коли користувач за допомогою команди help з командного рядка отримує інформацію про те, що робить Fordem2

>> help Fordem2
файл-програма для обчислення суми
1/1!+1/2+! ... +1/10!

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

Розглянемо завдання обчислення суми, схожу на попередню, але залежить від змінної x

.

Для обчислення цієї суми в файл-програмі Fordem2 потрібно змінити рядок всередині циклу for на

S = S + x.^k/factorial(k);

Перед запуском програми слід визначити змінну x у командному рядку за допомогою наступних команд:

>> x = 1.5;
>> Fordem2
S =
3.4817

В якості xможе бути вектор або матриця, так як у файл-програмі Fordem2 при накопиченні суми використовувалися поелементні операції.

Перед запуском Fordem2 потрібно обов'язково присвоїти змінної x деяке значення, а для обчислення суми, наприклад з п'ятнадцяти доданків, доведеться внести зміни в текст файл-програми. Набагато краще написати універсальну файл-функцію, в якій в якості вхідних аргументів будуть значення xі верхньої межі суми, а вихідним - значення суми S(x). Файл-функція sumN наведена в наступному лістингу.

Лістинг файл-функції для обчислення суми

function S = sumN(x, N)
% файл-функція для обчислення суми
% x/+1!x^2/2+! ... +x^N/N % використання: S = sumN(x, N)

% обнулення S для накопичення суми
S = 0;
% накопичення суми у циклі
for m = 1:1:N
S = S + x.^m/factorial(m);
end

Про використання функції sumN користувач може дізнатися, набравши в командному рядку help sumN. У командне вікно виведуться перші три рядки з коментарями, відокремлені від тексту файл-функції пустим рядком.

Зверніть увагу, що змінні файл-функції не є глобальними (m у файл-функції sumN). Спроба перегляду значення змінної m з командного рядка призводить до повідомленням про те, що m не визначена. Якщо в робочому середовищі є глобальна мінлива з тим же ім'ям, визначена з командного рядка або у файл-програмі, то вона ніяк не пов'язана з локальної змінної у файл-функції. Як правило, краще оформляти власні алгоритми у вигляді файл функцій для того, щоб змінні, використовувані в алгоритмі, не змінювали значення однойменних глобальних змінних середовища.

Цикли for можуть бути вкладені один в одного, при цьому змінні вкладених циклів повинні бути різними.

Цикл for виявляється корисним при виконанні повторюваних подібних дій у тому випадку, коли їх число заздалегідь визначено. Обійти це обмеження дозволяє більш гнучкий цикл while.

6.2. Оператор циклу while

Розглянемо приклад обчислення суми, схожий на приклад з попереднього пункту. Потрібно знайти суму ряду для заданого x(розкладення в ряд ):
.

Суму можна накопичувати до тих пір, поки складові є не дуже маленькими, скажімо більше по модулю Циклом for тут не обійтися, так як заздалегідь невідомо кількість доданків. Вихід полягає в застосуванні циклу while, який працює, поки виконується умова циклу:

while умова циклу
команди MatLab
end

У даному прикладі умова циклу передбачає, що поточне доданок . Для запису цієї умови використовується знак більше (>). Текст файл-функції mysin, обчислення суму ряду, наведено в наступному лістингу.

Лістинг файл-функції mysin, обчислення синус розкладанням в ряд

function S = mysin(x)
% Обчислення синуса розкладанням в ряд
% Використання: y = mysin(x), -pi<x<pi

< = 0;br /> k = 0;
while abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10
S = S + (-1)^k*x.^(2*k+1)/factorial(2*k+1);
k = k + 1;
end

Зверніть увагу, що у циклу while, на відміну від for, немає змінної циклу, тому довелося до початку циклу k присвоїти нуль, а всередині циклу збільшувати k на одиницю.
Умова циклу while може містити не тільки знак >. Для завдання умови виконання циклу допустимі також інші операції відносини, наведені в табл. 1.

Таблиця 1. Операції відносини

Позначення

Операція відносини

==

Рівність

Менше

<=

Менше або дорівнює

>=

Більше або дорівнює

~=

Не одно

Завдання більш складних умов виробляється із застосуванням логічних операторів. Наприклад, умова полягає в одночасному виконанні двох нерівностей і , і записується за допомогою логічного оператора and

and(x >= -1, x < 2)

або еквівалентним чином з символом &

(x >= -1) & (x < 2)

Логічні оператори і приклади їх використання наведено в табл. 2.

Таблиця 2. Логічні оператори

Оператор

Умова

Запис в MatLab

Еквівалентна запис

Логічне "І"

і

and(x < 3, k == 4)

(x < 3) & (k == 4)

Логічне "АБО"

Or(x == 1,x == 2)

(x == 1) | (x == 2)

Заперечення ""

not(a == 1.9)

~(a == 1.9)

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

while (abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10)&(k<=10000))

або еквівалентної формі

while and(abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10), k<=10000)

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

6.3. Умовний оператор if

Умовний оператор if дозволяє створити розгалужується алгоритм виконання команд, в якому при виконанні певних умов працює відповідний блок операторів або команд MatLab.

Оператор if може застосовуватися в простому вигляді для виконання блоку команд при задоволенні деякого умови або в конструкції if-elseif-else для написання разветвляющихся алгоритмов.
Нехай потрібно обчислити вираз . Припустимо, що розрахунки виконуються в області дійсних чисел і потрібно вивести попередження про те, що результат є комплексним числом. Перед обчисленням функції слід провести перевірку значення аргументу x, і вивести в командне вікно попередження, якщо модуль x не перевищує одиниці. Тут необхідно застосування умовного оператора if, застосування якого в найпростішому випадку виглядає так:

if умова
команди MatLab
end

Якщо умова виконується, то реалізуються команди MatLab, розміщені між if і end, а якщо умова не виконується, то відбувається перехід до команд, розташованим після end. При запису умови використовуються операції, наведені в табл. 1.

Файл-функція, перевіряюча значення аргументу, наведена в наступному лістингу. Команда warning служить для виводу попередження в командне вікно.

Лістинг файл-функції Rfun перевірки значення аргументу

function f = Rfun(x)
% обчислює sqrt(x^2-1)
% виводить попередження, якщо результат комплексний
% використання y = Rfun(x)

% перевірка аргументу
if abs(x)<1
warning("результат комплексний")
end
% обчислення функції
f = sqrt(x^2-1);

Тепер виклик Rfun від аргументу, меншого одиниці, призведе до висновку в командне вікно попередження:

>> y = Rfun(0.2)
результат комплексний
y =
0 + 0.97979589711327i

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

6.4. Оператор розгалуження if-elseif-else

У загальному випадку застосування оператора розгалуження if-elseif-else виглядає наступним чином:

if умова 1
команди MatLab
elseif умова 2
команди MatLab
elseif умова 3
команди MatLab
. . . . . . . . . . .
elseif умова N
команди MatLab
else
команди MatLab
end

В залежності від виконання того чи іншого з N умов працює відповідна гілку програми, якщо не виконується жодна із N умов, то реалізуються команди MatLab, розміщені після else. Після виконання кожної з гілок відбувається вихід з оператора. Гілок може бути скільки завгодно або тільки дві. У разі двох гілок використовується завершальне else, а elseif пропускається. Оператор завжди повинен закінчуватися end.
Приклад використання оператора if-elseif-else наведено в наступному лістингу.

function ifdem(a)
% приклад використання оператора if-elseif-else

if (a == 0)
warning("а дорівнює нулю")
elseif a == 1
(warning"а дорівнює одиниці")
elseif a == 2
warning("а дорівнює двом")
elseif a >= 3
warning("а, більше або дорівнює трьом")
else
warning("а менше трьох і не дорівнює нулю, одиниці, двом")
end

6.5. Оператор розгалуження switch

Для здійснення множинного вибору або розгалуження може застосовуватися оператор switch. Він є альтернативою оператору if-elseif-else. У загальному випадку застосування оператора розгалуження switch виглядає наступним чином:

switch switch_выражение
case значення 1
команди MatLab
case значення 2
команди MatLab
. . . . . . . . . . .
case значення N
команди MatLab
case {значення N+1, значення N+2, ...}
команди MatLab
. . . . . . . . . . . .
case {значення NM+1, значення NM+2,...}
otherwise
команди MatLab
end

У даному операторі спочатку обчислюється значення switch_выражения (це може бути скалярний числове значення або рядок символів). Потім це значення порівнюється зі значеннями значення: 1, значення 2, ..., N, N+1, значення N+2, ..., значення NM+1, значення NM+2,... (які також можуть бути числовими або рядковими). Якщо знайдено збіг, то виконуються команди MatLab, що стоять після відповідного ключового слова case. В іншому випадку виконуються команди MatLab, розташовані між ключовими словами otherwise і end.

Рядків з ключовим словом case може бути скільки завгодно, але рядок з ключовим словом otherwise повинна бути одна.

Після виконання якої з гілок відбувається вихід з switch, при цьому значення, задані в інших case не перевіряються.

Застосування switch пояснює наступний приклад:

function demswitch(x)
a = 10/5 + x
switch a
case -1
warning("a = -1")
case 0
warning("a = 0")
case 1
warning("a = 1")
case {2, 3, 4}
warning("a одно 2 або 3 або 4")
otherwise
warning("a одно не -1, 0, 1, 2, 3, 4")
end

>> x = -4
demswitch(x)
a =
1
warning: a = 1
>> x = 1
demswitch(x)
a =
6
warning: a одно не -1, 0, 1, 2, 3, 4

 

6.6. Оператор переривання циклу break

При організації циклічних обчислень слід дбати про те, щоб всередині циклу не виникло помилок. Наприклад, нехай задано масив x, що складається з цілих чисел, і потрібно сформувати новий масив y за правилом y(i) = x(i+1)/x(i). Очевидно, що проблема може бути вирішена за допомогою циклу for. Але якщо один з елементів вихідного масиву дорівнює нулю, то при поділі вийде inf, і подальші обчислення можуть виявитися марними. Запобігти цю ситуацію можна виходом із циклу, якщо поточне значення x(i) дорівнює нулю. Наступний фрагмент програми демонструє використання оператора break для переривання циклу:

for x = 1:20
z = x-8;
if z==0
break
end
y = x/z
end

Як тільки мінлива z приймає значення 0, цикл переривається.

Оператор break дозволяє достроково перервати виконання циклів for та while. Поза цих циклів оператор break не працює.

Якщо оператор break застосовується у вкладеному циклі, то він здійснює вихід тільки з внутрішнього циклу.

Переглядів: 4567

Повернутися взміст


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн