Система математических расчетов MATLAB
p align="left"> function [varargout] = testvar2 (arrayin) for i = 1:nargout varargout {i} = arrayin (i, :) end Оператор присваивания в цикле for использует синтаксис индексации массивов ячеек. Вот пример применения функции testvar2: a = {1 2; 3 4 ; 5 6 ; 7 8; 9 0}; [p1, p2, p3, p4, p5] = testvar2 (a); Место функций varargin и varargout в списке аргументов Функции varargin или varargout должны быть последними в списке аргументов, при этом они могут быть расположены после любого числа входных или выходных переменных. Это значит, что в строке определения функции следует сперва указать требуемые входные или выходные аргументы. Например, следующие строки определения функций показывают правильное применение varargin и varargout. function [out1,out2] = example1(a,b,varargin) function [i,j,varargout] = example2(x1,y1,x2,y2,flag) Локальные и глобальные переменные Каждая исполняемая функция MATLAB-а, определенная некоторым М-файлом, имеет свои собственные локальные переменные расположенные в своем рабочем пространстве, которые отделены от локальных переменных других функций и переменных в основном рабочем про-странстве. Однако, если несколько функций и, возможно, основное рабочее пространство, объявляют некоторую конкретную переменную глобальной, то все эти функции и основное рабочее пространство будут иметь доступ к данной переменной. Любое изменение глобаль-ной переменной, произведенное в пространстве какой-либо одной функции, немедленно воспринимается всеми остальными функциями, где эта переменная объявлена глобальной. Допустим, вы хотите изучить эффект изменения коэффициентов взаимосвязей a-- и---- b, в диф-ференциальном уравнении Лотки-Вольтера (Lotka-Volterra), известного как модель хищника-жертвы. dy1/dt = y1 - ay1y2 dy2/dt = y2 - by1y2 Создадим М-файл lotka.m. function yp = lotka(t,y) global ALPHA BETA yp = [y(1) - ALPHA*y(1)*y(2); -y(2) + BETA*y(1)*y(2)]; Затем введем последовательно в командное окно следующие выражения global ALPHA BETA ALPHA = 0.01 BETA = 0.02 [t,y] = ode23('lotka',0,10,[1; 1]); plot(t,y) Объявление переменных ALPHA и BETA глобальными в командной строке позволяет ме-нять соответствующие значения внутри функции заданной файлом lotka.m. Интерактивное изменение данных переменных в командном окне приводит к получению новых решений без каких-либо редактирований текста файла. Для работы в ваших приложениях с глобальными переменными следует: q Объявить соответствующую переменную глобальной в каждой функции, где пре-дусмотрено ее использование. Для обеспечения доступа к глобальной переменной из командного окна нужно объявить данную переменную глобальной также и в командной строке. q В каждой функции объявите переменную глобальной до первого появления ее имени в тексте файла. Обычно рекомендуется объявлять переменные глобальными в начале М-файла. Глобальные переменные в MATLAB-е обычно имеет более длинные имена и иногда записы-ваются заглавными буквами.Это не является настоятельным требованием, но упрощает чте-ние файлов и уменьшает риск случайного изменения глобальной переменной. Перманентные переменные (Persistent Variables) Переменная может быть объявлена перманентной (постоянной) - при этом она не меняет своего значения между ее последовательными вызовами. Перманентные переменные могут быть использованы только в пределах определенной функции. Эти переменные остаются в памяти до удаления М-файла из памяти или его изменения. Во многих отношениях перма-нентные переменные аналогичны глобальным, за тем исключением, что их имя не находится в глобальном рабочем пространстве, а их значение сбрасывается при изменении М-файла или удаления из памяти. Для работы с перманентными переменными в MATLAB-е предусмотрены три функции: |
Функция | Описание | | mlock | Исключает возможность удаления М-файла из памяти | | munlock | Возвращает М-файлу возможность его удаления из памяти | | mislocked | Указывает, может ли М-файл быть удален из памяти | | |
Специальные переменные Несколько функций возвращают важные специальные значения, которые вы можете исполь-зовать в ваших М-файлах. |
Функция | Возвращаемое значение | | ans | Последний ответ (переменная). Если вы не присваиваете выходной переменной или вычисляемому выражению какое-либо имя, MATLAB автоматически запоминает результат в переменной ans. | | eps | Относительная точность вычислений с плавающей запятой. Это допуск, который MATLAB использует при вычислениях. | | realmax | Наибольшее число с плавающей запятой. | | realmin | Наименьшее число с плавающей запятой. | | pi | 3.1415926535897... | | i, j | Мнимая единица. | | inf | Бесконечность. Вычисления вида n/0 где n - любое ненулевое реально число, дает в результате inf. | | NaN | Не численное значение (Not-a-Number). Выражения вида 0/0 и inf/inf дают в результате NaN, так же как и арифметические операции содержащие NaN. Выражения типа n/0, где n явля- ется комплексным числом, также возвращают NaN. | | computer | Тип компьютера. | | version | Строка, содержащая версию MATLAB-а. | | |
Вот несколько примеров, где используются эти переменные. x = 2*pi; A = [3 + 2i 7 - 8i]; tol = 3*eps; Типы данных Всего в MATLAB -е имеется 14 базовых типов (или классов) даных. Каждый из этих типов данных является формой массива. Этот массив может иметь минимальный размер 0х0 и мо-жет иметь произвольную размерность по любой координате. Двумерные варианты таких массивов называются матрицами.Все 14 базовых класса типов данных показаны на приве-денной ниже диаграмме. Дополнительно, тип данных, определенных пользователем, пока-занный ниже как user class (класс пользователя), является подмножеством данных типа структуры. Тип данных char содержит символы данные в коде Unicode. Строка символов является про-сто массивом символов размера 1хn. array of characters. Вы можете использовать тип данных char для хранения массивов строк, при условии, что все строки массива имеют одинаковую длину (это является следствием того, что все массивы MATLAB-а должны быть прямоуголь-ными). Для хранения массива строк разной длины нужно использовать массив ячеек. Числовые типы данных включают целые числа со знаком и без знака, числа в формате пла-вающей запятой одинарной и двойной точности, и разреженные массивы (sparse arrays) двойной точности. Сказанное ниже сохраняется в силе для всех типов числовых данных в MATLAB-е: q Все вычисления в MATLAB-е выполняются с двойной точностью. q Целые числа и числа одинарной точности обеспечивают более эффективное использование памяти по сравнению с числами двойной точности. q Все типы данных поддерживают базовые операции над массивами, такие как исполь-зование индексов и измерение размеров массива. q Для выполнения математических операций над целыми числами или массивами с оди-нарной точностью представления, вы должны первратить их в массивы с двойной точ-ностью при помощи функции double. Операторы Операторы системы MATLAB делятся на три категории: q Арифметические опреаторы, осуществляющие численные вычисления. q Операции отношения, которые осуществляют численное сравнение операндов. q Логические операторы, включающие AND (логическое И), OR (логическое ИЛИ), и NOT (логическое отрицание НЕ). Арифметческие операторы MATLAB обеспечивает следующие арифметические операторы |
Операторы | Описание | | + | Сложение | | - | Вычитание | | .* | Умножение | | ./ | Правое деление | | .\ | Левое деление | | + | Унарный плюс (изменение знака объекта) | | - | Унарный минус | | : | Оператор двоеточия | | .^ | Степень | | .' | Транспонирование | | ` | Комплексно-сопряженное транспонирование | | * | Матричное умнжение | | / | Матричное правое деление | | \ | Матричное левое деление | | ^ | Степень матрицы | | |
Арифметические операторы и массивы За исключением некоторых матричных операторов, арифметические операторы MATLAB-а работают с соответствующими элементами массивов одинаковой размерности. Для векторов и прямоугольных массивов, оба операнда должны иметь одинаковый размер, или же один из них должен быть скаляром. Если один операнд является скаляром, а второй - нет, MATLAB применяет данный скаляр ко всем элементам второго операнда; данное свойство известно как скалярное расширение (scalar expansion). Следующий пример иллюстрирует свойство скалярного расширения при вычислении произ-ведения скалярного опренда и матрицы A = magic(3) A = 8 1 6 3 5 7 4 9 2 Введем 3 * A что дает ans = 24 3 18 9 15 21 12 27 6 Операторы отношения MATLAB обеспечивает следующие операторы отношения |
Операторы | Описание | | < | Меньше чем | | <= | Меньше чем или равно | | > | Больше чем | | >= | Больше чем или равно | | == | Равно | | ~= | Не равно | | |
Операторы отношения и массивы Операторы отношения в MATLAB-е сравнивают соответствующие элементы двух массивов с одинаковыми размерностями. Эти операторы всегда действуют поэлементно. В приведен-ном ниже примере, результирующая матрица показывает, где элемент матрицы A равен со-ответствующему элементу матрицы B. A = [2 7 6; 9 0 5; 3 0.5 6]; B = [8 7 0; 3 2 5; 4 -1 7]; A == B ans = 0 1 0 0 0 1 0 0 0 Для векторов и прямоугольных массивов, оба операнда должны иметь одинаковый размер или один из них должен быть скаляром. В случае когда один операнд является скаляром, а второй - нет , MATLAB проверяет данный скаляр с каждым элементом другого операнда. Те положение, где заданное отношение является истинным, принимают значение 1. Положение, где отношение является ложным, принимают значение 0. Операторы отношения и пустые массивы Операторы отношения работают и с массивами, у которых какая-либо размерность равна ну-лю (что приводит к пустому массиву), если оба массива имеют одинаковый размер или же один из них является скаляром. Однако, выражения вида A == [ ] приводят к ошибке, если только массив А не имеет размеры 0х0 или 1х1. Для проверки явля-ется ли данный массив пустым, следует использовать специальную функцию isempty(A). Логические операторы MATLAB обеспечивает следующие логические операторы |
Оператор | Описание | | & | AND (логическое И) | | | | OR (логическое ИЛИ) | | ~ | NOT (логическое НЕ) | | |
Внимание ! В дополнение к этим логическим операторам, в директории ops имеются нес-колько функций, предназначенных для побитовых (поразрядных) логических операций. Каждый логический оператор имеет специфичный набор правил, которые определяют резу-льтат логического выражения: q Выражения использующие оператор И (&), истинны, если истинны оба операнда. При численных элементах, выражение является истинным, если оба операнда ненулевые. Следующий пример показывает операцию логического И для двух векторов u = [1 0 2 3 0 5]; v = [5 6 1 0 0 7]; u & v ans = 0 0 1 0 0 1 q Выражения, использующие оператор ИЛИ ( | ), являются истинными если один из операндов является истинным. Выражения с ИЛИ являются ложными только если ло-жными являются оба операнда. При численных элементах, выражение является лож-ным, елси только оба операнда равны нулю. Для приведенных выше векторов u и v имеем u | v ans = 1 1 1 1 0 1 q Выражения, использующие оператор ~ выполняют логическое отрицание. Это дает ложный результат, если операнд является истинным и истинный, если операнд явля-ется ложным. При численных элементах, любой ненулевой операнд становится нулев-ым (логическим нулем), а любой нулевой элемент становится равным (логической) единице. Рассмотри операцию логического отрицания вектора u ~u ans = 0 1 0 0 1 0 Использованием логических операторов с массивами Логические операторы MATLAB-а сравнивают соответствующие элементы массивов одина-ковой размернсти. Для векторов или прямоугольных массивов, оба операнда должны иметь одинаковый размер, или один из них должен быть скаляром. Если один из элементов являе-тся скаляром, а второй - нет, то здесь также имеет место описанное выше свойство скалярно-го расширения. Логические функции В дополнение к логическим операторам, MATLAB имеет ряд логических функций. |
Функция | Описание | Примеры | | xor | Выполняет операцию исключающего ИЛИ над своими операндами. При числовых элементах, функция возвращает 1 если один из операндов ненулевой, а второй - нулевой | a = 1; b = 1; xor(a,b) ans = 0 | | all | Возвращает 1, если все элементы ее аргумента являются истинными или не равны нулю; в противном случае результат равен логическому нулю. Над матрицами функция all работает вдоль столбцов | A = [0 1 2; 3 5 0] A = 0 1 2 3 5 0 all(A) ans = 0 1 0 | | any | Возвращает единицу, если любой из аргументов является истинным или ненулевым; в против-ном случае вовращает 0. Как и all , any работает вдоль столбцов матриц. | v = [5 0 8]; any(v) ans = 1 | | |
Ряд других функций MATLAB-а выполняет логические операции. Например, функция isnan возвращает 1 для NaN; функция isinf возвращает 1 для Inf. Более подробный список можно найти в директории ops. Логические выражения использующие функцию find Функция find определяет индексы числового массива, удовлетворяющие заданному логичес-кому условию. Эта функция удобна для создания логических масок (шаблонов) и матриц ин-дексов. В наиболее общей форме, функция find возвращает единственный вектор индексов. Этот вектор может быть использован для индексации массивов любого размера или формы. Например, в приведенном ниже примере функция find позволяет легко заменить все элемен-ты матрицы А больше 8 на число 100: A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 i = find (A > 8); A(i) = 100 A = 100 2 3 100 5 100 100 8 100 7 6 100 4 100 100 1 Вы можете также использовать функцию find для получения обеих индексов строк и стол-бцов прямоугольных матриц, удовлетворяющих заданному логическому условию (более под-робно эта функция описана в справочниках). Приоритеты операторов Вы можете строить выражения, использующие любую комбинацию арифметических и логи-ческих операторов, а также операторов отношения. Уровни приоритетов этих операторов определяют порядок, в котором MATLAB обрабатывает выражение. В пределах каждого уровня приоритета, операторы имеют одинаковый приоритет и оцениваются (обрабатыва-ются) слева направо. Последовательность приоритетов для операторов MATLAB-а приве-дены ниже, упорядоченные в порядке убывания приоритетов, то есть от высшего приоритета к низшему. 1. Обычные скобки (). 2. Транспонирование (.'), степень (.^), комплексно-сопряженное транспонирование('), степень матрицы(^). 3. Унарный плюс (+), унарный минус (-), логическое отрицание (~). 4. Умножение (.*), правое деление (./), левое деление(.\), матричное умножение (*), матричное правое деление (/), матричное левое деление (\). 5. Сложение (+), вычитание (-). 6. Оператор двоеточия (:). 7. Меньше чем (<), меньше чем или равно (<=), больше чем (>), больше чем или равно (>=), равно (==), не равно (~=). 8. Логическое И (&). 9. Логическое ИЛИ (|). Изменение приоритетов операторов Имеющаяся последовательность приоритетов может быть изменена путем использования обычных скобок, как это показано в следующем примере. A = [3 9 5]; B = [2 1 5]; C = A ./ B.^2 C = 0.7500 9.0000 0.2000 C = (A. / B) .^2 C = 2.2500 81.0000 1.0000 Выражения могут также содержать переменные, заданные посредством индексов b = sqrt (A(2)) + 2*B(1) b = 7 Команды управления данными (Flow Control) В MATLAB-е имеются 8 базовых команд для управления потоками данных: * if, совместно с else и elseif, осуществляет обработку группы выражений, основываясь на некотором логическом условии. * switch, совместно с case и otherwise, обрабатывает различные группы выражений, основы- ваясь на значении некоторого логического условия. * while осуществляет обработки группы выражений неопределенное число раз, основываясь на некотором логическом условии. * for осуществляет обработку группы выражений определенное (заданное) число раз. * continue передает управление к следующей итерации в циклах for или while , пропуская все оставшиеся выражения в теле цикла. * break прекращает обработку выражений и выходит из циклов, созданных командами for или while. * try...catch изменяет последовательность выполнения команд, если во время выполнения программы получено сообщение об ошибке. * return приводит к прекращению выполнения данной программы и к возврату в вызываю- щую функцию. Все конструкции программ, основанные на логических условиях, используют команду end для указания конца соответствующего блока. Внимание! Во многих случаях вы можете ускорить выполнение программ MATLAB-а, путем замены циклов с командами for и while векторными выражениями (см. ниже). Команды if, else, and elseif Команда if оценивает логическое выражение и обрабатывает группу операторов, основыва-ясь на значении указанного выражения. В свое простейшей форме синтаксис команды имеет вид if (логическое выражение)logical_expression операторы end Если логическое выражение истинно, то есть равно 1, MATLAB выполняет все операторы между строками, содержащими команды if и end . После этого он продолжает выполнять ко-манды. находящиеся за строкой с end. Если логическое выражение ложно, то есть дает логи-ческий 0, MATLAB перескакивает через все выражения между строками с if и end , и про-должает свою работу со строки, следующей за командой end. Например, if rem (a,2) == 0 disp('a is even') b = a/2; end Данный блок проверяет, является ли входной аргумент четным числом и, если да, то выводит в комндную строку соответствующее сообщение и делить число а пополам. В противном случае, данный блок не выполняется. Между строками с if и end вы можете включить произ-вольное число операторов, содержащих, в свою очередь, любые команды и циклы. Если ло-гическое выражение приводит к нескалярной величине, то для выполнения блока все элемен-ты аргумента должны буть ненулевыми. Например, допустим X является матрицей. Тогда выражение if X операторы end эквивалентно следующему if all(X(:)) операторы end При использовании с if , команды else и elseif дают следующие дополнительные возможно-сти создания программ: * Команда else не имеет логического условия. Операторы, связанные с данной командой вы- полняются, если предшествующее условие команды if (и, возможно, elseif) является лож- ным. * Команда elseif имеет логическое условие, которое оценивается, если предшествующее ус- ловие команды if (и, возможно, elseif), является ложным. Если логическое условие данной команды elseif является истинным, то выполняются соответствующие операторы, следую- щие за данной командой. Вы можете иметь произвольное число команд elseif в пределах одного блока с if. if n < 0 % Если n отрицательно, дать сообщение об ошибке disp('Input must be positive'); elseif rem (n, 2) == 0 % Если n положительно и четно, разделить на 2. A = n/2; else A = (n+1) /2; % Если n положительно и нечетно, прибавить 1 и % разделить на два. end Команда if и пустые массивы Если логическое условие, связанное с if, приводит к нулевому массиву, то оно оценивается как ложное. Например, если А является пустым массивом, то следующий блок if A S1 else S0 end выполняет оператор S0. Команда switch Команда switch осуществляет обработку определенных операторов, исходя из значения пере-менной или выражения. Ее базовая форма имеет вид switch выражение (скаляр или строка символов) case значение 1 операторы % Выполняются если выражение == значение 1 case значение 2 операторы % Выполняются если выражение == значение 2 . . . otherwise операторы % Выполняются если выражение не соответствует не одному % значению, связанному с командами case end Данный блок состоит из: * Слова switch за которым следует выражение которое нужно оценить.. * Любого числа блоков с командами case. Эти блоки состоят из слова case, за которым на той же строке следует возможное значение выражения за словом switch. Последующие строки содержат операторы, которые необходимо выполнить при указанном значении выражения в первой строке за словом switch. Эти строки могут быть любыми допустимыми выражени-ями, включая другие циклы switch. Выполнение группы операторов, связанных с данной ко-мандой case прекращается, когда MATLAB встречает следующую команду case или слово otherwise. Отметим, что всегда выполняется только первый подходящий блок с case.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
|