У загальному випадку необхідним при заданні процедури є лише послідовність операторів, інші параметри можуть бути відсутніми. Однак часто задання додаткових параметрів може бути потрібним.
Локальними параметрами називаються змінні, що використовуються всередині процедури. Якщо їх імена збігаються з іменами зовнішніх змінних, то конфлікту між ними не виникає. Глобальними параметрами називаються ті параметри, які використовуються і процедурою, і зовнішньою програмою. Рекомендується їх оголошувати в заголовку процедури.
Для раніше створеної процедури можна вивести на екран її вміст за допомогою таких команд:
>interface(‘verboseproc’=2):
>print(name_of_proc);
Далі розглянемо, які саме опції, або розширювальні ключі, використовують у процедурах:
1) remember – створює в пам’яті таблицю значень процедури, для того щоб при звертанні до неї не виконувати обчислення заново, а брати вже готові значення з таблиці. Ця опція прискорює виконання процедури.
2) system – як правило, використовується разом із remember і надає процедурі статусу системної, для якої може бути видалена таблиця значень. Видалення відбувається під час процедури «збирання сміття», тобто видалення всіх даних, на які немає жодного посилання, за допомогою команди gc() – garbage collection (англ.).
3) builtin – використовується для інформування користувача про те, що процедура є вбудованою в ядро системи Maple. Створити власну вбудовану процедуру неможливо.
101
4) operator, arrow – надає процедурі статусу функціонального оператора, що може спрощувати поводження з нею. Так, двома еквівалентними записами будуть такі, наприклад:
5) trace – задає виведення налагоджувальної інформації, коли буде видаватися поетапне виконання процедури.
6) Copyright – забороняє відображати оператори тіла процедури. Для відміни захисту потрібно виконати команду
interface(‘verboseproc’=2).
Після опцій у заголовку можна задавати коментар у вигляді рядка description ‘…’ для опису процедури. На виконання процедури коментар не впливає.
3.1.5. Модулі
Такі об’єкти Maple, як процедури, пов’язують послідовність декількох команд з однією командою, і процедури повертають одне значення. Можна побудувати більш складні програмні структури – модулі. Вони дозволяють зв’язати дані з процедурами, які ці дані оброблюють. Особливістю модулів є те, що вони можуть експортувати значення змінних. Тобто змінні, які були створені всередині модуля, будуть доступні і ззовні. Наприклад, більшість пакетів команд Maple були виконані як модулі, і кожна команда може бути використана поза модулем.
Детально ознайомитися з модулями можна на сторінці довідкової системи Maple, виконавши команду ?module.
3.2. Генерація випадкових чисел
Для генерації випадкових чисел і роботи з ними існує декілька різних засобів – окремі функції та спеціалізований
102
пакет команд RandomTools. Розглянемо функції генерації випадкових чисел.
3.2.1. Функції rand, randomize. Псевдовипадкові числа
Функція rand() без аргументів генерує випадкове ціле невід’ємне число з 12 знаків, наприклад 395718860534.
Функція rand(a..b) із заданням числового діапазону служить для генерації випадкового цілого числа з цього діапазону. При цьому спочатку генерується процедура, а потім при викликанні цієї процедури генерується число.
Функція rand(n) з одним аргументом аналогічна функції
rand(0..n-1).
Приклад 3.5. Згенерувати випадкове дробове число від 0 до 1 за допомогою функції rand.
Насправді всі генератори випадкових чисел виробляють псевдовипадкові числа. Річ у тому, що в системі Maple є вбудована послідовність чисел, з якої і беруться ті числа, що генеруються немов би випадково. Тому всі команди генерації, що використовуються, будуть впливати одна на іншу. Так, якщо виконати команду rand() після restart, то будемо мати одне й те саме випадкове число:
103
Для того щоб змінити цю послідовність, необхідно глобальній змінній seed (початкове число послідовності) призначити будьяке ціле додатне число, або для цього використати функцію
randomize:
– randomize(n) установлює значення змінної seed таким, що дорівнює n;
– randomize() встановлює значення змінної seed на основі системного годинника.
3.2.2. Генерація із заданим розподілом
Для генерації випадкових чисел із заданим розподілом використовується підпакет random із пакета stats. Загальний синтаксис команди такий:
>with(stats):
random[distribution](quantity, uniform, method); або
>stats[random, distribution](quantity, uniform, method);
Розшифруємо елементи, що входять до цієї команди:
–distribution – вигляд розподілу (див. таблицю 3.1);
–quantity – ціле додатне число, яке дорівнює кількості
чисел, що генеруються (за замовчуванням =1);
– uniform – генерація рівномірно розподілених чисел одночасно (за замовчуванням ‘default’);
– method – один із таких методів генерації: ‘auto’ (за замовчуванням), ‘inverse’, ‘builtin’.
Таблиця 3.1 – Види розподілів distribution
distribution |
Вид розподілу |
binomiald |
Дискретний біноміальний розподіл |
discreteuniform |
Дискретний рівномірний розподіл |
empirica |
Дискретний емпіричний розподіл |
poisson |
Дискретний розподіл Пуассона |
beta |
Неперервний бета-розподіл |
cauchi |
Неперервний розподіл Коші |
exponential |
Експоненціальний розподіл |
normald |
Нормальний (гаусів) розподіл |
uniform |
Неперервний рівномірний розподіл |
|
104 |
3.2.3. Пакет RandomTools
Пакет RandomTools має розширений набір інструментів для генерації випадкових чисел та роботи з випадковими об’єктами.
Цей пакет містить декілька команд та підпакетів. Підпакети служать для реалізації різних псевдовипадкових генераторів, які мають різні властивості, тому користувач може сам обрати бажаний варіант. Докладно дізнатися про роботу команд та підпакетів можна в довідковій системі, виконавши команду
>?RandomTools.
Функція цього пакета RandomTools[Generate](flavor)
генерує випадкові числа, кількість та властивості яких задані параметром flavor. Для того щоб мати уявлення про широкі можливості генерації чисел цієї функції, параметр flavor описаний у таблиці 3.2.
Таблиця 3.2 – Параметр flavor функції Generate пакета
RandomTools
Значення |
Опис |
параметра |
|
1 |
2 |
choose(collection) |
Генерація елемента з колекції collection, |
|
якою можуть бути набір, список, матриця, |
|
вектор, масив або таблиця |
complex |
Генерація комплексного випадкового числа |
distribution |
Генерація із заданим розподілом |
exprseq |
Генерація послідовності випадкових об’єктів |
float |
Генерація чисел із плаваючою точкою |
integer |
Генерація цілих чисел |
list |
Генерація списку випадкових об’єктів |
listlist |
Генерація подвійного списку випадкових |
|
об’єктів (тобто списку списків) |
negative |
Генерація від’ємного раціонального числа |
negint |
Генерація від’ємного цілого числа |
nonnegint |
Генерація невід’ємного цілого числа |
nonposint |
Генерація непозитивного цілого числа |
|
105 |