Устранение ошибки наиболее целесообразно не путем набора нового правильного выражения, а редактированием ошибочного.
Существует несколько способов возврата в строку ввода ранее введенных команд.
Первый способ – с помощью клавиш <↑> и <↓>
Второй способ – копирование из окна Command History.
Если в окне Command History дважды щелкнуть левой кнопкой мыши на какой - либо команде, эта команда будет выполнена. Это равнозначно вводу данной команды в командное окно и последующему нажатию клавиши < Enter> (рис. 4).
Если щелкнуть на какой - либо команде окна Command History левой кнопкой мыши, то данная команда становится текущей (на синем фоне). Можно выделить нужную последовательность команд при помощи комбинации клавиш <Shift>+<↑>, <Shift>+<↓>. При щелчке правой кнопкой мыши на выделенной области окна Command History появляется всплывающее меню. Выбор пункта Copy приводит к копированию выделенной последовательности в буфер обмена Windows. При щелчке правой кнопкой мыши на области окна Command Window появляется всплывающее меню. Выбор пункта Paste приводит к вставке скопированной последовательности команд в командную строку. Весь вставленный в командную строку набор команд отправляется на выполнение нажатием клавиши < Enter>.
Третий способ – копирование из содержимого текстового поля рабочего окна.
В текстовом поле можно выделить с помощью мыши любую команду и копировать ее в буфер обмена операционной системы Windows, а затем вставить в командную строку.
При вычислениях любое арифметическое выражение набирается с клавиатуры в командной строке. Редактор MATLAB укажет на синтаксические ошибки. Надо отличать предупреждение об ошибке от сообщения о ней. Предупреждения (обычно после слова Warning) не останавливают вычисления и лишь предупреждают о том, что ответ может быть ошибочным.
При сообщении об ошибке красного цвета (после знаков???) MATLAB не выдает решение.
Но он не обнаружит так называемые семантические (смысловые) ошибки.
Придадим арифметическому выражению F статуса символьного с помощью команды sym (F=sym()). Выведенное в командное окно символьное выражение F синтаксически совпадает с арифметическим.
Далее команда pretty(F) выводит в командное окно символьное выражение F в виде, близком к математической формуле. Выведенная и исходная формулы не совпадают. После исправления ошибок вновь выведем pretty(F) для проверки.
Команда очистки экрана clc
>> clc
стирает содержание командного окна MATLAB и размещает символ приглашения >> в левом верхнем углу пустого экрана.
Эта команда, однако, оставляет неизменным содержимое окон Command History и Workspase. Поэтому в «чистом» командном окне можно пользоваться значениями переменных, полученных до ввода команды clc.
MATLAB запоминает значения всех переменных, определенных во время сеанса работы, даже если применена команда очистки экрана clc.
Получить справку о команде можно используя справочную информацию команды help.
3. Хотя задавать вещественные числа можно в любой из указанных выше форм, на машинном уровне системы MATLAB они представляются в форме с мантиссой и показателем степени. Этот основной тип данных называется double (формат с двойной точностью). Он задается по умолчанию, и даже целые числа представляются системой MATLAB на машинном уровне в той же форме, что и дробные числа.
В MATLABтакже существует тип данных single, который снижает требования к памяти в два раза (под мантиссу и показатель степени отводится 4 байта). Но при сложных вычислениях в этом случае возрастает вероятность получить результат с большой погрешностью.
Существуют и целые типы данных: int8, uint8, int16, uint16, int32, uint32, int64, uint64. Под них отводится 8, 16, 32 и 64 байта соответственно.Буква u соответствует беззнаковым типам данных с диапазоном от 0 до некоторого максимального положительного значения.
Для того чтобы переменная получила тип данных, отличный от double, применяется явный квалификатор, совпадающий с названием типа.
Например,
>> x=int32(3.2)
определяет переменную целого типа int32.
По завершении сеанса работы с системой MATLAB все использованные переменные теряются. Чтобы сохранить содержимое рабочего пространства в файле на диске компьютера, надо выполнить команду меню File│Save Workspace As…
Начиная с версии 6.0, в MATLAB появилось удобное средство для просмотра переменных рабочей среды – окно Workspace, которое активизируется с помощью команды View => Workspace меню командного окна. Окно Workspace содержит таблицу, аналогичную той, что выводится командой whos.
При щелчке правой кнопкой мыши на строке с именем переменной, в окне Workspace появляется всплывающий список команд. Команды списка позволяют переименовать переменные, удалить лишние, сохранить рабочую среду и т. д. Так, щелчок на строке с именем команды Open (Открыть) приводит к отображению этой переменной в окне Array Editor.
4. Двойной щелчок левой кнопкой мыши на строке с именем переменной в окне Workspace отображает в отдельном окне редактора массивов Array Editor ее матричное представление.
В окне Array Editor в соответствующих полях задается размер матрицы – число ее строк и столбцов – и далее вводятся числа, выражения, переменные и функции в отдельные клетки появившейся таблицы. Этот способ обеспечивает быстрый доступ к элементам матрицы и позволяет их вводить или редактировать в произвольном порядке.
Один из способов формирования векторных и матричных массивов состоит в создании пустого массива размера 0×0, который затем заполняется с использованием редактора массивов Array Editor.
>> M=[]
M =
[]
5. К матричным действиям с матрицами относятся такие операции, которые используются в матричном исчислении в математике. Базовые действия с матрицами (векторами): сложение, вычитание, транспонирование, умножение матрицы на число, умножение матрицы на матрицу, возведение квадратной матрицы в степень – осуществляются в MATLAB с помощью обычных знаков арифметических операций. Условия, при которых эти операции возможны, таковы:
при сложении или вычитании матриц они должны иметь одинаковые размеры;
при умножении матриц число столбцов первого множителя должно совпадать с числом строк второго множителя.
Невыполнение этих условий приводит к появлению сообщения об ошибке.
Пример транспонирования матрицы, при котором ее строки становятся столбцами, а столбцы – строками, осуществляется с помощью оператора <'> (апостроф):
>> disp(A')
Скалярное произведение двух векторов вычисляет команда dot:
>> s=dot(x,y)
s =
Векторное произведение. Для трехкомпонентных векторов в MATLAB существует команда cross, которая вычисляет векторное произведение двух векторов.
Команда det(B) вычисляет определитель│ B │ квадратной матрицы B.
>> d=det(B)
Команда обращения матрицы inv(B) вычисляет матрицу В-1, обратную заданной матрице B. Исходная матрица B должна быть квадратной, и ее определитель не должен быть равен нулю.
Если требуется извлечь квадратный корень из матрицы, то лучше применить матричную функцию sqrtm. Матричные экспонента и логарифм вычисляются при помощи матричных функций expm и logm.
Кроме поэлементного преобразования матриц с помощью математических функций, в MATLAB можно выполнять поэлементные преобразования матриц с помощью арифметических операций. К таким операциям относятся операции поэлементного умножения с помощью оператора <.*> (без пробела между точкой и звездочкой), поэлементного деления <./>, обратного поэлементного деления <.\>, поэлементного возведение в степень <.^>. Операции поэлементного преобразования матриц выполняются только над матрицами одинакового размера и типа.
6. В MATLABвводятся две новых операции (они не относятся к операциям линейной алгебры) деления матриц слева направо и справа налево. Первая операция записывается при помощи знака < / >, а вторая – при помощи знака < \ >, которые помещаются между именами двух матриц – делимого и делителя. Операция B/A эквивалентна операции B*inv(A) и ее удобно использовать для решения матричного уравнения
X*A = B,
а A \ B эквивалентна inv(A)*B и является решением матричного уравнения
A*X = B.
Пример:
Пусть дана система линейных уравнений
Решить систему с применением оператора обратного деления матриц < \ >.
Решение:
В матричной записи система имеет вид Ах = b, где
A =, b =, х =
– соответственно матрица из коэффициентов при неизвестных, вектор-столбец из свободных членов и вектор-столбец из неизвестных.
Введем матрицу А и вектор-столбец свободных членов b:
>> А=[1 3 0;-2 -2 5;1 0 -5]
А =
1 3 0
-2 -2 5
1 0 -5
>> b=[-2;10;-9]
b =
-2
-9
Известно, что система имеет единственное решение, если определитель матрицы А не равен нулю (│ A │ = det (A) ≠ 0). Вычислим определитель матрицы А:
>> disp(det(A))
-5
Определитель не равен нулю. Находим решение системы с помощью оператора обратного деления матриц < \ >:
>> x=А\b
x =
-1
Проверим полученное решение x1 = 1, x2 = -1, x3 = 2 подстановкой в систему уравнений:
>> disp(A*x)
-2.0000
10.0000
-9.0000
В результате проверки получен вектор-столбец свободных членов.
7. Символ <:> (двоеточие) дает возможность простого создания векторов, каждый элемент которых отличается от предшествующего на постоянную величину (шаг или приращение). Шаг может быть и отрицательным. Например:
>> V=-0.1:0.3:1.4
Длинный вектор можно вводить частями, которые затем объединяются с помощью операции сцепления строк:
>> V1=[1 2 3];V2=[4 5 6];
>> V=[V1 V2]
V =
1 2 3 4 5 6
Для создания нового вектора из определенных в заданном порядке элементов другого вектора применяется индексация при помощи вектора. Запись в вектор W пятого, второго, первого и третьего элементов вектора V производится следующим образом:
>> ind=[5 2 1 3];
>> W=V(ind)
W =
5 2 1 3
Пусть в векторе из девяти элементов требуется заменить нулями элементы с третьго по седьмой. Эту задачу легко решить индексацией с помощью двоеточия.
Например:
>> P=[-1 0.1 2.2 3.4 5.6 3.1 6.8 9.7 5.5];
>> P(3:7)=0
8. ВMATLAB предусмотрены команды для создания векторов и матриц специального вида. Рассмотрим некоторые из них:
zeros(M,N) – создает матрицу размером M×N c нулевыми элементами:
>> zeros(3,4)
ones(M,N) – создает матрицу размером M×N c единичными элементами:
>> ones(3,4)
eye(M,N) – создает матрицу размером M×N c единицами по главной диагонали и остальными нулевыми элементами:
>> eye(3,4)
rand(M,N) – создает матрицу размером M×N из случайных чисел, равномерно распределенных в диапазоне от 0 до 1:
>> rand(3,4)
randn(M,N) – создает матрицу размером M×N из случайных чисел, распределенных по нормальному закону с нулевым математическим ожиданием и стандартным (среднеквадратическим) отклонением, равным единице 1:
>> randn(3,4)
Для всех перечисленных команд можно задавать один аргумент M в случае квадратной матрицы (M=N):
>> eye(3)
rot90 – осуществляет разворот матрицы на 90o против часовой стрелки:
>> Q=[1 2;3 4]
>> R=rot90(Q)
D=diag(V) – диагональная матрица, элементы которой задаются во входном аргументе - векторе V;
D=diag(V,k) – диагональная матрица со смещенной на k позиций диагональю (положительные k – смещение вверх, отрицательные – вниз), результатом является квадратная матрица размера length(V)+abs(k);
d=diag(A) – выделение главной диагонали из матрицы A в вектор d;
d=diag(A,k) – выделение k -ой диагонали из матрицы A в вектор d.
9. «Расширять» матрицу, составляя ее из отдельных заданных матриц («блоков»), можно тоже довольно просто. Если заданы несколько матриц - блоков A1, A2,…,AN с одинаковым числом строк, то из них можно «слепить» единую матрицу А, объединяя блоки в одну «строку» операцией горизонтального сцепления A= [ A1,A2,…,AN ]. Аналогично вертикальное сцепление матриц можно реализовать при условии, что все составляющие блоки - матрицы имеют одинаковое число столбцов, применяя для отделения блоков вместо запятой точку с запятой: A= [ A1;A2;…,AN ].
10. В MATLAB мы будем использовать как встроенные функции, так и свои собственные функции. Собственные функции можно задавать в отдельных файлах, которые называются M-файлами. function d=rad(x,y,z)
%Вычисление длины d=sqrt(x^2+y^2+z^2) радиус-вектора точки (x;y;z)
d=sqrt(x^2+y^2+z^2);
Структура M-файлов-функций следующая.
Первая строка в M-файле-функции называется строкой определения функции и начинается со слова function. В окне редактора M-файлов это зарезервированное слово выделяется синим цветом. Первая строка M-файла задает имя функции, а также количество аргументов (или параметров) ввода и вывода. В этом примере функция называется rad. Имя файла (за исключением расширения .m) и имя функции должны совпадать. Когда вы создаете этот новый M-файл-функцию в безымянном окне редактора и выбираете команду Save (Сохранить), модуль Editor (Редактор) сам присваивает файлу имя rad.m. Функция в нашем примере имеет для ввода три элемента, которые внутри M-файла обозначены как x, y, z. В качестве результата возращаетсяодин элемент – значение d, появляющееся в конце выполнения функции.
За строкой определения функции может следовать несколько строк - комментариев, начинающихся со знака процента %. Эти строки называются текстом справки об используемой функции и отображаются при вводе команды help. В M-файле rad.m присутствует только одна строка текста справки; она отображается при введении команды help rad.
11. Передача информации из командного окна MATLAB в файл-функцию осуществляется с помощью параметров функции. Другой механизм передачи информации – глобальные переменные. Файл-функция может и не иметь входных или выходных параметров, заголовки таких файл-функций приведены ниже:
function noout(a,b), function [v,u]=noin, function noarg().
Для того чтобы рабочая область MATLAB и файл-функция могли совместно использовать некоторую переменную с заданным именем, ее всюду нужно объявить как глобальную с помощью команды global.
Приведем пример файл-функции rad3 без входных параметров:
function [d,d2]=rad3
global x y z
d2=x^2+y^2+z^2;
d=sqrt(d2);
Вызов ее осуществляется следующим образом:
>> global x y z
>> x=2;y=3;z=4;
>> [m,n]=rad3
m =
5.3852
n =
Переменные, которые используются в файл-функции, такие как x, y, z и d в файле rad.m, являются локальными переменными. Запуск M-файла-функции не задает эти переменные в рабочей области и не изменяет их параметры, если переменные с такими же именами в рабочей области были заданы ранее. Система MATLAB не запоминает значения этих переменных после того, как M-файл-функция будет выполнен, а область оперативной памяти, в которой они хранились, освобождается.
12. Операторы отношения служат для поэлементного сравнения двух операндов, в качестве которых могут выступать числа, векторы или матрицы. При этом сравниваемые векторы или матрицы должны иметь одинаковые размеры. Если операнды одинаковы, то программа возвращает 1 (True – Истина), в противном случае – 0 (False – Ложь). Перечень операторов отношения с соответствующими им функциями представлен в таблице 4.1.
Оператор | Название | Функция |
== | Равно | Eq |
~= | Не равно | Ne |
< | Меньше | Lt |
> | Больше | Gt |
<= | Меньше или равно | Le |
>= | Больше или равно | Ge |
Таблица 4.3. Логические операторы и их функции
Оператор | Название | Функция |
& | Логическое И | And |
| | Логическое ИЛИ | Or |
Отсутствует | Исключающее ИЛИ | Xor |
~ | Логическое НЕ | Not |
Первые три операции являются двухоперандными (бинарными), а операция < Не > является унарной (однооперандной).
Приоритеты операций системы MATLAB в порядке убывания приведены ниже:
1. Круглые скобки < () >.
2. Транспонирование < .' >, транспонирование с комплексным сопряжением< ' >, возведение в степень < ^ >, поэлементное возведение в степень < .^ >.
3. Унарный плюс <+>, унарный минус <–>, логическое отрицание <~>.
4. Умножение и деление (в том числе поэлементное) < * >, < / >, < \ >, < .* >, < ./ >, < .\ >.
5. Сложение <+> и вычитание <–>.
6. Операции отношения <, <=, >, >=, ==, ~=.
7. Логическое И < & >.
8. Логическое ИЛИ <|>.
13. Цикл for используется для повторения команды или набора команд в случае, когда число повторений заранее известно. Синтаксис цикла for имеет следующий вид:
for var = b1:b2:b3
Команды (текст программы)
End
Здесь var – переменная (счетчик) цикла, которая при каждом повторении цикла изменяется от начального значения b1 до конечного значения b3 с шагом b2 (если параметр b2 не указан, по умолчанию его значение принимается равным 1). Переменная цикла может принимать не только целые, но и вещественные значения с любым знаком. Команды в тексте программы разделяются запятой <, >, точкой с запятой <; > или нажатием клавиши <Enter>. Ввод команд завершается командой end. Цикл завершается, как только значение var превысит b3.
В том случае, когда число повторений заранее неизвестно и определяется в ходе выполнения набора команд, следует организовать цикл while. Цикл while работает, пока выполнено условие цикла.
Пример файл-функции polsum, которая находит сумму всех первых положительных элементов вектора:
function s=polsum(x)
s=0;
k=1;
while x(k)>0
s=s+x(k);
k=k+1;
end
14. Ветвление в ходе работы программы осуществляется при помощи конструкции if-elseif-else. Самый простой вариант ее использования (без elseif и else) реализован в файл-функции possum, которая предназначена для нахождения суммы всех элементов вектора, больших 2:
Если ход программы должен изменяться в зависимости от нескольких условий, то следует использовать полную конструкцию if-elseif-else. Каждая из ветвей elseif в этом случае должна содержать условие выполнения набора команд, размещенных после нее. Важно понимать, что условия проверяются подряд, первое выполненное условие приводит к работе соответствующего набора, выходу из конструкции if-elseif-else и переходу к команде, следующей за end. У последней ветви else не должно быть никакого условия. Команды, находящиеся между else и end, выполняются в том случае, если все условия оказались невыполненными.