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

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

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

Глава 9. Символьные вычисления

После имени процедуры через оператор присваивания указывается ключевое слово proc, после которого в круглых скобках перечисляются аргументы процедуры. Если в процедуре используются локальные переменные, они перечисляются после ключевого слова local. Эта часть кода не является обязательной. Тело кода процедуры размещается между ключевыми словами begin и end_proc.

На заметку

Переменные могут быть локальными и глобальными. Локальные переменные доступны только в пределах кода процедуры в том смысле, что любые изменения, вносимые в такие переменные в теле процедуры, отменяются после выполнения процедуры. По умолчанию все переменные (не объявленные в разделе local) полагаются глобальными. При совпадении имен глобальной и локальной переменных приоритет остается за локальной переменной.

Если процедура возвращает результат, то для этого обычно используют инструкцию return(). Аргументом указывается возвращаемое значение. Но в принципе можно обойтись и без этой инструкции. В этом случае возвращается последнее вычисленное значение в процедуре. Пример процедуры для вычисления чисел Фибоначчи приведен ниже:

FibNums:=proc(n) local i,a,b; begin

a:=1:

b:=1:

for i from 3 to n do b:=a+b:

a:=b-a: end_for: return(b); end_proc:

Использование этой процедуры в рабочем документе MuPAD показано на рис. 9.44.

Еще один пример процедуры (тоже для вычисления чисел Фибоначчи) показан в документе на рис. 9.45.

В этом случае использована рекурсия – вызов процедуры в теле этой же процедуры. Код процедуры следующий:

FNums:=proc(n) begin

if n=1 or n=2 then return(1):

else return(FNums(n-1)+FNums(n-2)): end_if:

end_proc

401

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

Рис. 9.44. Документ с описанием процедуры

Рис. 9.45. Процедура с рекурсией

402

Глава 9. Символьные вычисления

Здесь реализован такой алгоритм. Проверяется значение аргумента процедуры. Если значение аргумента равно 1 или 2, то в качестве значения процедуры возвращается 1. В противном случае в качестве результата возвращается выражение, в котором значение вычисляется путем вызова определяемой процедуры, но уже с другими аргументами.

На заметку

В качестве завершающей инструкции вместо ключевых слов end_for, end_ while, end_repeat, end_if, end_case и end_proc в соответствующих местах можно использовать ключевое слово end.

Редактор кодов

Странный способ украшать дом монограммой королевы.

К/ф "Приключения Шерлока Холмса и доктора Ватсона. Кровавая надпись"

При работе со средой MuPAD существует возможность создавать и сохранять отдельными файлами программные коды, а затем вызывать их в рабочем документе в случае необходимости. Коды создаются в специальном редакторе, который может быть запущен из окна заставки среды MuPAD – для этого следует выбрать команду New Editor (см. рис. 9.46). Можно открыть окно редактора кодов, воспользовавшись командой File New Editor (рис. 9.46).

Рис. 9.46. Запуск редактора кодов

В результате открывается окно редактора кодов, представленное на рис. 9.47.

403

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

Рис. 9.47. Окно редактора кодов

В окне вводится код и сохраняется файл (команда File Save). Например, вводим код и сохраняем в файл с именем MyCode.mu, как показано на рис. 9.48.

Рис. 9.48. Окно редактора кодов с командами после сохранения

В данном случае файл содержит такой код:

404

Глава 9. Символьные вычисления

SEED:=123; rnd:=random(-10..10); L:=[];

for k from 1 to 10 do L:=L.[rnd()];

end;

ones:=random(2);

n:=5; A:=matrix(n,n,[ones()$i=1..n*n])

Этим кодом создается список L из десяти целых случайных чисел, а также квадратная матрица A, заполненная случайным образом нулями и единицами. Важное место в этом коде занимает процесс генерирования случайных чисел. Первой командой SEED:=123 выполняется инициализация генератора случайных чисел. Это позволяет каждый раз при выполнении кода генерировать одну и ту же "случайную" последовательность. Команда не обязательная (ее можно было не использовать), а нужна скорее для удобства.

На заметку

