Смекни!
smekni.com

Матричная математическая система MATLAB (стр. 5 из 8)

>> fh=@sc2;

К такой функции можно обращаться с помощью функции исполнения функций feval(fh,x,y):

>> feval(fh,1,2)

y = 0.8813

ans = 0.8813

>> feval(fh,2,1)

y = 1.1187

ans = 1.1187

Сообщения об ошибках и исправление ошибок

Большое значение при диалоге с системой MATLAB и отладке программ в ней имеет диагностика ошибок. Рассмотрим ряд примеров, поясняющих технику диагностики. Введем, к примеру, ошибочное выражение

>> sqr(2)

и нажмем клавишу ENTER. Системасообщитобошибке:

??? Undefined function or variable 'sqr'.

Это сообщение говорит о том, что не определена переменная или функция, и указывает, какая именно, – sqr. В данном случае, разумеется, можно просто набрать правильное выражение. Однако в случае громоздкого выражения лучше воспользоваться редактором. Для этого достаточно нажать клавишу ↓ для перелистывания предыдущих строк. В результате в строке ввода появится выражение

>> sqr(2)

с курсором в его конце. В MATLAB можно теперь нажать клавишу Tab. Система введет подсказку, анализируя уже введенные символы. Из предложенных системой трех операторов выбираем sqrt. Теперь c помощью клавиши ↓ вновь выбираем нужную строку и, пользуясь клавишей ←, устанавливаем курсор после буквы r. Теперь нажмем клавишу T, а затем клавишу ENTER. Выражение примет следующий вид:

>> sqrt(2)

ans = 1.4142

Если бы был только один вариант окончания введенных символов, то после нажатия клавиши Tab система бы закончила наш ввод без перевода строки.

Вычисления дают ожидаемый результат – значение квадратного корня из двух.

В системе MATLAB внешние определения используются точно так же, как и встроенные функции и операторы. Никаких дополнительных указаний на их применение делать не надо. Достаточно лишь позаботиться о том, чтобы используемые определения действительно существовали в виде файлов с расширением .m.

Впрочем, если вы забудете об этом или введете имя несуществующего определения, то система отреагирует на это звуковым сигналом (звонком) и выводом сообщения об ошибке:

>> hsin(1)

??? Undefined function or variable 'hsin'.

>> sinh(1)

ans = 1.1752

В этом примере мы забыли (нарочно), какое имя имеет внешняя функция, вычисляющая гиперболический синус. Система подсказала, что функция или переменная с именем hsin не определена – ни как внутренняя, ни как m-функция.

Зато далее мы видим, что функция с именем sinh есть в составе функций системы MATLAB – она задана в виде M_функции, хранящейся на жестком диске. Между тем в последнем примере мы не давали системе никаких указаний на то, что следует искать именно внешнюю функцию! И это вычисление прошло так же просто, как вычисление встроенной функции, такой как sin.

Иногда в ходе вывода результатов вычислений появляется сокращение NaN (от слов Not a Number – не число). Оно обозначает неопределенность, например вида 0/0 или Inf/Inf, где Inf – системная переменная со значением машинной бесконечности. Могут появляться и различные предупреждения об ошибках (на английском языке). Например, при делении на 0 конечного числа появляется предупреждение «Warning: Devide by Zero.» («Внимание: деление на нуль»). Диапазон чисел, представимых в системе, лежит от 10–308 до 10+308.

Вообще говоря, в MATLAB надо отличать предупреждение об ошибке от сообщения о ней. Предупреждения (обычно после слова Warning) не останавливают вычисления и лишь предупреждают пользователя о том, что диагностируемая ошибка способна повлиять на ход вычислений. Сообщение об ошибке (после знаков ???) останавливает вычисления. Система контроля за ошибочными ситуациями в MATLAB 2009 была существенно переработана и стала более корректной.


Формирование векторов и матриц

Задания векторов и матриц и доступ к их элементам

MATLAB – система, специально предназначенная для проведения сложных вычислений с векторами, матрицами и массивами. При этом она по умолчанию предполагает, что каждая заданная переменная – это вектор, матрица или массив. Все определяется конкретным значением переменной. Например, если задано X=1, то это значит, что X – это вектор с единственным элементом, имеющим значение 1, а точнее даже матрица с размером 1×1. Если надо задать вектор из трех элементов, то их значения следует перечислить в квадратных скобках, разделяя пробелами или запятыми. Так, например, присваивание

>> V=[1 2 3]

V = 1 2 3

задает вектор V, имеющий три элемента со значениями 1, 2 и 3 (его можно считать и матрицей размера 3×1). После ввода вектора система выводит его на экран дисплея. Заметим, для вектора столбца нужно разделять элементы знаками «;» (точка с запятой):

>> V=[1; 2; 3]

V =

1

2

3

Задание матрицы требует указания нескольких строк и нескольких столбцов.

Для разграничения строк используется знак ; (точка с запятой). Этот же знак в конце ввода предотвращает вывод матрицы или вектора (и вообще любой операции) на экран дисплея. Так, ввод

>> M=[1 2 3; 4 5 6; 7 8 9];

задает квадратную матрицу, которую можно вывести:

>> M

M =

1 2 3

4 5 6

7 8 9

Возможен ввод элементов матриц и векторов в виде арифметических выражений, содержащих любые доступные системе функции, например:

