Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1-2 Моделирование / Matlab. Практический подход. Самоучитель

.pdf
Скачиваний:
763
Добавлен:
31.01.2021
Размер:
12.72 Mб
Скачать

Глава 3. Элементы программирования

Практически так же легко определяется и функция, возвращающая результат. Рассмотрим следующий программный код m-файла:

function y=Sinus(x) y=sin(x)./x;

end

На рис. 3.9 представлен редактор m-файлов с кодом функции Sinus().

Рис. 3.9. Окно редактора m-файлов с кодом функции Sinus()

В данном случае функция называется Sinus() и имеет один аргумент, который в программном коде обозначен как x. Результат имеет название y и вычисляется согласно соотношению y=sin(x)./x. Очевидно, что в данном случае речь идет о зависимости вида y(x) = sin(x x) . Обращаем внима-

ние, что при делении использован оператор ./, что позволяет в качестве аргумента использовать не только скаляр, но и матрицу (список значений аргумента). Ниже приведен пример вызова созданной функции (жирным шрифтом выделен ввод пользователя):

>>Sinus(pi/4) ans =

0.9003

>>Sinus([pi/4 pi/3 pi/2 pi]) ans =

0.9003

0.8270

0.6366

0.0000

>> Sinus([pi/4 pi/3;pi/2 pi]) ans =

0.9003 0.8270

0.6366 0.0000

Видим, что результат одинаково хорошо вычисляется как для скалярного, так и для матричного аргумента функции. При этом результатом является массив той же размерности, что и массив-аргумент. На рис. 3.10 показано окно рабочего документа с результатом выполнения приведенных выше команд.

Еще раз обращаем внимание читателя: несмотря на то, что аргументом функции может передаваться матрица, и такого же размера матрица воз-

111

Самоучитель Matlab

Рис. 3.10. Результат использования функции пользователя Sinus()

вращается как результат, у функции один аргумент и одно значение возвращается в качестве результата – просто эти значения могут быть матрицами. Это принципиально отличная ситуация от случая, когда у функции несколько аргументов и/или несколько значений возвращаются в качестве результата. Пример такой функции приведен в документе на рис. 3.11.

Рис. 3.11. Окно редактора m-файлов с кодом функции SpherCoords()

Окно редактора m-файлов содержит следующий код функции пользователя:

function [x,y,z]=SpherCoords(r,phi,theta) x=r*sin(theta)*cos(phi); y=r*sin(theta)*sin(phi);

z=r*cos(theta); end

112

Глава 3. Элементы программирования

В данном случае речь идет, очевидно, о функции для выполнения преобразования сферических координат r , ϕ и θ в декартовые x , y и z по формулам x = r sin(θ)cos(ϕ), y = r sin(θ)sin(ϕ) и z = r cos(θ). Полярные координаты точки передаются в качестве аргумента функции, а декартовые координаты возвращаются в качестве результата. На рис. 3.12 приведен пример использования функции SpherCoords() для выполнения преобразования одних координат в другие.

Рис. 3.12. Пример использования функции SpherCoords()

Если при вызове функции ее результат записывается в скалярную переменную, как, например, в команде x=SpherCoords(1,pi/3,pi/4), то соответствующая переменная получит в качестве значения первый элемент из списка результатов. В результате выполнения команды [x,y,z]=SpherCoords(1, pi/3,pi/4) значения получают все три переменные, указанные в списке, которому присваивается значение.

В программных кодах m-файлов могут использоваться комментарии. Комментарий предназначен исключительно для программиста (или пользователя) и при обработке кода игнорируется. Начинается комментарий со знака процента (то есть %). Все, что находится после знака процента, рассматривается как комментарий.

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

113

Самоучитель Matlab

по программному коду (функции) этого m-файла. На рис. 3.13 окно редактора m-файлов с кодом функции, у которой имеется комментарий в начале программного кода.

Рис. 3.13. Окно с кодом функции и комментарием

В программном коде определена функциональная зависимость

f (x) = exp(x) −1 . Функция называется mExp(), и программный код для x

ее реализации (вместе с комментарием):

%В качестве значения для аргумента x функцией

%возвращается выражение (exp(x)-1)/x function y=mExp(x)

y=(exp(x)-1)/x; end

Для того чтобы получить справку по функции (в том числе и функции, созданной пользователем), достаточно в командной строке ввести ключевое слово help, после которого вводится имя функции, и с помощью клавиши <Enter> соответствующая команда выполняется. На рис. 3.14 показан результат применения этой процедуры по отношению к созданной функции.

