
- •Лабораторная работа №2 Работа с массивами
- •Основные определения и соглашения
- •Вектор-столбцы и вектор-строки Ввод, сложение и вычитание векторов
- •Обращение к элементам вектора
- •Применение функций обработки данных к векторам
- •Поэлементные операции с векторами
- •Построение таблицы значений функции
- •Построение графиков функции одной переменной
Поэлементные операции с векторами
Выше вектор использовался в качестве аргумента математических функций, результатом которых являлся вектор с элементами, равными значениям функции от соответствующих элементов исходного вектора. Таким образом, происходило поэлементное вычисление вызываемой функции. В этом разделе подробно описаны возможности поэлементной работы с векторами, которые понадобятся в дальнейшем для определения собственных (пользовательских) функций и построения их графиков.
Введите две вектор-строки :
» 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. Задача решается в два этапа.
Создайте вектор-строку х, содержащую координаты заданных точек.
Вычислите функцию у(х) от каждого элемента вектора х и запишите полученные значения в вектор-строку у. Важно только сделать это правильно! Необходимо найти значения функции для каждого из элементов вектор-строки х, поэтому операции в выражении для функции должны выполняться поэлементно, как было описано выше.
>>х = [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
0.1000
0.2000
0.3000
0.4000
0.5000
Обратите внимание, что элементы вектора, заполняемого при помощи двоеточия, могут быть только вещественные, поэтому для транспонирования можно использовать апостроф вместо точки с апострофом.
Шаг, равный единице, допускается не указывать при автоматическом заполнении:
> х = [1:5]
x=
1 2 3 4 5
Выведите теперь таблицу значений функции
на отрезке [0, 1] с шагом 0.05, произведя следующие действия:
Сформируйте вектор-строку х при помощи двоеточия.
Вычислите значения у(х)от элементов х (не забудьте использовать поэлементное умножение).
Запишите результат в вектор-строк у у.
Выведите х и у.
Результат, отображенный на экране, не очень напоминает таблицу:
> х = [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). Более наглядным и удобным является графическое представление функции.