>> V= [2+2/(3+4),exp(5),sqrt(10)];

>> V

V = 2.2857 148.4132 3.1623

Для указания отдельного элемента вектора или матрицы используются выражения вида V(i) или M(i, j). Например, если задать

>> М(2, 2)

ans = 5

то результат будет равен 5. Если нужно присвоить элементу M(i, j) новое значение x, следует использовать выражение


M(ij)=x

Например, если элементу M(2, 2) надо присвоить значение 10, следует записать

>> M(2, 2)=10

Вообще говоря, в тексте программ MATLAB лучше не использовать i и j как индексы, так как i и j – обозначение квадратного корня из –1. Но можно использовать I и J.

Выражение M(i) с одним индексом дает доступ к элементам матрицы, развернутым в один столбец. Такая матрица образуется из исходной, если подряд выписать ее столбцы. Следующий пример поясняет подобный доступ к элементам матрицы M:

>> 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

>> M(9)

ans = 9

>> M(5)=100;

>> M

M =

1 2 3

4 100 6

7 8 9

Здесь уместно отметить, что размер векторов и матриц в данной книге учебного характера ограничен. Однако система MATLAB способна работать с очень большими векторами и матрицами. Например, последняя версия MATLAB может работать с матрицами размера n×n, где максимальное значение n = 248 – 1, тогда как предшествующие версии имели максимальное значение n = 231. При этом размеры файла, который может хранить матрицу, могут достигать 18 Гб.

Задание векторов и матриц с комплексными элементами

Из курса математики известно о существовании комплексных чисел вида a + b * i, где a – действительная часть числа, b – мнимая часть и i – мнимая единица (корень квадратный из –1). Возможно задание векторов и матриц с комплексными элементами, например:

>> i=sqrt(-1);

>> CM = [1 2; 3 4] + i*[5 6; 7 8]

или

>> CM = [1+5*i 2+6*i; 3+7*i 4+8*i]

Это создает матрицу:

CM =

1.0000 + 5.0000i 2.0000 + 6.0000i

3.0000 + 7.0000i 4.0000 + 8.0000i


Возможно разделение элементов не только пробелами, но и запятыми.

Понятие о матричных операциях и магические матрицы

Наряду с операциями над отдельными элементами матриц и векторов система позволяет производить операции умножения, деления и возведения в степень сразу над всеми элементами, то есть над массивами. Для этого перед знаком операции ставится точка. Например, оператор * означает умножение для векторов или матриц, а оператор .* – поэлементное умножение всех элементов массива. Так, если M – матрица, то M.*2 даст матрицу, все элементы которой умножены на скаляр – число 2. Впрочем, для умножения матрицы на скаляр оба выражения – M*2 и M.*2 – оказываются эквивалентными.

Имеется также ряд особых функций для задания векторов и матриц. Например, функция magic(n) задает магическую матрицу размера n×n, у которой сумма всех столбцов, всех строк и даже диагоналей равна одному и тому же числу:

>> M=magic(4)

M =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

>> sum(M)

ans = 34 34 34 34

>> sum(M’)

ans = 34 34 34 34

>> sum(diag(M))

ans = 34

>> M(1,2)+M(2,2)+M(3,2)+M(4,2)

ans = 34

Уже сама по себе возможность создания такой матрицы с помощью простой функции magic заинтересует любителей математики. Но векторных и матричных функций в системе множество, и мы их детально рассмотрим в дальнейшем. Для стирания переменных из рабочей области памяти служит команда clear.

Конкатенация (объединение) матриц

Описанный способ задания матриц позволяет выполнить операцию конкатенации – объединения малых матриц в большую матрицу. Например, создадим вначале магическую матрицу размера 3×3:

>> A=magic(3)

A =

8 1 6

3 5 7

4 9 2

Теперь можно построить матрицу, содержащую четыре матрицы:

>> B=[A A+16;A+32 A+16]

B =

8 1 6 24 17 22

3 5 7 19 21 23

4 9 2 20 25 18

40 33 38 24 17 22

35 37 39 19 21 23

36 41 34 20 25 18

Полученная матрица имеет уже размер 6×6. Вычислим сумму ее столбцов:

>> sum(B)

ans = 126 126 126 126 126 126

Любопытно, что она одинакова для всех столбцов. А для вычисления суммы строк используем команду

>> sum(B.')

ans = 78 78 78 174 174 174

Здесь запись B.' означает транспонирование матрицы B, то есть замену строк столбцами. На этот раз сумма оказалась разной. Это отвергает изначально возникшее предположение, что матрица B тоже является магической. Для истинно магической матрицы суммы столбцов и строк должны быть одинаковыми:

>> D=magic(6)

D =

35 1 6 26 19 24

3 32 7 21 23 25

31 9 2 22 27 20

8 28 33 17 10 15

30 5 34 12 14 16

4 36 29 13 18 11

>> sum(D)

ans = 111 111 111 111 111 111

>> sum(D.')

ans = 111 111 111 111 111 111

Более того, для магической матрицы одинаковой является и сумма элементов по основным диагоналям (главной диагонали и главной антидиагонали).

Удаление столбцов и строк матриц

Для формирования матриц и выполнения ряда матричных операций возникает необходимость удаления отдельных столбцов и строк матрицы. Для этого используются пустые квадратные скобки – [ ]. Проделаем это с матрицей M: