New Page 1

Назад

Простейшие вычисления. Использование переменных

Сохранение рабочей среды

Работа с массивами. Вектора

Построение графиков функций одной переменной

Работа с массивами. Матрицы

Трехмерная графика


new_page_2

Простейшие вычисления

После запуска MatLab на экране появляется командное окно, которое состоит из следующих основных элементов:

- меню;

- панели с кнопками;

- рабочей области с командной строкой, в которой находится мигающий вертикальный курсор;

- строки состояния.

Все команды в этом режиме набираются в командной строке после знака приглашения >>. Набор заканчивается нажатием Enter, после чего MatLab выполнит команду или вычислит введенное выражение.

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

При вводе команды help можно узнать имена всех категорий встроенных функций MatLab. Узнав имя категории, можно просмотреть имена всех функций данной темы. Например, команда

>>help elmat

покажет список всех элементарных математических функций, а

>>help general

список функций общего назначения.

Можно получить также справку по конкретной функции, задав, например, команду

>>help format,

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

Задание 1.

Используя команду help, просмотрите, как выглядят названия элементарных математических функций.

Задание 2.

Введите в командной строке следующее выражение

и нажмите Enter.

При вводе используйте встроенных функции для вычисления экспоненты, натурального логарифма, квадратного корня и тригонометрических функций. Для ввода p используйте системную константу pi.

Арифметические операции выполняются в обычном порядке, свойственном языкам программирования:

- возведение в степень ^;

- умножение и деление *, /;

- сложение и вычитание +, -.

Для изменения порядка вычислений используйте скобки.

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

Ответ выведется в командное окно в виде:

ans =

...-3.2105

«ans» временная переменная, которую определяет MatLab, если вы не назначили переменную для сохранения результата операции.

Задание 3.

Получите более точный результат. Для этого выполните команду format long e, затем нажимайте клавишу ↑ до тех пор, пока в командной строке не появится набранное ранее выражение, затем нажмите Enter.

ans =

   -3.210497097863031e+000

Вывести результат в другом формате можно без повторного вычисления. Для этого сделайте следующее: измените формат командой short, а затем наберите в командной строке имя переменной ans и нажмите Enter.

>> format short

>> ans

ans =

   -3.2105

В случае, если при вычислениях возникают исключительные ситуации, например, деление на ноль, выдается предупреждающее сообщение и вычисляемая переменная принимает следующие значения: Inf (бесконечность) при делении положительного числа на ноль, -Inf (минус бесконечность) при делении отрицательного числа на ноль, NaN (не число) при делении нуля на ноль.

Использование переменных

MatLab позволяет использовать переменные. В качестве оператора присваивания используется знак =.

Задание 4.

Найдите значение следующего выражения

Обратите внимание на то, что и в числителе и в знаменателе есть одинаковые выражения. Присвойте эти выражения переменным x и y, и только после этого вычисляйте общее выражение, используя имена переменных. Для того, чтобы результаты промежуточных вычислений не выводились на экран, используйте в конце команды точку с запятой «;».

Ответ

z =

   0.0243 - 0.9997i


New Page 3

Сохранение рабочей среды

Для сохранения необходимо выбрать в меню File (Файл) пункт Save Workspace As (Сохранить рабочую среду как), и задать в появившемся диалоговом окне путь и имя файла. Расширение у такого файла будет .mat. В рабочей среде сохраняются значения всех переменных, которые были использованы в сеансе работы.

В следующем сеансе работы для восстановления значений переменных следует открыть сохраненный файл, выбрав в меню File (Файл) пункт Load Workspace (Открыть рабочую область).

Сохранить и восстановить переменные рабочей среды можно с помощью соответствующих команд (save и load) из командной строки.

Задание 5.

Сохраните рабочую область, набрав в командной строке

>> save work13-10-04

Закройте MatLab, запустите его заново, откройте сохраненный файл, набрав в командной строке

>> load work13-10-04

Просмотрите с помощью клавиши ↑ значения всех переменных. Эти переменные можно использовать во вновь вводимых командах.

В MatLab имеется возможность записывать исполняемые команды и результаты в текстовый файл (вести журнал работы), который можно просмотреть в текстовом редакторе. Для этого служит команда diary имя_файла.txt.


New Page 4

Работа с массивами

Массив – упорядоченная, пронумерованная совокупность однородных данных, имеющая одно имя. Доступ к отдельным элементам массива осуществляется по целочисленному индексу, то есть по номеру элемента в массиве. В зависимости от количества индексов, определяющих положение элемента в массиве, массивы разделяют на одномерные (вектора-строки, вектора-столбцы), двумерные (матрицы) и многомерные.

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

Работа с векторами

Вектора - это одномерные (линейные) числовые наборы чисел, в которых позиция каждого элемента задается единственным числом – его номером.

Задание векторов

>> a1=[3 4 9 2] – вектор-строка

>> a1=[3, 4, 9, 2] – вектор-строка

>> a1=[3; 4; 9; 2] – вектор-столбец

Задание 7.

Задайте два вектора-строки s1 = (3, 4, 9, 2)и s2 = (5, 3, 3, 2), найдите их сумму и натуральный логарифм от суммы.

Доступ к элементам вектора осуществляется заданием его индекса в круглых скобках после имени. Можно обратиться к блоку последовательно расположенных элементов вектора с помощью «:».

Например:

>> w=[0.1 2.9 3.3 5.1 2.6 7.1 9.8];

>> w(4)

ans =

    5.1000

>> w(2:6)=0;

>> w

w =

  0.1000     0     0     0     0     0    9.8000

Элементы массива могут входить в выражения. Например, для нахождения среднего геометрического для первых трех элементов массива, можно проделать следующее:

>> w=[0.1 2.9 3.3 5.1 2.6 7.1 9.8];

>> gm=(w(1)*w(2)*w(3))^(1/3)

gm =

    0.9855

Задание векторов с помощью операции «:». Пусть требуется сформировать одномерный массив чисел в диапазоне от 3.7 до 8.947 с приращением 0.3. Это легко достигается с помощью оператора «двоеточие». С помощью функции length можно определить, сколько элементов попало в вектор.

>> mas=3.7:0.3:8.947;

>> length(mas)

ans =

    18

Применение функций обработки данных к векторам

Функция | Применение | Примечание
prod | >> z=[3 2 1 4 6 -5]; >> p=prod(z) p = -720 | Перемножение элементов вектора
length | >> z=[3 2 1 4 6 -5]; >> p=length(z) p = 6 | Определение числа элементов вектора
sum | >> z=[3 2 1 4 6 -5]; >> p=sum(z) p = 11 | Суммирование элементов вектора
abs | >> z=[3 2 1 4 6 -5]; >> p=abs(z) p = 3 2 1 4 6 5 | Определение модуля элементов вектора
min | >> z=[3 2 1 4 6 -5]; >> p=min(z) p = -5 | Определение минимального элемента вектора
max | >> z=[3 2 1 4 6 -5]; >> p=max(z) p = 6 | Определение максимального элемента вектора
sort | >> z=[3 2 1 4 6 -5]; >> p=sort(z) p = -5 1 2 3 4 6 >> z=[3 2 1 4 6 -5]; >> [p,ind]=sort(z) p = -5 1 2 3 4 6 ind = 6 3 2 1 4 5 | Упорядочивание вектора по возрастанию Вызов sort с двумя выходными элементами образует массив индексов соответствия элементов упорядоченного и исходного массивов
mean | >> z=[3 2 1 4 6 -5]; >> p=mean(z) p = 1.8333 | Вычисление среднего арифметического вектора

Самостоятельно о функциях обработки данных можно узнать, выполнив команду help datafun.

Задание 8.

- Задайте вектор, состоящий из элементов (9.4, -2.3, -5.2, 7.1, 0.8, 1.3).

- Найдите среднее арифметическое элементов вектора, используя функции sum и length. Проверьте результат, используя функцию mean.

- Упорядочьте вектор по возрастанию, найдите минимальный и максимальный элементы вектора и их индексы.

Поэлементные операции с векторами

Чтобы выполнить поэлементное умножение, деление, возведение в степень векторов, используют следующие знаки «.*», «./» «.^» (без пробелов!). В результате получается тоже вектор.

Задание 9.

-         Задайте два вектора-строки v1=[2 -3 4 1]; v2=[7 5 -6 9];

- Выполните поэлементное умножение и деление этих векторов.

-         Выполните поэлементное возведение в степень 2 вектора v1.

Умножение деление вектора на число делается с помощью обычных знаков «*» «/» без точки.

Задание 10.

- Задайте вектор-строку с координатами точек 0.2, 0.3, 0.5, 0.8, 1.3, 1.7, 2.5

- Вычислите функцию [image] от каждого элемента вектора х.

У вас должен получиться вектор-строка y. Помните, что операции умножения, деления и возведения в степень должны выполняться для функции поэлементно.

Часто требуется вывести значение функции в точках отрезка, отстоящих друг от друга на равное расстояние (шаг). Для ввода таких векторов используется «:». Например, требуется ввести вектор строку значений аргумента [image] с шагом 0.2.

В MatLab это запишется так

>> x=[1:0.2:2]

x =

    1.0000    1.2000    1.4000    1.6000    1.8000    2.0000

Условно это можно записать

x = [начальное значение : шаг : конечное значение].

Шаг может быть и отрицательным.

Задание 11.

Выведите таблицу значений функции [image] на отрезке [0, 1] с шагом 0.05.


New Page 5

Построение графиков функций одной переменной

Для отображения функции в виде графика необходимо

1. Задать вектор значений x.

2. Вычислить вектор y значений функции y(x).

3. В командной строке задать команду plot для построения графика.

Задание 12.

Постройте график функции, определенной в задаче 11. Для этого введите в командной строке >> plot(x,y).

После выполнения команды на экране появится окно Figure No. 1 с графиком функции, изображенной на рисунке слева. Команда plot соединяет точки с координатами (x(i), y(i)) прямыми линиями, автоматически масштабируя оси для оптимального расположения графика в окне. Построенный график не должен иметь изломов, так как сама функция гладкая. Для более точного представления функции нужно задать большее количество точек на отрезке [0,1].

Задание 13.

При помощи клавиш ↑ ↓ найдите ранее введенную команду задания вектора х, задайте более мелкий шаг (0.01), найдите и выполните команду вычисления функции и заново запустите построение графика. У вас должен получиться гладкий график функций, как на рисунке, расположенном справа.

Сравнение нескольких функций удобно производить, отобразив их графики на одних осях.

Задание 14.

Постройте на отрезке [-1,-0.3] графики функций [image] и [image] , используя команду plot(x, f, x, g). Должен получиться график, показанный на рисунке слева.

Команда plot позволяет задать стиль и цвет линий, например

plot(x,f,'k-',x,g,'k:') строит первый график сплошной черной линией, а второй пунктирной черной линией (рисунок справа). Стили задаются в виде набора трех символов, заключенных в одиночные кавычки. Порядок следования символов неважен.

Таблица стилей задания цвета графика, типа точки-маркера, вида маркера

Цвет | Тип точки | Тип линии
b синий | . точка | - сплошная
g зеленый | o кружок | : пунктирная
r красный | x крестик | -. штрих-пунктирная
c голубой | + плюс | -- штриховая
m фиолетовый | * звездочка |
y желтый | s квадрат |
k черный | d ромб |

Если одновременно нужно визуализировать несколько графиков в разных окнах, достаточно выполнить команды

>> w=exp(x)

>>figure;plot(x,w) Команда figure создаст новое графическое окно.

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

>> x=[0:0.01:2];

>> y=sin(x);z=cos(x);w=exp(x);

>> subplot(1,2,1); plot(x,y,x,z)

>> subplot(1,2,2);plot(x,w)

окно с графиками будет выглядеть следующим образом:

У функции subplot три аргумента: первый равен числу рядов подобластей, второй – числу колонок подобластей, а третий задает номер подобласти.

Построение графиков в полярных координатах

Чтобы построить график в полярных координатах, надо использовать команду polar. Например, для построения графика функции r= sin(3φ) в полярных координатах следует выполнить группу команд

>> phi=0:0.01:2*pi; r=sin(3*phi);

>> polar(phi,r)

Задание 15.

Построить график функции [image] для [image] в прямоугольной и полярной системе координат в одном окне.

Оформление графиков и графических окон

Оформление линий. Функция plot через опорные (вычисленные) точки с координатами x, y проводит отрезки прямых линий, которые в системе представляют собой графические объекты типа line. Эти объекты имеют много свойств и характеристик, которые можно менять. Описатель графического объекта возвращается функцией plot и его можно запомнить, например, в переменной hPlot, а затем с помощью команды get просмотреть.

>> hplot=plot(t,y);

>> get (hplot)

     Color = [0 0 1]

     EraseMode = normal

     LineStyle = -

     LineWidth = [0.5]

     Marker = none

     MarkerSize = [6]

     MarkerEdgeColor = auto

     MarkerFaceColor = none

     XData = [ (1 by 401) double array]

     YData = [ (1 by 401) double array]

     ZData = []

     BeingDeleted = off

     ButtonDownFcn =

     Children = []

     Clipping = on

     CreateFcn =

     DeleteFcn =

     BusyAction = queue

     HandleVisibility = on

     HitTest = on

     Interruptible = on

     Parent = [101.004]

     Selected = off

     SelectionHighlight = on

     Tag =

     Type = line

     UIContextMenu = []

     UserData = []

     Visible = on

Зная имя свойства, с помощью функции set его значение можно изменить. Например, задав команду >> set(hplot,'linewidth',7), можно изменить толщину линии.

Задание 16.

Постройте график функции y=sin(x), x Î [0,3], шаг 0.1.

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

>> axis([1.5,2.5,0.5,2])

Чтобы изменить количество и значения числовых меток на осях, надо вначале получить описание объекта, который содержит оси координат и белый прямоугольник, внутри которого строится график. Это делает функция gca.

>> haxes=gca;

Затем с помощью функции set изменить требуемые параметры:

>> set(haxes,'xtick',[1.5,1.75,2.0,2.25,2.5])

Нанесение измерительной сетки

>> grid on

Проставление общего заголовка графика

>> title('График функции sin(x)')

Задание заголовков осей

>> xlabel('x');ylabel('y');

Размещение надписи на графике в определенном месте

>> text(2.1,0.9,'\leftarrowsin(x)');

Задание 16.

Используя, приведенные выше команды, добейтесь, чтобы построенный в задании 15 график выглядел как на рисунке справа.

Графики параметрических и кусочно-заданных функций

При построении функций заданных параметрически нужно:

  1. сгенерировать вектор значений аргумента;
  2. вычислить значения функций и записать их в векторы;
  3. использовать полученные векторы в качестве аргументов функции plot.

Например, график функции

получается при помощи следующих команд:

>> t=[0:0.01:2*pi];

>> x=0.5*sin(t);

>> y=0.7*cos(t);

>> plot(x,y)

При построении кусочно-заданных функций необходимо:

  1. получить пары массивов x, y для каждой из ветвей;
  2. объединить значения абсцисс в вектор x;
  3. объединить значения ординат в вектор y;
  4. построить график функции, задаваемой парой массивов x и y.

Например, график функции

получается при помощи следующих команд:

>> x1=[-2*pi:0.01:-pi];

>> y1=pi*sin(x1);

>> x2=[-pi:0.01:pi];

>> y2=pi-abs(x2);

>> x3=[pi:0.01:2*pi];

>> y3=-pi*sin(x3).^3;

>> x=[x1 x2 x3];

>> y=[y1 y2 y3];

>> plot(x,y)

Можно построить график трех ветвей, как три различные функции

>> plot (x1,y1,x2,y2,x3,y3), тогда каждая часть строится своим цветом

Задание 17.

Постройте график функции


New Page 6

Ввод матриц, простейшие операции

Для хранения матриц в системе MatLab используются двумерные массивы, имеющие уникальное имя. Доступ к элементам массива осуществляется при помощи двух индексов: номера строки и номера столбца, указанных в круглых скобках, например c(2,3), или с помощью одного индекса, например с(1), который задает порядковый номер элемента матрицы в векторе, так как матрица А размером m на n в памяти компьютера хранится в виде вектора длины mn, в котором элементы матрицы расположены один за другим построчно.

В системе MatLab вектора представляются в виде вектор-строки и вектор-столбца. Ввод таких векторов оформляется по-разному:

>> a1=[3 4 9 2] – вектор-строка

>> a1=[3, 4, 9, 2] – вектор-строка

>> a1=[3; 4; 9; 2] – вектор-столбец,

поэтому и матрицы небольших размерностей можно ввести либо:

по строкам

>> a=[3 1 -1;2 4 3]

a =

     3     1    -1

     2     4     3

либо по столбцам

>> a=[[3;2] [1;4] [-1;3]]

a =

     3     1    -1

     2     4     3

Для того, чтобы узнать размеры двумерного массива и «геометрию» векторов (вектор-столбцы или вектор-строки), нужно использовать функцию size.

>> size(a)

ans =

2    3

Первым показывается число строк, вторым – число столбцов.

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

Задание 18.

Введите одномерный массив b (1, 2, 3), как вектор-строку, узнай те его размер с помощью функции size, введите массив b1 (1, 2, 3), как вектор-столбец, узнайте его размер, введите переменную m = 5, узнайте ее размер.

Из полученных результатов видно, что даже числа (скалярные величины) система MatLab трактует как двумерные массивы с размером 1х1. Вектора рассматриваются, как матрицы, размер которых по одному из индексов равен 1.

Структуру созданных массивов можно узнать еще с помощью команды whos.

>> whos

  Name      Size            Bytes   Class

  a         2x3               48  double array

  b         1x3               24  double array

  b1        3x1               24  double array

  m         1x1                8  double array

Вычисления с массивами

Над массивами одинаковых размеров допускаются операции сложения (+) и вычитания (-).

Для поэлементного перемножения и деления массивов используются знаки «.*» и «./» (правое поэлементное деление).

Есть еще левое поэлементное деление. Знак «\.». Разница между ними такова

A ./ B | A .\ B
A(k,m) / B(k,m) | B(k,m) / A(k,m)

Привычные знаки «*» и «/» предназначены в системе MatLab для других операций: «*» в линейной алгебре, а «/» для нахождения корней систем линейных уравнений.

Транспонирование матрицы, так же как и векторов производится с помощью символов «.’».

Задание 19.

1. Введите матрицы

2. Найдите сумму элементов второй строки матрицы B.

3. Найдите сумму и разность матриц А и С.

4. Произведение матриц А и С.

5. Произведение матриц А и В, В и А.

6. Произведение числа 3 на А, и А на 3.

7. Возведите матрицу В в степень 2.

8. Произведите поэлементное возведение в степень 2 матрицы В.

9. Найдите значение следующего выражения

Решение систем линейных уравнений

Дана система из трех уравнений с тремя неизвестными:

Задание 20.

Введите коэффициенты при неизвестных в матрицу А, а правые части в вектор b. Решение найдите как результат от деления матрицы А на вектор b. >> x = A \ b


New Page 7

Трехмерная графика

Каждая точка в пространстве характеризуется тремя координатами. Набор точек, принадлежащих одной линии в пространстве нужно задать в виде трех векторов (первый должен содержать первые координаты этих точек, второй – вторые, третий – третьи). Вот эти три вектора и подаются на вход функции plot3, которая осуществит проектирование соответствующей трехмерной линии на плоскость и построит результирующее изображение.

Так, например, следующий фрагмент кода построит изображение, представленное на рисунке справа.

>> t=0:pi/50:10*pi;

>> x=sin(t);

>> y=cos(t);

>> plot3(x,y,t);

>> grid on

Если на вход функции plot3 подать не три вектора, а три матрицы одинакового размера, система MatLab построит семейство линий пересечения поверхности с набором параллельных друг другу плоскостей, которые к тому же параллельны одной из координатных плоскостей.

При построении трехмерного графика для отображения функции двух переменных следует:

  1. создать матрицы с координатами сетки на прямоугольной области определения функции;
  2. вычислить функцию в узлах сетки и записать полученные значения в матрицу;
  3. использовать одну из графических функций Matlab;
  4. нанести на график дополнительную информацию.

Например, для построения графика функции [image] на области определения в виде квадрата [image] , необходимо

  1. вначале разбить этот квадрат равномерной сеткой, что делается с помощью функции meshgrid:

>> [x,y]=meshgrid(0:0.2:1,0:0.2:1)

x =

         0    0.2000    0.4000    0.6000    0.8000    1.0000

         0    0.2000    0.4000    0.6000    0.8000    1.0000

         0    0.2000    0.4000    0.6000    0.8000    1.0000

         0    0.2000    0.4000    0.6000    0.8000    1.0000

         0    0.2000    0.4000    0.6000    0.8000    1.0000

         0    0.2000    0.4000    0.6000    0.8000    1.0000

y =

         0         0     0             0         0         0

    0.2000    0.2000    0.2000    0.2000    0.2000    0.2000

    0.4000    0.4000    0.4000    0.4000    0.4000    0.4000

    0.6000    0.6000    0.6000    0.6000    0.6000    0.6000

    0.8000    0.8000    0.8000    0.8000    0.8000    0.8000

    1.0000    1.0000    1.0000    1.0000    1.0000    1.0000

  2. Затем вычислить значения функции в узлах этой сетки. Это делается заданием команды:

>> z=x.^2+y.^2

z =

         0    0.0400    0.1600    0.3600    0.6400    1.0000

    0.0400    0.0800    0.2000    0.4000    0.6800    1.0400

    0.1600    0.2000    0.3200    0.5200    0.8000    1.1600

    0.3600    0.4000    0.5200    0.7200    1.0000    1.3600

    0.6400    0.6800    0.8000    1.0000    1.2800    1.6400

    1.0000    1.0400    1.1600    1.3600    1.6400    2.0000

  3. С помощью команды mesh построить график в виде каркасной поверхности:

>> mesh(x,y,z)

Для более точного построения следует выбрать более мелкий шаг построения сетки - 0.05.

Задание 21.

Постройте график функции

на прямоугольной области определения [image] в шести подокнах (subplot), используя различные графические функции, задавая заголовок каждому графику (title).

Функция | Действие
mesh(x,y,z) | строит каркасную поверхность
meshc(x,y,z) | строит каркасную поверхность и размещает на плоскости xy линии уровня функции (линии постоянства функции)
contour3 | строит поверхность, состоящую из линий уровня
surf | строит каркасную поверхность и заливает каждую клетку поверхности определенным цветом
surfc | строит каркасную поверхность, заливает каждую клетку поверхности определенным цветом и размещает на плоскости xy линии уровня функции
surfl | строит освещенную поверхность

