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

 

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

Введите две вектор-строки :

» vl = [2 -3 4 1 ];

» v2 = [7 5 -6 9];

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

» u = vl.*v2

u =

14 -15 -24 9

При помощи .^ осуществляется поэлементное возведение в степень:

» р = vl.^2

p =

4 9 16 1

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

P = vl.^v2

P=

128.0000 -243.0000 0.0002 1.0000

Деление соответствующих элементов векторов одинаковой длины выполняется с использованием операции ./

> d = vl./v2

d=

0.2857 -0.6000 -0.6667 0.1111

 

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

К поэлементным относятся и операции с вектором и числом. Сложение вектора и числа не приводит к сообщению об ошибке. MatLab прибавляет число к каждому элементу вектора. То же самое справедливо и для вычитания:

> v = [4 6 8 10] ;

> s = v + 1.2

S=

5.2000 7.2000 9.2000 11.2000

> s1 = 1.2 + v

s1=

5.2000 7.2000 9.2000 11.2000

> г = 1.2 - v

R=

2.8000 4.8000 6.8000 8.8000

> rl = v 1.2

2.8000 4.8000 6.8000 8.8000

Умножать вектор на число можно как справа, так и слева:

> v = [4 6 8 10];

р =v*2

p=

8 12 16 20

» p1 = 2*v

P1=

8 12 16 20

Делить при помощи знака / можно вектор на число:

» р = v/2

Р =

2 3 4 5

Попытка деления числа на вектор приводит к сообщению об ошибке:

» р = 2/v

??? Error using ==> /

Matrix dimensions must agree.

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

» w = [4 2 6] ;

» d = 12./w

d =

3 6 2

Все вышеописанные операции применимы как к вектор-строкам, так и к вектор-столбцам.

Построение таблицы значений функции

 

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

Y(x) =(sin(x)^2/(1+cos(x))+exp(-x)*ln(x)

точках 0.2, 0.3, 0.5, 0.8, 1.3, 1.7, 2.5. Задача решается в два этапа.

1. Создайте вектор-строку х, содержащую координаты заданных точек.

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

>>х = [0.2 0.3 0.5 0.8 1.3 1.7 2.5]

X=

0.2000 0.3000 0.5000 0.8000 1.3000 1.7000 2.5000

у = sin(x).^2./(1+cos(х))+ехр(-х).*log(x)

y=

-1.2978 -0.8473 -0.2980 0.2030 0.8040 1.2258 1.8764

Обратите внимание, что при попытке использования операций возведения в степень, деления / и умножения * (которые не относятся к поэлементным) выводится сообщение об ошибке уже при возведении sin (х) в квадрат:

> у = sin(x)^2/(1+cos(х))+ехр(-х)*log(x)

??? Error using ==> ^

Matrix must be square.

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

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

» х = [1, 1.2, 1.4, 1.6, 1.8, 2.0]

х =

1.0000 1.2000 1.4000 1.6000 1.8000 2.0000

» х = [1:0.2:2]

х =

1.0000 1.2000 1.4000 1.6000 1.8000 2.0000

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

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

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

» х = [1:0.2:1.9]

х =

1.0000 1.2000 1.4000 1.6000 1.8000

вектор-строка заполнится до элемента, не превосходящего определенное нами конечное значение. Шаг может быть и отрицательным:

x= [1.9 :-0.2 :1]

x=

1.9000 1.7000 1.5000 1.3000 1.1000

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

Попробуйте заполнить вектор-столбец элементами, начинающимися с нуля и заканчивающимися 0.5 с шагом 0.1. Для этого следует задать вектор-строк у, а затем использовать операцию транспонирования:

x= [0 : 0.1 : 0.5] '

x=

0.1000

0.2000

0.3000

0.4000

0.5000

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

Шаг, равный единице, допускается не указывать при автоматическом заполнении:

> х = [1:5]

x=

1 2 3 4 5

Выведите теперь таблицу значений функции

на отрезке [0, 1] с шагом 0.05, произведя следующие действия:

3. Сформируйте вектор-строку х при помощи двоеточия.

4. Вычислите значения у(х)от элементов х (не забудьте использовать поэлементное умножение).

5. Запишите результат в вектор-строк у у.

6. Выведите х и у.

Результат, отображенный на экране, не очень напоминает таблицу:

> х = [0:0.05:1];

» у = ехр(-х).*sin(10*x) ;

» x

x =

Columns 1 through 7

0 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000

Columns 8 through 14

0.3500 0.4000 0.4500 0.5000 0.5500 0.6000 0.6500
Columns 15 through 21

0.7000 0.7500 0.8000 0.8500 0.9000 0.9500 1.0000
» y

y=

Columns 1 through 7

0 0.4560 0.7614 0.8586 0.7445 0.4661 0.1045

Columns 8 through 14

-0.2472 -0.5073 -0.6233 -0.5816 -0.4071 -0.1533 -0.1123
Columns 15 through 21

0.3262 0.4431 0.4445 0.3413 0.1676 -0.0291 -0.2001

Вектор-строки х и у состоят из двадцати одного элемента, не помещаются на экране в одну строку и выводятся по частям. Так как х и у хранятся в двумерных массивах размерностью один на двадцать один, то выводятся по столбцам, каждый из которых состоит из одного элемента. Сначала выводятся столбцы с первого по седьмой (columns i through 7), затем — с восьмого по четырнадцатый (columns 8 through 14), и наконец — с пятнадцатого по двадцать первый (columns is through 21). Более наглядным и удобным является графическое представление функции.

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

 

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

определенной на отрезке [0, 1]. Вывод отображения функции в виде графика состоит из следующих этапов:

· Задание вектора значений аргумента х.

· Вычисление вектора у значений функции у(х).

· Вызов команды plot для построения графика.

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

>>x= [0:0.05:1];

>> y = ехр(х).*sin(10*x) ;

>>plot( х,у)

После выполнения команд на экране появляется окно Figure No. 1 с графиком функции, изображенное на рис. 2.1. Окно содержит меню, панель инструментов и область графика.

Рис. 2.1. Простейший график функции

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


от этих аргументов. Команда plot соединяет точки с координатами (x(i), у (i)) прямыми линиями, автоматически масштабируя оси для оптимального расположения графика в окне. При построении графиков удобно расположить на экране основное окно MatLab и окно с графиком рядом так, чтобы они не перекрывались, как показано на рис. 2.2.

Рис. 2.2. Расположение окон

Построенный график функции не должен иметь изломов, т. к. сама функция гладкая. Для точного построения графика вычислите функцию в большем числе точек на отрезке [0, 1], т. е. задайте меньший шаг при вводе вектора х. Не забудьте, что можно занести в командную строку введенные ранее команды при помощи клавиш <↑>, <↓>, затем отредактировать их и выполнить, нажав <Enter>. Следующие команды:

» х = [0:0.01:1];

» у = ехр(-х).*sin(10*x);

» plot(x, у)

приводят к построению графика функции в виде плавной кривой, изображенной на рис. 2.3.

Сравнение нескольких функций удобно производить, отобразив их графики на одних осях. Например, постройте на отрезке [-1, - 0.3] графики функций

f(x)=sin(1/x^2), g(x)=sin(1.2/x^2)

при помощи последовательности команд, приведенной ниже:

>>x= [1:0.005:0.3];

>>f =sin(х.^-2);

>>sin(1.2*х.^-2);

plot(х, f, x, g)

Рис. 2.3. Гладкий график функции

 

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

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

>> plot(x, f, 'k-', x, g, 'k:')

осуществляет построение первого графика сплошной черной линией, а второй черной пунктирной (рис. 2.5). Аргументы 'k' и 'k:' задают стиль и цвет первой и второй линий. Здесь k означает черный цвет, а дефис или двоеточие — сплошную или пунктирную линию.

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