Рис. 3.14. Справка для функции пользователя

114

Глава 3. Элементы программирования

После выполнения команды help mExp появляется следующее текстовое сообщение:

Вкачестве значения для аргумента x функцией возвращается выражение (exp(x)-1)/x

Несложно заметить, что это именно тот текст, что был введен в начале m-файла с кодом функции mExp() в качестве комментария. При этом если просто вызвать функцию с каким-то числовым аргументом, выводится значение функции для данного аргумента. Например, в результате выполнения команды mExp(2) получаем числовое значение 3.1945 (см. рис. 3.14).

Нередко удобно или просто необходимо в процессе вычисления функции вводить данные и выводить сообщения. Для ввода данных используется функция input(). Аргументом этой функции указывается текст приглашения, которое выводится перед тем, как нужно будет ввести значение. Результатом функции возвращается значение, введенное пользователем. На рис. 3.15 приведено окно редактора m-файлов с кодом функции, при выполнении которой пользователем вводится числовое значение для ее аргументов.

Рис. 3.15. В коде функции использована инструкция ввода значения

Программный код функции ComplPower() имеет следующий вид:

function z=ComplPower Re=input('Действительная часть Re='); Im=input('Мнимая часть Im='); n=input('Целочисленная степень n='); z=(Re+1i*Im)^n;

end

Функция предназначена для вычисления целочисленной степени комплексногочисла.Унеенетаргументов,авкачестверезультатаонавозвращаеткомплексное число. Поскольку для вычисления результата необходимо знать три значения: действительную часть комплексного числа, мнимую часть комплексного числа и степень, эти значения вводятся при выполнении функции. Для ввода действительной части в программном коде функции ComplPower() исполь-

115

Самоучитель Matlab

зуется инструкция Re=input('Действительная часть Re='). В результате ее выполнения в командной строке выводится текстовое сообщение Действительная часть Re=, после чего пользователь должен ввести числовое значение для действительной части возводимого в степень комплексного числа и нажать клавишу <Enter>. В результате введенное пользователем значение считывается и возвращается в качестве результата выполнения инструкции inp ut('Действительная часть Re='). Этот результат, всоответствии с командой Re=input('Действительная часть Re='), записывается в переменную Re. Аналогично с помощью команд Im=input('Мнимая часть Im=')

иn=input('Целочисленная степень n=') считываются значения для мнимой части комплексного числа и степени (соответственно, переменные Im

иn). Командой z=(Re+1i*Im)^n формируется результат и записывается в переменную z (которая указана в заголовке функции как переменная результата). При этом мнимая единица в коде реализована в виде 1i.

Результат вычисления с помощью созданной функции выражения (2 − 3i)4 = −119 +120i показан на рис. 3.16.

Рис. 3.16. Вычисление степени комплексного числа

В приведенном далее коде жирным шрифтом выделен ввод пользователя:

>> ComplPower()

Действительная часть Re=2 Мнимая часть Im=-3 Целочисленная степень n=4 ans =

-1.1900e+002 +1.2000e+002i

На заметку

После ввода инструкции ComplPower() для вычисления соответствующей функции последовательно выводятся текстовые сообщения, после которых необходимо ввести нужное значение. Каждое следующее сообщение появляется после ввода числа и нажатия клавиши <Enter>.

116

Глава 3. Элементы программирования

Вывод сообщений в процессе выполнения функции обычно осуществляется с помощью функции disp(). Функция предназначена для вывода на экран значений массива, переданного аргументом функции, или текстовой строки. Особенность функции связана с тем, что выводятся только значения, без имени массива (если речь идет об аргументе-массиве). На рис. 3.17 показано окно редактора m-файлов с кодом функции, в которой использована встроенная функция disp() для вывода сообщений.

Рис. 3.17. Функция с командами вывода на экран сообщений

Программный код функции mCos() приведен ниже:

function mCos(x)

disp('Вычисление функции f(x)=(1-cos(x))/x^2'); disp(['Аргумент x=',num2str(x)]); z=(1-cos(x))/x^2;

disp(['Значение функции f(x)=',num2str(z)]); end

Функцией по аргументу x вычисляется выражение 1 − cos(x) , но как x2

