Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Спеціальні символи та їх використання

Мова MatLab, у якій значною мірою запозичений синтаксис мови С, загалом побудована на використанні символів та символьної логіки. Тому перейдемо до вивчення спеціальних символів, яких у цій мові не бракує, і розробники систематизували їх за категоріями. Основні категорії операторів — це punct (Punctuation, пунктуація), та paren (Parentheses, дужки), але деякі оператори мають окрему категорію. Серед них дуже важливим є двокрапка :, який розробники віднесли до категорії colomn (двокрапка). У наведеній таблиці 2.4 перелік усіх спеціальних символів MatLab. Дії, призначені для виконання спеціальних функцій над матрицями та масивами числових даних. У наведеній таблиці літерою n позначені числові константи, М — матриці, О — оператори, W — вирази, FL — поля структур даних.

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

Особливе значення у вхідній мові системи MatLab при формуванні векторів має оператор двокрапка (:). За допомогою цього оператора формуються вектори з табульованими значеннями. Тобто, елементи вектора складають арифметичну прогресію з відповідним кроком, і значення кожного наступного елемента відрізняється від попереднього на постійне число.

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

>> n1:n2:n3

де n1 — значення першого елемента вектора, n2 — крок зміни елементів вектора, n3— границя, яку не повинен перевищувати останній елемент вектора при додатному кроці, або менше якого він не повинен бути при від’ємному кроці. У наведеному прикладі параметр n2 може бути пропущеним, тоді вважається що «за замовчуванням» n2=1. Користувачам, які знайомі із вхідною мовою MathCAD, треба звернути увагу на те, що нумерація елементів векторів у MatLab починається з одиниці, а не з нуля.

Це відповідає правилам формування векторів у математиці.

Якщо при написанні наведеного виразу n3<n1 при додатному кроці або n3>n1при від’ємному кроці, то система формує порожній вектор, який не містить жодного елемента, та видає відповідне системне повідомлення. Наведемо приклади формування векторів із табульованими значеннями за допомогою символа (:).

>> format short

>> a=1

a =

>> b=10

b =

>> s=0.1

s =

0.1000

>> v=a:b:s

v =

Empty matrix: 1?by?0

>> v=a:s:b

v =

Columns 1 through 7

1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000

Columns 8 through 14

1.7000 1.8000 1.9000 2.0000 2.1000 2.2000 2.3000

Columns 15 through 21

2.4000 2.5000 2.6000 2.7000 2.8000 2.9000 3.0000

Columns 22 through 28

3.1000 3.2000 3.3000 3.4000 3.5000 3.6000 3.7000

Columns 29 through 35

3.8000 3.9000 4.0000 4.1000 4.2000 4.3000 4.4000

Columns 36 through 42

4.5000 4.6000 4.7000 4.8000 4.9000 5.0000 5.1000

Columns 43 through 49

5.2000 5.3000 5.4000 5.5000 5.6000 5.7000 5.8000

Columns 50 through 56

5.9000 6.0000 6.1000 6.2000 6.3000 6.4000 6.5000

Columns 57 through 63

6.6000 6.7000 6.8000 6.9000 7.0000 7.1000 7.2000

Columns 64 through 70

7.3000 7.4000 7.5000 7.6000 7.7000 7.8000 7.9000

Columns 71 through 77

8.0000 8.1000 8.2000 8.3000 8.4000 8.5000 8.6000

Columns 78 through 84

8.7000 8.8000 8.9000 9.0000 9.1000 9.2000 9.3000

Columns 85 through 91

9.4000 9.5000 9.6000 9.7000 9.8000 9.9000 10.0000

>>

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

У попередньому прикладі було табульовано вектор значень у числовому діапазоні [1;10] з кроком 0,1. Тепер, використовуючи сформований вектор як параметр функції, легко знайти значення функції cos (x) у визначеному числовому діапазоні:

>> b=cos(v)

b =

Columns 1 through 7

0.5403 0.4536 0.3624 0.2675 0.1700 0.0707 ?0.0292

Columns 8 through 14

?0.1288 ?0.2272 ?0.3233 ?0.4161 ?0.5048 ?0.5885 ?0.6663

Columns 15 through 21

?0.7374 ?0.8011 ?0.8569 ?0.9041 ?0.9422 ?0.9710 ?0.9900

Columns 22 through 28

?0.9991 ?0.9983 ?0.9875 ?0.9668 ?0.9365 ?0.8968 ?0.8481

Columns 29 through 35