Пикантность ситуации состоит в том, что при генерировании случайных чисел на самом деле генерируются неслучайные числа. Это так называемые псевдослучайные числа. Для генерирования последовательности таких чисел необходимо задать некое "затравочное" число, которое генератор случайных чисел использует в расчетах при вычислении первого псевдослучайного числа. Обычно при запуске генератора случайных чисел в качестве такого "затравочного" числа используется, например, системное время. Это создает иллюзию случайности. Но можно "затравочное" значение задать и в явном виде. Если каждый раз использовать одно и то же значение, будет генерироваться одна и та же последовательность чисел.

Командой rnd:=random(-10..10) определяется функция rnd() для генерирования случайных чисел. При определении функции rnd() в свою очередь использована встроенная функция random(), которой генерируются целые случайные числа. Если аргументом функции random() указать диапазон, то генерироваться будут случайные целые числа, равномерно распределенные в этом диапазоне (включая граничные точки диапазона). Таким образом, функцией rnd() будут генерироваться числа в диапазоне от -10 до 10.

Командой L:=[] создается пустой список L. После этого с помощью оператора цикла (индексная переменная k пробегает значения от 1 до 10) этот список заполняется случайными числами. В теле цикла использована команда L:=L.[rnd()]. Она буквально означает добавление в конец списка L элемента, который вычисляется инструкцией rnd(), то есть случайного числа в диапазоне от -10 до 10.

405

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

На заметку

Для добавления в конец списка нового элемента может использоваться функция append() или так называемый точечный синтаксис. Здесь использован второй способ. Инструкцией вида список.[элемент] возвращается список, который получается объединением исходного списка и элемента, указанного после точки в квадратных скобках. Поэтому команда L:=L.[rnd()], например, означает, что переменной L в качестве значения присваивается список, который получается добавлением в конец списка – текущего значения L элемента, вычисляемого как rnd() (случайное число).

После выполнения оператора цикла список L заполнен десятью случайными числами. На следующем этапе создаем случайную матрицу из нулей и единиц. Для этого командой ones:=random(2) создаем функцию, которая генерирует целое случайное число в диапазоне от 0 до 1 включительно, то есть с равной вероятностью генерирует нули и единицы.

На заметку

Если функции random() передан один аргумент (например, m), то это все равно, как если бы был указан диапазон 0..m-1. Другими словами, будут генерироваться неотрицательные целые числа, меньшие аргумента функции random().

Командой n:=5 инициализируется переменная n, а затем эта переменная используется в команде A:=matrix(n,n,[ones()$i=1..n*n]). В результате создается упомянутая выше матрица из нулей и единиц. Матрица записывается в переменную A. Формируется матрица с помощью встроенной функции matrix(). Первые два аргумента функции matrix() определяют размер матрицы (в данном случае матрица состоит из n строк и n столбцов). Третий аргумент – список элементов матрицы. Матрица элементов заполняется построчно. Список элементов создается инструкцией [ones()$i=1..n*n]. Это заключенная в квадратные скобки последовательность. Последовательность, в свою очередь, создается с помощью оператора создания последовательности $. Слева от оператора $ указывается общее выражение, которое используется для вычисления элементов последовательности. Справа от оператора $ указывается индексная переменная (в общем случае она может использоваться в выражении слева от оператора $) и диапазон изменения индексной переменной. Поскольку в квадратной матрице размера n всего элементов n*n, то индексная переменная пробегает значения от 1 до n*n.

Для выполнения кода, записанного в файле MyCode.mu, в рабочем документе среды MuPAD выбираем команду Notebook Read Commands (рис. 9.49).

406

Глава 9. Символьные вычисления

Рис. 9.49. Выполнение кода из файла

В открывшемся диалоговом окне необходимо выбрать соответствующий файл для выполнения кода (в данном случае это файл MyCode.mu). Хотя внешних проявлений этого чудесного процесса практически не будет, эффект все же есть. Он состоит в том, что в рабочем документе можно использовать все те переменные, что содержатся в коде файла MyCode.mu и с которыми выполнялись вычисления.

На заметку

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

На рис. 9.50 показан рабочий документ среды MuPAD, в котором после выполнения кода из файла MyCode.mu проводятся вычисления с переменными, использованными в этом коде.