результат это значение не возвращается, а только отображается. Интерес представляют команды, содержащие вызов функции disp(). В первом случае аргументом функции disp() передается текстовая строка 'Вычисление функции f(x)=(1-cos(x))/x^2'. Во втором случае аргументом функции disp() передается массив из двух элементов ['Аргумент x=',num2str(x)]. Первый элемент массива – текст 'Аргумент x='. Второй элемент тоже текстовый. Он получается преобразованием числового значения x (аргумент функции mCos()) в текст. Делается это с помощью встроенной функции num2str(). Аналогичная ситуация имеет место при вызове команды disp(['Значение функции f(x)=',num2str(z)]), только в этом случае к текстовому формату преобразуется значение переменной z, которой предварительно присвоено нужное значение. На рис. 3.18 приведен пример вызова функции mCos().

117

Самоучитель Matlab

Рис. 3.18. Результат вызова функции

После выполнения команды mCos(1) на экран выводятся следующие сообщения:

Вычисление функции f(x)=(1-cos(x))/x^2 Аргумент x=1

Значение функции f(x)=0.4597

Кроме функции disp(), для вывода специальных сообщений используются функции warning() и error(). В наиболее простом варианте аргументом функции warning() передается текстовый аргумент, который и выводится на экран. При этом в текст сообщения автоматически добавляется слово Warning. Выполнение функции, в которой выводится сообщение, при этом не прекращается. В отличие от функции warning(), функция error() не только выводит сообщение (текст, переданный аргументом функции), но и завершает работу кода, в котором вызвана функция error(). Пример использования функций warning() и error() приведен в следующем коде:

function ShowFunc

disp('Начало работы функции!'); warning('Предупреждение!'); error('Сообщение об ошибке!');

disp('Эта строка на экране не появится!'); end

Окно редактора m-файлов с кодом показано на рис. 3.19.

Рис. 3.19. Окно редактора m-файлов с кодом функции, выводящей сообщения на экран

118

Глава 3. Элементы программирования

Код функции фактически состоит из четырех инструкций по выводу на экран сообщений. Первое сообщение выводится функцией disp(). Второе сообщение выводится с помощью функции warning(). Третье сообщение выводится функцией error(). Наконец, в коде использована еще одна функция disp(), однако сообщение этой функцией выводиться не будет, поскольку после выполнения инструкции с функцией error() выполнение кода функции ShowFunc() будет прекращено. Результат вызова функции ShowFunc() представлен на рис. 3.20.

Рис. 3.20. Результат вызова функции, выводящей сообщения на экран

На заметку

Обращаем внимание, что при выводе сообщений с помощью функций warning() и error() не только добавляются дополнительные инструкции, но еще и указывается (через гиперссылку) та строка кода, которая вызвала соответствующее сообщение.

Управляющие инструкции

Полковник, забудьте про дворцовый этикет. Все новости докладывать немедленно!

К/ф "Клуб самоубийц, или Приключения титулованной особы"

Далее остановимся на управляющих инструкциях, которые могут использоваться в программных кодах Matlab. Речь в первую очередь пойдет об условных операторах и операторах цикла.

К условным операторам относят операторы if и оператор перебора switch. Оба они используются для создания точек ветвления в программном коде, когда в зависимости от выполнения некоторого условия (или условий) выполняются разные фрагменты кода.

В наиболее простом варианте синтаксис вызова условного оператора if имеет следующий вид:

119

Самоучитель Matlab

if условие команды end

После ключевого слова if указывается условие – выражение логического типа. Обычно условия строятся на основе операций отношения. Особенности реализации логического типа данных в Matlab (в том числе и логические операторы) описываются далее в этой главе. Так вот, если условие истинно, то выполняются команды после этого условия до ключевого слова end. Эта инструкция является идентификатором окончания условного оператора. После этого управление передается оператору, следующему после условного. Если условие истинным не является, управление сразу передается оператору, указанному после условного. Другими словами, при ложном условии команды после условия и до ключевого слова end не выполняются.

Кроме рассмотренных выше инструкций, в условном операторе могут использоваться ключевые слова else и elseif. Если синтаксис вызова условного оператора имеет вид

if условие команды_1 else

команды_2 end

то при истинном условии выполняются команды между условием и ключевым словом else (то есть блок команды_1). Если условие ложно, выполняются команды между ключевым словом else и инструкцией окончания условного оператора end. Допускается и более сложный формат вызова условного оператора:

if условие_1 команды_1

elseif условие_2 команды_2

elseif условие_3

команды_3

...

elseif условие_N команды_N

else

команды_N+1 end

В этом случае сначала проверяется первое условие (условие_1 после ключевого слова if). Если условие_1 истинно, выполняются команды после этого условия и до первого ключевого слова elseif. Если условие ложно, проверяется условие_2 после первого ключевого слова elseif. При ис-

120