?0.7910 ?0.7259 ?0.6536 ?0.5748 ?0.4903 ?0.4008 ?0.3073

Columns 36 through 42

?0.2108 ?0.1122 ?0.0124 0.0875 0.1865 0.2837 0.3780

Columns 43 through 49

0.4685 0.5544 0.6347 0.7087 0.7756 0.8347 0.8855

Columns 50 through 56

0.9275 0.9602 0.9833 0.9965 0.9999 0.9932 0.9766

Columns 57 through 63

0.9502 0.9144 0.8694 0.8157 0.7539 0.6845 0.6084

Columns 64 through 70

0.5261 0.4385 0.3466 0.2513 0.1534 0.0540 -0.0460

Columns 71 through 77

-0.1455 ?0.2435 ?0.3392 -0.4314 -0.5193 ?0.6020 -0.6787

Columns 78 through 84

-0.7486 ?0.8111 ?0.8654 -0.9111 -0.9477 ?0.9748 -0.9922

Columns 85 through 91

-0.9997 ?0.9972 ?0.9847 -0.9624 -0.9304 ?0.8892 -0.8391

>>

Маючи такі числові результати, тобто вектор аргументу функції v та вектор значень функції b, можна використати їх у подальших обчисленнях. За отриманими результатами обчислень нескладно побудувати графік функції y(x)=cos(x), використовуючи графічні засоби системи MatLab. Зрозуміло, що під час роботи з векторами та матрицями великої надмірності часто немає сенсу виводити всі результати на екран. Слід мати на увазі, що при обчисленні складних математичних функцій з великою кількістю аргументів виведення результатів на екран не тільки ускладнює їх аналіз, але й значно уповільнює роботу програми. Щоб не виводити на екран результати обчислень, треба у кінці рядка ставити символ ; (крапку з комою).

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

>> x=0:5

x=

0 1 2 3 4 5

>> sin(x)/x

ans=

-0.0862

>>

Видно, що обчислення функції sin(x)/x у даному випадку виконано неправильно. Річ у тому, що ми використали не поелементне ділення, а розділили один вектор на інший за правилами лінійної алгебри. Тепер ви бачите, до яких грубих помилок призводить пропущення крапки у поелементних операторах! Реультатом ділення двох векторів є скаляр. Система провела обчислення саме таким чином, і цілком правильно. У даному випадку зрозуміло, що замість матричного оператора / треба використовувати поелементний оператор ./ .

>> sin(x)./x

Warning: Devide by zero

ans=

NaN

0.8415 0.4546 0.0470 ?0.1892 ?0.1918

>>

Тут теж не обійшлося без помилки, оскільки для х = 0 вираз невизначений. Зверніть увагу на те, що такому діленню відповідає не машинна нескінченність (Inf), а невизначеність (NaN).

 

 

Визначення матриць та векторів

 

Описання матриць та векторів здійснюється через визначення змінних. У цьому разі використовують три прості правила.

1. Усі елементи матриці або вектора необхідно брати у квадратні дужки.

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

3. Між рядками матриці ставлять крапку з комою.

Приклади визначення матриць та векторів:

>> v=[1, 2, 3, 4]

v=

1 2 3 4

>> MAT =[1,2;3,4]

M=

1 2

3 4

>>

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

>> v(1)=

>> M(1,1)=

>>

Найважливіше, що є у системі MatLab і чого немає в інших системах програмування та математичних САПР — це можливість виконання арифметичних дій ізматрицями та векторами та їх використання як параметрів математичних функцій. У цьому разі обчислення проводяться з кожним елементом матриці або вектора. З основ програмування відомо, що в кожній з мов програмування запис типу sin(v) або exp(M) , де М — матриця,v — вектор, був би некоректним. Щоб виконати будь-яку математичну дію з елементами вектора або матриці, потрібно організувати цикл. Обчислення функції від всіх елементів вектора або матриці є можливим у системі MathCAD, але там це робиться через спеціальну функцію векторизації. З точки зору точного математичного опису вцьому є певна рація, оскільки у математиці такі операції заборонені. Але під час розробки реальних програм найчастіше необхідно обробляти масиви великих чисел саме таким чином, наприклад, поелементно додавати, множити поелементно або на константу, обчислювати функції від елементів масиву. А такі дії, як множення матриць або векторний добуток двох векторів, потрібні програмісту значно рідше, тому їх можна реалізувати через внутрішні функції системи. Розробники MatLab виходили, ймовірно, саме із цих міркувань, адже система створювалася для професіоналів?програмістів. Томуу MatLab використані записи типу exp(M) або sin(v) як поелементні дії з матрицями та векторами. Адже програмісту зручно працювати саме так, хоча такий запис неправильний з математичної точки зору. До того ж, такий підхід відповідає всій ідеології системи, тому що вона розроблена для роботи з матрицями, і вони розглядаються як звичайні числа. А спеціальні матричні та векторні операції тут також введені, але через окремі функції.