В частности, если в пустом рабочем документе выполнить команду L (имя списка из случайных чисел), получим результат: список из десяти случайных чисел. Аналогичная ситуация и для матрицы A – хотя непосредственно

врабочем документе MuPAD матрица не определялась, у соответствующей переменной есть значение. Легко проверить, что имеют числовые значения индексные переменные k и i, использовавшиеся в операторе цикла и команде с оператором создания последовательности. Доступны также созданные

вкоде функции. Например, командой rnd()$i=1..n создается список из пяти (значение переменной n) случайных чисел в диапазоне от -10 до 10.

407

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

Рис. 9.50. Рабочее окно с командами после выполнения кода файла

На заметку

Мы кратко уже обсуждали методы работы с последовательностями и списками. Последовательность представляет собой набор объектов (разного типа), разделенных запятыми. Кроме явного перечисления элементов последовательности, существует несколько способов ее создания. Обычно прибегают к помощи специального оператора создания последовательности $ или функции _seqgen() (точнее, это функциональная форма оператора $). Для создания последовательности в "автоматическом" режиме следует указать общее выражение для генерирования элементов последовательности, а также индексную переменную и множество ее значений. Ели используется функция _seqgen(), то ее аргументы указываются именно так: выражение (зависящее, как правило, от индексной переменной), индексная переменная и диапазон ее изменения (или список значений). Если последовательность создается с помощью оператора $, то выражение для элементов последовательности указывается слева от оператора, а все остальное – справа.

Список представляет собой упорядоченный набор данных. Технически от последовательности список отличается тем, что его элементы все вместе заключаются в квадратные скобки. Другими словами, список – это заключенная в квадратные скобки последовательность. Что касается сути вопроса, то главное

408

Глава 9. Символьные вычисления

отличие списка от последовательности в том, что вложенные списки создавать можно, а вложенные последовательности – нет. Другими словами, элементом списка может быть другой список, а при попытке вставить одну последовательность в качестве элемента в другую последовательность эти последовательности просто объединяются.

Множество представляет собой набор элементов, для которого не имеет значения порядок следования элементов во множестве. Для множества важно, входит элемент в него или нет. Чтобы получить множество, достаточно заключить последовательность в фигурные скобки.

Кроме этого, существуют еще таблицы, матрицы и массивы. Эти структуры создаются соответственно с помощью функций table(), matrix() и array(). Отличие между матрицей и объектом состоит в том, что у матрицы индексы целочисленные, а у таблицы это могут быть произвольные величины. Одно из отличий матрицы и массива (помимо способа хранения данных) состоит в том, что матрица может быть одномерной (вектор) или двумерной, а размерность массива может быть и больше.

Создание анимации

- Хорошо, допустим, Земля вращается вокруг Солнца.

- То есть как, "допустим"?

К/ф "Приключения Шерлока Холмса и доктора Ватсона. Знакомство"

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

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

Здесь мы использовали команду f:=x->exp(-x^2/2)/sqrt(2*PI) для

определения функциональной зависимости вида f (x) = exp(x2 2 )

2π

(Гауссово распределение). Функцию F(x,t) = (f (x +t) + f (x t)) 2 определяем командой F:=(x,t)->(f(x+t)+f(x-t))/2. Именно на основе этой функции создаем анимацию. Первая переменная x в этой функции соответствует пространственной переменной, а вторая переменная t соответствует времени. Функция F(x,t) описывает две разбегающиеся в разные

409

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

Рис. 9.51. Создание двумерной анимации с помощью функции plot()

стороны волны Гауссового профиля. Такой результат может быть получен при решении задачи о колебаниях бесконечной струны с начальным распределением, которое описывается функцией f (x).

Для создания анимации используем команду plot(F(x,t),x=-15..15, t=0..10). В отличие от команды создания обычной графики здесь в аргументах функции plot() указан еще интервал t=0..10 изменения временной переменной t. При выполнении этой команды внешне впечатление такое, что создан график функции. Но если этот график выделить (щелкнув в области графика мышкой), получим результат, как на рис. 9.52.

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

410