- •Оглавление
- •Предисловие
- •Раздел 1. Основные сведения о среде программирования «matlab»
- •Глава 1. Вычисления в командном режиме
- •1.1. Простейшие математические операции в matlab
- •1.2. Переменные
- •1.3. Создание матриц
- •1.4. Доступ к элементам матриц
- •1.5. Операции с матрицами
- •1.6. Ввод, вывод и работа со строками
- •Глава 2. Построение графиков в matlab
- •2.1. Построение графика в виде двумерной линии
- •2.2. Оформление графиков
- •2.3. Построение трехмерных графиков
- •2.4. Построение линий уровня
- •2.5. Построение векторного поля
- •2.6. Отображение нескольких графиков в одном окне
- •Глава 3. Скрипты в matlab и управляющие конструкции
- •3.1. Создание и выполнение скриптов в matlab
- •3.2. Оператор for
- •3.3. Логические операции
- •3.4. Оператор if / elseif / else
- •3.5. Оператор while
- •3.6. Операторы break / continue
- •3.7. Оператор switch
- •3.8. Создание функций
- •Раздел 2. Краткие теоретические сведения и задания Тема 1. Векторный анализ
- •1.1. Элементы векторного анализа
- •Задания
- •Тема 2. Уравнения Максвелла (произвольная и гармоническая временная зависимость, статические, стационарные и квазистационарные поля)
- •2.1. Система уравнений электродинамики – уравнения Максвелла
- •2.2. Граничные условия. Принцип эквивалентности
- •Задания
- •Тема 3. Плоские волны
- •3.1. Явление дисперсии и групповая скорость
- •Задания
- •Тема 4. Граничные задачи, уравнения и методы
- •4.1. К классификации электромагнитных явлений
- •Задания
- •4.2. Метод конечных разностей
- •4.2.1. Конечно-разностная аппроксимация
- •4.2.2. Конечно-разностная аппроксимация уравнений Лапласа и Пуассона
- •4.2.3. Конечно-разностная аппроксимация для граничных узлов
- •Задания
- •Литература
2.4. Построение линий уровня
Построение линий уровня очень похоже на построение трехмерных графиков. Для этого сначала также необходимо создать двумерную сетку, в узлах которой будут рассчитываться значения функций, а затем для построения линий уровня используется функция contour, параметры которой во многом напоминают параметры функций surf и mesh, описанных в предыдущем разделе. Следующий пример строит линии уровня функции Швефеля, результат показан на рисунке 2.26.
>> meshx = -500: 10: 500;
>> meshy = -500: 10: 500;
>> [X, Y] = meshgrid (meshx, meshy);
>> Z = X .* sin ( sqrt ( abs (X) ) ) + Y .* sin ( sqrt ( abs (Y) ) );
>> contour (X, Y, Z)
Рис. 2.26.
Функцию contour можно использовать с дополнительным параметром: contour (X, Y, Z, n), где n – целое положительное число, которое задает количество выделяемых уровней на графике. Если в предыдущем примере заменить последнюю команду на contour (X, Y, Z, 20), то график примет вид, показанный на рисунке 2.27.
Рис. 2.27.
Кроме того, вместо последнего параметра можно использовать вектор, элементы которого определяют уровни, для которых надо построить линии. Следующий пример рисует три уровня для Z = -500; 0 и 500 (результат показан на рисунке 2.28).
>> meshx = -500: 10: 500;
>> meshy = -500: 10: 500;
>> [X, Y] = meshgrid (meshx, meshy);
>> Z = X .* sin ( sqrt ( abs (X) ) ) + Y .* sin ( sqrt ( abs (Y) ) );
>> contour (X, Y, Z, [-500 0 500])
Рис. 2.28.
Так как матрица размером 1x1 MATLAB воспринимает как число, то для того, чтобы построить одну линию уровня для определенного значения Z, в качестве последнего параметра функции contour нужно передать матрицу размером 2x1, где оба элемента матрицы будут одинаковыми, то есть должны определять один и тот же отображаемый уровень. Например: contour (X, Y, Z, [0, 0]).
2.5. Построение векторного поля
MATLAB имеет средства для отображения векторных величин на плоскости и в пространстве. Для построения картины векторного поля на плоскости используется функция quiver. Один из синтаксисов функции quiver выглядит следующим образом:
quiver (x, y, u, v)
здесь x и y задают сетку, в узлах которой определяются векторные величины, заданные с помощью матриц u и v. Элементы матрицы u и v задают величину (длину вектора) и направление векторов в системе координат x, y в каждом узле сетки. Использование функции quiver показывает следующий пример, результат приведен на рисунке 2.29.
>> [x, y] = meshgrid (-2 : 0.5 : 2, -2 : 0.5 : 2);
>> r2 = x .^ 2 + y .^ 2;
>> alpha = 3;
>> Ax = exp (-r2 / alpha .^ 2) .* x;
>> Ay = exp (-r2 / alpha .^ 2) .* y;
>> quiver(x, y, Ax, Ay)
Рис. 2.29.
В функцию quiver после вектором u и v можно передать дополнительный параметр в виде числа, который будет определять масштаб длины отображаемых стрелок. Если в предыдущем примере функцию quiver вызвать как quiver(x, y, Ax, Ay, 0.5), то график примет вид, показанный на рисунке 2.30.
Рис. 2.30.
2.6. Отображение нескольких графиков в одном окне
Ранее, при рассмотрении функции plot для рисования кривых на плоскости, уже описывался способ для рисования нескольких кривых в одних осях с использованием команд hold on / hold off. Этот же прием можно использовать и в том случае, если в одних осях нужно отобразить несколько графиков разного вида. В следующем примере в одних осях строятся линии уровня и картина векторного поля (результат показан на рисунке 2.31).
>> [x, y] = meshgrid (-2 : 0.5 : 2, -2 : 0.5 : 2);
>> r2 = x .^ 2 + y .^ 2;
>> alpha=3;
>> Ax = exp (-r2 / alpha .^ 2) .* x;
>> Ay = exp (-r2 / alpha .^ 2) .* y;
>> quiver(x, y, Ax, Ay)
>> hold on
>> contour (x, y, r2)
>> hold off
Рис. 2.31.
Таким же образом можно совмещать и трехмерные графики. Например, на рисунке 2.32 показаны две трехмерные поверхности, полученные с помощью следующих команд:
>> [x, y] = meshgrid (-2 : 0.1 : 2, -2 : 0.1 : 2);
>> r2 = x .^ 2 + y .^ 2;
>> surf (x, y, r2)
>> hold on
>> surf (x, y, r2 + 5)
>> hold off
Рис. 2.32.
Можно совмещать даже двумерные и трехмерные графики. Следующий пример отображает одновременно трехмерную поверхность и линии уровня (результат показан на рисунке 2.33).
>> [x, y] = meshgrid (-2 : 0.1 : 2, -2 : 0.1 : 2);
>> r2 = x .^ 2 + y .^ 2;
>> surf (x, y, r2)
>> hold on
>> contour (x, y, r2)
>> hold off
Рис. 2.33.
Предыдущий пример можно упростить. Дело в том, что для одновременного рисования трехмерной поверхности и линий уровня есть функция surfc, поэтому предыдущий пример можно изменить на следующий, результат при этом будет совпадать с тем, что показано на рисунке 2.33.
>> [x, y] = meshgrid (-2 : 0.1 : 2, -2 : 0.1 : 2);
>> r2 = x .^ 2 + y .^ 2;
>> surfc (x, y, r2)
Несколько графиков можно рисовать не только в одних осях, можно окно фигуры разбить на несколько областей, и в каждой области рисовать свой график. Например, можно сделать, чтобы окно фигуры выглядело так, как показано на рисунке 2.34.
Рис. 2.34.
Для расположения нескольких графиков в одном окне предназначена функция subplot. Эта функция имеет несколько различных синтаксисов для ее использования, один из которых выглядит следующим образом:
subplot(m, n, p)
Здесь m и n определяют виртуальную таблицу, в ячейках которой будут отображаться графики. Эти переменные задают соответственно количество строк и столбцов такой таблицы. То есть окно фигуры будет условно поделено на m частей по вертикали и n частей по горизонтали. Параметр p задает номер ячейки, которая станет активной, и куда затем будут выводиться графики с помощью уже рассмотренных функций. Номер активной ячейки отсчитывается построчно, начиная с верхней левой ячейки, которая имеет номер 1. Рисунок 38 показывает нумерацию ячеек для случая трех строк и пяти столбцов.
Рис. 2.35.
При использовании функции subplot не обязательно заполнять все ячейки виртуальной таблицы, более того, для каждого графика можно задавать разное количество строк и столбцов виртуальной таблицы. Например, чтобы получить рисунок 2.34, использовалось три вызова subplot со следующими параметрами:
Верхний левый график: subplot (2, 2, 1);
Верхний правый график: subplot (2, 2, 2);
Нижний график: subplot (2, 1, 2).
Как видно, для построения рисунка 2.34 использовались разные виртуальные таблицы. В принципе, можно задавать такое разбиение, когда графики будут пересекаться, правда, практического смысла в этом обычно нет. Следующий пример показывает последовательность действий, приводящую к построению фигуры, показанной на рисунке 2.34:
>> clear
>>
>> % Верхний левый график
>> [x1, y1] = meshgrid (-2: 0.1: 2, -2: 0.1: 2);
>> f1 = x1 .^ 2 + y1 .^ 2;
>> subplot (2, 2, 1)
>> surf (x1, y1, f1)
>>
>> % Верхний правый график
>> x2 = -10: 0.05: 10;
>> f2 = sinc (x2 / pi);
>> subplot (2, 2, 2)
>> plot (x2, f2)
>> grid on
>>
>> % Нижний график
>> x3 = -10: 0.01: 10;
>> f3 = exp (-(x3 .* x3));
>> subplot (2, 1, 2)
>> plot (x3, f3)
Функция subplot имеет и другие синтаксисы вызова, в данном пособии они не рассматриваются, но подробно описаны в документации.
Если нужно отобразить несколько графиков в разных окнах, то для создания нового окна используется функция figure, которая в простейшем случае не принимает никакие параметры. После вызова функции figure откроется новое окно, которое станет текущем при рисовании, и последующие вызовы функции рисования будут отображать графики именно в этом окне. Команда clf очищает текущее окно фигуры и создает новую фигуру, если ни одной фигуры еще не создано.
Например, следующие команды рисуют три графика в трех разных окнах:
>> % Удалим все переменные
>> clear
>>
>> % Очистим фигуру, если она уже есть, или создадим новую
>> clf
>>
>> % Первый график
>> [x1, y1] = meshgrid (-2: 0.1: 2, -2: 0.1: 2);
>> f1 = x1 .^ 2 + y1 .^ 2;
>> surf (x1, y1, f1)
>>
>> % Второй график
>> figure
>> x2 = -10: 0.05: 10;
>> f2 = sinc (x2 / pi);
>> plot (x2, f2)
>> grid on
>>
>> % Третий график
>> figure
>> x3 = -10: 0.01: 10;
>> f3 = exp (-(x3 .* x3));
>> plot (x3, f3)