Тому множення, ділення, піднесення у степінь умові MatLab реалізовані як за правилами лінійної алгебри, так і для поелементних операцій, але запис цих функцій різний. Якщо визначені дії слід виконувати поелементно, використовуються оператори .* для поелементного множення, ./ для по елементного ділення та .^ для поелементного піднесення у ступінь, у цьому разі розмірність масивів для поелементних операцій має бути однаковою. При використанні операторів */ та ^математичні дії виконуються за правилами лінійної алгебри. У випадку множення вектора або матриці на числову константу по елементні операції повністю збігаються з операціями лінійної алгебри.

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

Приклад

>> format short

>> v=[1,2,3,4];

>> sin(v)

ans=

0,8415 0,9093 0.1411 ?0,7568

>> 3*v

ans=

3 6 9 12

>> v^2

???Error using= =>^Matrix must be square.

>> v.^2

ans=

1 4 9 16

>> v+2

ans=

3 4 5 6

MAT=[1,2;3,4]

MAT =

1 2

3 4

>> sin (MAT)

ans =

0.8415 0.9093

0.1411 ?0.7568

>> MAT^2

ans =

7 10

15 22

>> MAT.^2

ans =

1 4

9 16

>> 3*MAT

ans =

3 6

9 12

>> 2+MAT

ans =

3 4

5 6

>>

У наведеному прикладі повідомлення

???Error using =

=>^ Matrix must be square

(Помилкове використання оператора ^. Повинна бути квадратна матриця)

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

 

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

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

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

Формат функції об’єднання матриць cat(dim, A, B), де

dim — специфікація розмірності масиву, а A та B — матриці, що об’єднуються. Параметри специфікації розмірності dim визначені таким чином:

dim = 1 — об’єднання матриць за рядками, кількості рядків у матрицях A та B повинні збігатися;

dim = 2 — об’єднання матриць за стовпчиками, кількості стовпчиків у матрицях A та B повинні збігатися;

dim = 3 — об’єднання матриць зі створенням тривимірного масиву, кількості матриць A та B повинні бути однакової розмірності.

Слід зазначити, що функцію об’єднання матриць легко здійснити через множинну індексацію та методи формування матриць, наявність функції cat у системі MatLab є дещо надлишковою і користуються нею рідко.

Іншими важливими функціями опрацювання матриць є функції переставлення їх елементів. Наприклад, функція fliplr(А) здійснює дзеркальне відображення елементів матриці зліва’направо відносно вертикальної осі. Функція flipud(А) здійснює дзеркальне відображення елементів матриці зверху вниз відносно горизонтальної осі. Функція reshape(A, l,k) створює з матриці A розмірності m*n іншу матрицю розмірності l*k через послідовний вибір елементів матриці А по стовпцях. Обов’язковою умовою для проведення такої операції є виконання співвідношення m•n = l•k. Але безперечною перевагою функції reshape є те, що за її допомогою можна здійснювати будь’які перетворення розмірності матриці.

Розглянемо тепер важливі функції створення трикутних матриць і матриць з відповідними діагональними елементами. Функція tril(A)створює нижню трикутну матрицю на основі матриці А через присвоєння значення «0» усім її елементам, розташованим нижче головної діагоналі. Функція triu(A) створює верхню трикутну матрицю на основі матриці А, анулюючи її елементи, розташовані вище головної діагоналі. Для створення діагональної матриці використовують функцію MatLab diag.

Можливі такі формати функції:

diag(v) — створення квадратної матриці, на головній діагоналі якої розташовані елементи вектора v;

diag(v, n) — створення прямокутної матриці, на одній із діагоналей якої розташовані елементи вектора v, у цьому разі параметр n визнає зсув діагоналі розташування елементів відносно головної діагоналі. Значення n > 0 відповідають зсуву відносно головної діагоналі вгору, а значення n < 0 — зсуву вниз.