Изменение цветовой палитры графика

Функция colormap(n), где n – палитра цвета устанавливает цветовую палитру графика. Палитра устанавливается для всего окна, для восстановления первоначального значения палитры применяют команду colormap(‘default’).

Палитра | Изменение цвета
autumn | плавное изменение: красный-оранжевый-желтый
gray | оттенки серого
bone | похожа на gray, но с легким оттенком синего
colorcube | каждый цвет изменяется от темного к яркому
cool | оттенки голубого и пурпурного цветов
copper | оттенки медного цвета
flag | циклическое изменение: красный-белый-синий-черный
hot | плавное изменение: черный-красный-оранжевый-желтый-белый
hsv | плавное изменение (как цвета радуги
jet | плавное изменение: синий-голубой-зеленый-желтый-красный
pink | похожа на gray, но с легким оттенком коричнего
prism | циклическое изменение: красный-оранжевый-желтый-зеленый-синий-фиолетовый
spring | оттенки пурпурного и желтого
summer | оттенки зеленого и желтого
vga | палитра Windows из 16 цветов
white | один белый цвет
winter | оттенки синего и зеленого

Задание 22.

Постройте график функции [image] , так как показано на рисунке. Для вывода столбика, устанавливающего соответствие между цветом и значением функции, используйте команду colorbar. Для обозначения имени оси используйте команду xlabel('x').

Поворот графика, изменение точки обзора

Изменение положения наблюдателя относительно графика осуществляет функция view, которая имеет аргументы – азимут и угол возвышения, отсчитываемые в градусах. Азимут отсчитывается от оси, противоположной y (по умолчанию –37.50), а угол возвышения от плоскости xy (по умолчанию 300).

Чтобы увидеть скрытую часть поверхности графика, построенного в задании 20, нужно задать >> view(135,45)

Чтобы развернуть тот же график вдоль оси y со стороны плоскости xz, нужно задать >>view(0,0)

Задание 23.

Понаблюдайте за графиком поверхности из различных точек.


new_page_8

М-файлы

Исследование функций

Интегрирование функций

Решение систем обыкновенных дифференциальных уравнений

Аналитические вычисления с помощью пакета расширения Symbolic Math Toolbox


new_page_9

М-файлы

Работа из командной строки MatLab затрудняется, если требуется вводить много команд и часто их изменять. Ведение дневника при помощи команды diary и сохранение рабочей среды незначительно облегчает работу. Самым удобным способом выполнения команд MatLab является использование М-файлов, в которых можно набирать команды, выполнять их все сразу или частями, сохранять в файле и использовать в дальнейшем. Для работы с М-файлами предназначен редактор М-файлов.

Работа в редакторе М-файлов

Загрузка редактора осуществляется командами меню Файл → Новый → М-файл.

Задание 1.

  1. Создайте новый М-файл.
  2. Наберите в редакторе команды построения двух графиков на одном графическом окне. Сохраните файл с именем myfile.m в папке Work каталога MatLab.
  3. Запустите на выполнение часть команд, относящихся к построению первого графика. Для этого выделите эти команды и нажмите клавишу F9. Посмотрите построенный график. Запустите на выполнение оставшиеся команды. Просмотрите окно графиков.
  4. Закройте созданный файл и откройте его заново.

Отдельные блоки М-файла можно снабжать комментариями, которые начинаются со знака % и автоматически выделяются зеленым цветом.

Типы М-файлов

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

При выполнении задания 1 была создана файл-программа (файл-процедура) myfile. Переменные, определенные в ней, можно использовать в других файл-программах и в командах, выполняемых из командной строки. Выполнение команд в файл-программе, осуществляется двумя способами:

1. Из редактора М-файлов так, как в задании 1.

2. Из командной строки или другой файл-программы, при этом в качестве команды используется имя М-файла.

Задание 2.

Закройте файл, наберите в командной строке myfile и нажмите Enter. Появится графическое окно, соответствующее командам в файл-программе.

Фактически, созданный М-файл становится командой, которую понимает MatLab.

Команды для установления путей

Если М-файл сохраняется вне основного каталога MatLab, к нему нужно установить путь.

Текущий каталог устанавливается командой cd c:\users\my.

Путь устанавливается командой:

path(path,’c:\users\my’) добавляется каталог с низшим приоритетом поиска;

или командой:

path(path,’c:\users\my’,path) добавляется каталог с высшим приоритетом поиска.

Файл-функции

Файл-функции в отличие от файл-программ имеют входные и выходные аргументы. Входные аргументы передаются в файл-функцию которая производит с ними необходимые действия и возвращает результат в выходных аргументах.

Пример. В вычислениях часто используется функция

Задание 3.

1. Откройте в редакторе М-файлов новый файл и наберите текст

function f=myfun(x)

f=exp(-x)*sqrt((x^2+1)/(x^4+0.1));

Ключевое слово function в первой строке определяет, что данный файл содержит файл-функцию. Первая строка является заголовком функции, в которой размещается имя функции (myfun) и списки входных (x) и выходных аргументов (f). После заголовка следует тело функции (в данном примере это одна строка), где и вычисляется ее значение. Важно, что вычисленное значение записывается в f.

2. Сохраните файл в рабочем каталоге с предложенным MatLab именем myfun.

Созданную таким образом функцию можно использовать так же, как и встроенные функции sin, cos и другие.

3. Вызовите полученную функцию из командной строки

>> y=myfun(1.3)

y =

    0.2600

Вызов собственных функций может осуществляться также из файл-программы и из другой файл-функции.

Полученная файл-функция будет работать только с одним значением, но не с массивом значением.

Задание 3.

Измените тело функции, используя поэлементные операции. Сохраните изменения. Проверьте работу функции, задав в качестве входных параметров вектор х.

Задание 4.

Постройте график функции myfun на отрезке [0,4] с шагом 0.5 из командной строки.

Файл-функцию можно использовать в качестве аргументов некоторых команд. Например, для построения графика можно использовать специальную функцию fplot, которая одна заменит последовательность команд использованных для выполнения задания 4.

Задание 5.

Постройте график myfun при помощи функции fplot на тех же осях, что и график из задания 4, использовав следующие команды:

>> hold on

>> fplot('myfun',[0 4])

У вас должны получиться следующие графики:

График, построенный с помощью fplot , более точно отражает поведение функции, т.к. fplot сама подбирает шаг аргумента, уменьшая его на участке быстрого изменения функции.

Файл-функции с несколькими входными аргументами

Написание файл-функций с несколькими входными аргументами практически не отличается от случая с одним аргументом. Все входные аргументы размещаются в списке через запятую. Например, файл-функция, вычисляющая длину радиус-вектора точки трехмерного пространства, запишется как:

function r=radius3(x,y,z)

r=sqrt(x.^2+y.^2+z.^2);

а ее вызов:

>> R=radius3(1,1,1)

R =

    1.7321

Файл-функции с несколькими выходными аргументами

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

Хорошим примером является функция, переводящая время, заданное в секундах, в часы, минуты, секунды.

function [hour,minute,second]=hms(sec)

hour=floor(sec/3600);

minute=floor((sec-hour*3600)/60);

second=sec-hour*3600-minute*60;

Вызов такой файл-функции:

>> [H,M,S]=hms(10000)

H =

     2

M =

    46

S =

    40


New Page 10

Исследование функций

Решение произвольных уравнений F(x)=0

Встроенная функция fzero позволяет приближенно вычислить корень уравнения по заданному начальному приближению.

Синтаксис x = fzero('имя_файл-функции', х0),

где имя_файл-функции – функция, вычисляющая левую часть уравнения;

х0 – начальное приближение к корню;

х – найденное приближенное значение корня.

Задание 6.

1. Создайте файл-функцию с именем myf, вычисляющую левую часть уравнения [image] .

2. Постройте график этой функции на отрезке [-5, 5] с помощью команды fplot и нанесите сетку.

Из полученного графика видно, что функция на этом отрезке имеет четыре корня. Один корень равен нулю.

3. Проверьте этот корень, подставив его в уравнение.

4. Уточните значение корней вблизи –5, -2, 5 с помощью встроенной функции fzero.

Ответ: x1 = -4.7566, x2 = -1.8539, x3 = 4.6665

5. Выясните точность вычислений, с которой найдены решения, задав в командной строке встроенную функцию eps.

Функция fzero вычисляет только те корни, в которых функция меняет знак, а не касается оси абсцисс. Найти корень уравнения [image] [image] c ее помощью не удастся.

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

>> x=fzero('myf',[-3,-1])

x =

   -1.8539

Чтобы получить приближенное значение корня и значение функции в этой точке нужно вызвать fzero с двумя выходными параметрами:

>> [x,y]=fzero('myf',[-3,-1])

x =

   -1.8539

y =

 -2.2204e-016

Вычисление всех корней полинома

Полином задается вектором его коэффициентов. Например, [image] задается следующим образом:

>> p=[1 0 3.2 -5.2 0 0.5 1 -3];

Для вычисления значения полинома от некоторого аргумента используют следующую функцию

>> polyval(p,1)

ans =

   -2.5000

Аргументом может быть матрица или вектор, в этом случае результат также будет матрицей или вектором того же размера, что и аргумент.

Задание 7.

Найдите значения полинома для следующего вектора значений аргумента [2 3 4 5].

Сразу все корни полинома находятся с помощью функции roots:

>> r=roots(p)

r =

  -0.5668 + 2.0698i

  -0.5668 - 2.0698i

  -0.6305 + 0.5534i

  -0.6305 - 0.5534i

   1.2149

   0.5898 + 0.6435i

   0.5898 - 0.6435i

Задание 8.

Вычислите значения полинома от вектора его корней, указав в качестве аргумента вектор r.

Минимизация функций

Одной переменной. Поиск осуществляется при помощи функции fminbnd.

Задание 9.

1. Создайте файл-функцию для задания функции [image] , назовите ее ftest.

2. Постройте график этой функции на отрезке [0, 2], используя fplot и сетку.

Из графика видно, что исследуемая функция имеет три локальных минимума.

3. Вычислите значение х, при котором достигается второй локальный минимум, задав функцию fminbnd следующим образом:

>> x2=fminbnd('ftest',0.7,2)

x2 =

    1.1554

Первый аргумент функции fminbnd - имя файл-функции, второй и третий – границы отрезка, на котором ищется локальный минимум.

Для одновременного вычисления значения функции в точке минимума функция fminbnd вызывается с двумя аргументами:

>> [x2,f]=fminbnd('ftest',0.7,2)

x2 =

    1.1554

f =

   -0.3132

Для нахождения локального максимума следует искать минимум функции с обратным знаком.

Задание 10.

Исследуйте функцию [image] на отрезке [0, 3].

Найдите ее корни, локальные минимумы и максимумы.

Нескольких переменных. Осуществляется с помощью функции fminsearch. Например, нужно найти локальный минимум функции [image] на отрезке [0, 2]. Сначала нужно получить представление о поведении функции, для этого следует построить ее линии уровня с помощью команды contour.

>> [x,y]=meshgrid(0:0.01:2);

>> z=sin(pi*x).*sin(pi*y);

>> v=[-0.96 -0.9 -0.8 -0.5 -0.1 0.1 0.5 0.8 0.9 0.96];

>> [Cm,h]=contour(x,y,z,v);

>> clabel(Cm,h)

>> colormap(gray)

Вектор v задает значения функции, для которых строятся линии уровня. Команда clabel(Cm,h) снабжает на графике линии уровня значениями, которые принимает на них исследуемая функция.

На получившемся графике видно расположение локальных минимумов и максимумов.

Далее необходимо создать файл-функцию, вычисляющую значения искомой функции. Входным аргументом функции должен быть вектор, первый элемент которого соответствует переменной х, а второй – y.

function f=ftest1(vector)

x=vector(1);

y=vector(2);

f=sin(pi*x).*sin(pi*y);

Локальный минимум ищется с помощью функции fminsearch с двумя входными аргументами – именем файла-функции и начальным приближением. Выходной параметр содержит координаты искомой точки минимума.

>> m=fminsearch('ftest1',[0.4,1.6])

m =

    0.5000    1.5000


New Page 11

Интегрирование функций

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

Вычисление определенных интегралов

Метод трапеций. Самый простой и довольно успешно применяемый, он хорошо подходит для интегрирования не слишком гладких функций. Реализуется с помощью функции trapz.

Integ = trapz(x,y);

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

Например, нужно вычислить интеграл

>> dx=pi/10; x=0:dx:pi;y=cos(x);i1=trapz(x,y);

>> i1

i1 =

  3.8858e-016

Такой точный результат скорее исключение, чем правило. Обычно для достижения высокой точности требуется выполнять интегрирование с очень малым шагом, а контроль точности осуществляется путем сравнения последовательных результатов.

Задание 11.

Вычислить интеграл [image] методом трапеций, задавая разные шаги интегрирования: 1 0.1 0.01 0.001.

1. Создайте файл-функцию fint1, вычисляющую подынтегральное выражение.

2. Задайте вектор аргументов x с первым шагом интегрирования.

3. Для вычисления интеграла в командной строке используйте функцию trapz, задав первым параметром вектор аргументов x, вторым - обращение к файл-функции trapz(x,fint1(x)).

4. Задайте вектор аргументов x со вторым шагом интегрирования, повторите вычисление интеграла и т.д.

При шагах интегрирования 0.01 и 0.001 получится одинаковый результат.

Вывод: в пределах четырех десятичных цифр после запятой результат получен окончательно.

Методы Симпсона и Лобатто. Если функция под знаком интеграла гладкая (существуют и непрерывны несколько первых производных), то лучше применять методы интегрирования более высоких порядков точности. В системе MatLab эти методы реализуются функциями quad (метод Симпсона) и quadl (метод Лобатто). Эти методы также самостоятельно контролируют достижение точности результата. Минимальный формат вызова этих функций включает в себя три параметра: описатель подынтегральной функции, нижний предел интегрирования и верхний предел интегрирования. Четвертый параметр является требуемой относительной точностью результата вычислений.

Задание 12.

Вычислить интеграл от файл-функции, исследованной в задании 10, используя функции quad и quadl.

>> [I, cnt]=quad('имя файл_функции',0,3)

>> [I, cnt]=quadl('имя файл_функции',0,3)

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

Ответ:

quad | quadl
i = 23.9681 cnt = 213 | i = 23.9681 cnt = 468

Вывод: При интегрировании данной функции преимущество имеет метод quad, так как для достижения минимальной точности ему требуется меньшее количество вычислений с подынтегральной функцией (205 против 468).

Задание 13.

Вычислить интеграл [image] методами трапеций, Симпсона, Лобатто. Сделать выводы.

Вычисление двойных интегралов

Вычисление двойных интегралов сводятся к вычислению повторных определенных интегралов, один из которых является внутренним, а другой – внешним. Для этого в MatLab существует специальная функция dblquad.

Например, необходимо вычислить интеграл

Для этого необходимо оформить подынтегральную функцию следующим образом:

function z=f(x,y)

z=x.*sin(y)+y.*sin(x);

и вызвать функцию

>> ii=dblquad('f',0,1,1,2)

ii =

    1.1678

Задание 14.

Вычислить интеграл [image] .

Функции quad, quadl, dblquad можно назвать «интеллектуальными решателями», они самостоятельно ведут процесс вычислений, на ходу определяя нужные размеры шагов интегрирования.


New Page 12

Решение систем обыкновенных дифференциальных уравнений

Для решения систем ОДУ в системе Matlab также имеются необходимые решатели. Это функции ode23, ode45, ode15s, ode23s, ode23t, ode23tb. Их еще называют солверами.

Функции с суффиксом s предназначены для решения так называемых «систем жестких дифференциальных уравнений». Для всех остальных систем дифференциальных уравнений наиболее употребительной является функция ode45, реализующая алгоритм Рунге-Кутта 4-5 порядков (разные порядки точности используются для контроля шага интегрирования).

Систему ОДУ можно записать в общем виде:

Т.е. она состоит из n уравнений, разрешенных относительно первых производных функций y1, y2, …, yn (это все функции от x). Если определить векторы-столбцы Y и F , состоящие из y1, y2, …, yn и F1, F2, …, Fn соответственно, то систему уравнений можно записать в векторном виде: Y´ = F(x,Y)

Например, требуется решить задачу о колебаниях под воздействием внешней силы в среде, оказывающей сопротивление колебаниям. Уравнение, описывающее движение, имеет вид

Предположим, что координата точки в начальный момент времени равнялась 1, а скорость 0.

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

y1=y, y2=y´.

Тогда система уравнений с начальными условиями такова

Чтобы применить «решатель» ode45 нужно оформить правую часть уравнений F(x,Y) в виде собственной М-функции. Эта функция в данной задаче имеет два входных аргумента: переменную x, по которой производится дифференцирование, и вектор y, размер которого равен числу неизвестных функций системы. Выходным аргументом файл-функции является вектор F правой части системы.

Файл-функция oscil:

function F=oscil(x,y)

F=[y(2);-2*y(2)-10*y(1)+sin(x)];

Файл-программа solvdem для решения дифференциального уравнения:

% формирование вектора начальных условий

y0=[1;0];

% вызов солвера ode45 от файл-функции oscil, [0 15] - начальный и

% конечный момент времени, y0 - вектор начальных условий

[Х,Y]=ode45('oscil',[0 15],y0);

% вывод графика исходного дифференциального уравнения

plot(Х,Y(:,1),'r')

% вывод графика производной

hold on

plot(Х,Y(:,2),'k--')

grid on

legend('координата','v',4)

xlabel('х')

ylabel('y, y\prime ')

title('Решение y\prime\prime+2y\prime+10y=sint')

В результате выполнения файл-программы solvdem на экран выводятся графики, изображенные на рисунке, которые отражают поведение координаты точки и ее скорости в зависимости от времени. Из графика видно, что приближенное решение и его производная удовлетворяют начальным условиям, колебание происходит в установившемся режиме, начиная с х=5.


New Page 13

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

В настоящее время существуют десятки официально распространяемых пакетов расширения. Среди них:

Название | Назначение
Partial Differential Equations Toolbox | Решение систем дифференциальных уравнений с частными производными
Statistics Toolbox | Решение задач статистики
Optimization Toolbox | Решение оптимизационных задач
Image Processing Toolbox Wavelet Toolbox | Решение задач обработки изображений
Fuzzy Logic Toolbox | Решение задач нечеткой математики
Simulink, Control System Toolbox, Signal Processing Toolbox | Инженерные пакеты для моделирования различных динамических систем, электрических цепей и сигналов
Financial Toolbox | Пакет по экономике

Аналитические вычисления с помощью пакета расширения Symbolic Math Toolbox

Это пакет лицензирован у фирмы Waterloo Maple Software, Canada и включен в состав дистрибутива пакета MatLab на правах пакета расширения.

Позволяет в рамках системы MatLab осуществлять аналитические вычисления и аналитические преобразования выражений, а также выполнять арифметические вычисления с контролируемой точностью, которую можно заказать заранее.

Последние две возможности осуществляются с помощью двух функций – digits и vpa. Первая устанавливает требуемую точность в количестве верных десятичных знаков после запятой, а вторая – осуществляет вычисления с заданной точностью.

Например,

>> digits(30);

>> vpa(pi)

 ans =

 3.14159265358979323846264338328

>> digits(40);

>> vpa(exp(1))

 ans =

 2.718281828459045534884808148490265011787

С помощью функции sym можно получить объекты нового типа – алгебраические объекты типа sym, к которым применимы правила алгебры и математического анализа

Например,

>> x=sym('x');y=sym('y');

>> x+y+3*y

 ans =

 x+4*y

В рамках пакета Symbolic Math Toolbox имеется возможность осуществлять над переменными типа sym гигантское количество операций и применять к ним множество интересных функций.

Рассмотрим некоторые из них.

Упростить символьные выражения

>> simplify((x^2-2*x*y+y^2)/(x-y))

 ans =

 x-y

Раскрыть алгебраические и функциональные выражения

>> expand(sin(x+y))

 ans =

 sin(x)*cos(y)+cos(x)*sin(y)

Перемножить многочлены

>> expand((x+y)*(x-y)*(2*x-3*y))

 ans =

 2*x^3-3*x^2*y-2*y^2*x+3*y^3

Разложить многочлен

>> factor(x^5-1)

 ans =

 (x-1)*(x^4+x^3+x^2+x+1)

Разложить на произведение простых чисел

>> factor(sym(123456789))

 ans =

 (3)^2*(3803)*(3607)

Осуществить подстановку новых выражений

>> syms x y a b ‘объявляет сразу несколько алгебраических объектов типа sym

>> subs(x*y,[x,y],[a+b,a-b])

 ans =

 (a+b)*(a-b)

Вычислить аналитически детерминант матрицы

>> syms x y a b

>> det([x,y;a,b])

 ans =

 x*b-y*a

Найти аналитически обратную матрицу

>> syms x y a b

>> inv([x,y;a,b])

 ans =

 [  b/(x*b-y*a), -y/(x*b-y*a)]

[ -a/(x*b-y*a),  x/(x*b-y*a)]

Символьное дифференцирование

>> y=x^2-4*x-7;

>> diff(y,x) ’продифференцировать y по х

 ans =

 2*x-4

Символьное интегрирование

>> y=1/sin(x);

>> int(y,x)

 ans =

 log(csc(x)-cot(x))

Аналитическое вычисление пределов

>> limit(sin(x)/x)

 ans =

 1

Аналитическое вычисление пределов с указанием аргумента и предела аргумента

>> limit(sin(x-2)/(x-2),x,2)

 ans =

 1

Аналитическое разложение в ряд Тейлора с указанием окрестности точки х=0, и порядка разложения

>> y=sin(x);

>> taylor(y,0,8)

 ans =

 x-1/6*x^3+1/120*x^5-1/5040*x^7

Аналитическое решение алгебраического уравнения

>> syms x a b c;solve(a*x^2+b*x+c)

 ans =

[ 1/2/a*(-b+(b^2-4*a*c)^(1/2))]

[ 1/2/a*(-b-(b^2-4*a*c)^(1/2))]

Аналитическое решение дифференциального уравнения y´´ = - y; y(0) = 0; y´(0) = 1;

>> dsolve('D2y=-y','y(0)=0','Dy(0)=1','x')

 ans =

 sin(x)

Аналитическое решение дифференциального уравнения y´´ = y; y(0) = 0; y´(0) = 1;

>> dsolve('D2y=y','y(0)=0','Dy(0)=1','x')

 ans =

 sinh(x)


new_page_o

Работа в интерактивном режиме

М-файлы