Інша функція формування матриці на основі заданої — це функція repmat(A,m,n), яка повертає матрицю B, що є результатом розмноження матриці A m разів по стовпчиках та n разів по рядках. Розглянули два способи виконання тієї самої операції через використання множинної індексації, тому наявність функції repmat у системі MatLab теж є дещо надлишковою.

Є крім того, функція повороту елементів матриці на 90°

rot90(A, k), де A — матриця, що перетворюється, k — кількість поворотів, за замовчуванням k = 1.

Приклад

» format short

» M1=rand(2)

M1 =

0.4321 0.7660

0.2840 0.0976

» M2=rand(2)

M2 =

0.5558 0.2109

0.4483 0.1773

» cat(1,M1,M2)

ans =

0.4321 0.7660

0.2840 0.0976

0.5558 0.2109

0.4483 0.1773

» cat(2,M1,M2)

ans =

0.4321 0.7660 0.5558 0.2109

0.2840 0.0976 0.4483 0.1773

» format short

» M1=rand(2)

M1 =

0.1559 0.6852

0.2797 0.8352

» M2=rand(2)

M2 =

0.2201 0.4075

0.5674 0.7049

» C1=cat(1,M1,M2)

C1 =

0.1559 0.6852

0.2797 0.8352

0.2201 0.4075

0.5674 0.7049

» C2=cat(2,M1,M2)

C2 =

0.1559 0.6852 0.2201 0.4075

0.2797 0.8352 0.5674 0.7049

» fliplr(C1)

ans =

0.6852 0.1559

0.8352 0.2797

0.4075 0.2201

0.7049 0.5674

» flipud(C2)

ans =

0.2797 0.8352 0.5674 0.7049

0.1559 0.6852 0.2201 0.4075

» tril(C1)

ans =

0.1559 0

0.2797 0.8352

0.2201 0.4075

0.5674 0.7049

» triu(C1)

ans =

0.1559 0.6852

0 0.8352

0 0

0 0

» v=rand(3,1)

v =

0.2580

0.4546

0.3964

» diag(v)

ans =

0.2580 0 0

0 0.4546 0

0 0 0.3964

» diag(v,2)

ans =

0 0 0.2580 0 0

0 0 0 0.4546 0

0 0 0 0 0.3964

0 0 0 0 0

0 0 0 0 0

» diag(v,?2)

ans =

0 0 0 0 0

0 0 0 0 0

0.2580 0 0 0 0

0 0.4546 0 0 0

0 0 0.3964 0 0

» C1

C1 =

0.1559 0.6852

0.2797 0.8352

0.2201 0.4075

0.5674 0.7049

» rot90(C1)

ans =

0.6852 0.8352 0.4075 0.7049

0.1559 0.2797 0.2201 0.5674

» rot90(C1,2)

ans =

0.7049 0.5674

0.4075 0.2201

0.8352 0.2797

0.6852 0.1559

»

У MatLab функція норми вектора norm має такі формати:

norm(X, р) — функція повертає норму порядку р для вектора Х;

norm(X, р) — функція повертає норму другого порядку для вектора Х;

norm(X,’inf’) — функція повертає максимальне значення з абсолютних значень елементів вектора;

norm(X,’– inf’) — функція повертає мінімальне значення з абсолютних значень елементів вектора.

Наведемо приклади обчислення норми вектора.

Приклад

» format short

» S=[16,0,25,9,4,16,25,1,25]

S =

16 0 25 9 4 16 25

1 25

» norm(S)

ans =

49.8498

» norm(S,10)

ans =

27.9245

» norm(S,’inf’)

ans =

»

 

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

Справді, якщо АX = B, то X = BA–1= B/A = A\B. Здається, що немає різниці, як написати: B/A або A\B, ці операції є еквівалентними. Але розмірності структур A і B у нашому випадку не збігаються, і тому порядок здійснення операції ділення має значення з точки зору часу проведення розрахунків. І зворотне ділення матриці на вектор A\B з цієї точки зору ефективніше, оскільки здійснюється воно не через складну функцію обчислення оберненої матриці, а через дуже ефективний алгоритм методу Гауса.

Тому ефективне розв’язання поставленої задачі буде таким

Приклад

» A=[10,?7,2;3,?15,32;13,?9,15]

A =

10 ?7 2

3 ?15 32

13 ?9 15

» B=[6;10;26]

B =

» X=A\B

X =

2.3274

2.8804

1.4445

» A*X

ans =

6.0000

10.0000

26.0000

»

 

Функції в системі MatLab.

Последнее изменение этой страницы: 2016-06-09

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...