Тема-3-5. Основы работы с математическими пакетами (MathCad)
Скачать 3.25 Mb.
|
Тема 3.5. Основы работы с математическими пакетами Страница 309 Пример 3.5.3-17 >>f=(a.*sin(a)+a.^2)./(a+1); >> Часто требуется вычислить функцию от вектора значений аргумента, отличающихся друг от друга на постоянный шаг. Для создания таких векторов-строк предусмотрена операция двоеточие - :, которая отделяет начальное значение аргумента, шаг и конечное значение аргумента. Пример 3.5.3-18 >>x=-1.2:0.5:1.8 x = -1.2000 -0.7000 -0.2000 0.3000 0.8000 1.3000 1.8000 >>f=(x.*sin(x)+x.^2)./(x+1) f = -12.7922 3.1365 0.0997 0.1374 0.6744 1.2794 1.7832 >> Шаг может быть отрицательным, в этом случае начальное значение должно быть больше, либо равно конечному значению для получения непустого вектора. Если шаг равен единице, то его можно не указывать, например: Пример 3.5.3-17 >>n=-3:4 n = -3 -2 -1 0 1 2 3 4 >> Ясно, что для заполнения вектор-столбца элементами с постоянным шагом следует транспонировать вектор-строку. Создание векторов при помощи двоеточия и умение производить поэлементные операции необходимо для визуализации массивов данных. Пример 3.5.3-18 >>x=10:-2:0 x = 10 8 6 4 2 0 >>sin(x)= -0.5440 0.9894 -0.2794 -0.7568 0.9093 0 >> Необходимо отметить, что при умножении векторов друг на друга получается скаляр. Пример 3.5.3-19 >>y=[2 3 5 8 3 9]; >>x*y ??? Error using ==> * Inner matrix dimensions must agree. >> Здесь допущена ошибка, так как матрицы (векторы) не согласованны. Правильно будет: Тема 3.5. Основы работы с математическими пакетами Страница 310 Пример 3.5.3-20a >>x*y' ans = 112 >> или можно было создать у как матрицу-столбец: Пример 3.5.3-20b >>y=[2;3;5;8;3;9] >> MatLab обладает большим набором встроенных функций для обработки векторных данных, часть из них приведена в табл. 3.5.3-6. Таблица. 3.5.3-6 Функции Назначение s=sum(a) Сумма всех элементов вектора a p=prod(a) Произведение всех элементов вектора a m=max(a) Нахождение максимального значения среди элементов вектора a [m,k]=max(a) Второй выходной аргумент k содержит номер максимального элемента в векторе a m=min(a) Нахождение минимального значения среди элементов вектора a [m,k]=min(a) Второй выходной аргумент k содержит номер минимального элемента в векторе a m=mean(a) Вычисление среднего арифметического элементов вектора a a1=sort(a) Упорядочение элементов вектора a по возрастанию [a1,ind]=sort(a) Второй выходной аргумент ind является вектором из целых чисел от 1 до length(a), который соответствует проделанным перестановкам Полный список имеющихся функций выводится в командное окно при помощи команды help datafun, а для получения подробной информацию о каждой функции требуется указать ее имя в качестве аргумента команды help. Обратите внимание на то, что ряд функций допускает обращение к ним как с одним, так и с двумя выходными аргументами. В случае нескольких выходных аргументов они заключаются в квадратные скобки и отделяются друг от друга запятой. Очень часто требуется обработать только часть вектора, или обратиться к некоторым его элементам. Разберем правила MatLab, по которым производится индексация векторных данных. Для доступа к элементу вектора необходимо указать его номер в круглых скобках сразу после имени переменной, в которой содержится вектор. Например, сумма первого и третьего элементов вектора y находится при помощи выражения Пример 3.5.3-21 >>s=y(1)+y(3); >> Тема 3.5. Основы работы с математическими пакетами Страница 311 Обращение к последнему элементу вектора можно произвести с использованием аргумента end, то есть y(end) и y(length(v)) приводят к одинаковым результатам. Указание номеров элементов вектора можно использовать и при вводе векторов, последовательно добавляя новые элементы (не обязательно в порядке возрастания их номеров). Пример 3.5.3-22 >>h=10; >>h(2)=20; >>h(4)=40 h = 10 20 0 40 >> Заметим, что для ввода первого элемента h не обязательно указывать его индекс, так как при выполнении оператора h=1 создается вектор (массив размера один на один). Следующие операторы присваивания приводят к автоматическому увеличению длины вектора h, а пропущенные элементы (в нашем случае h(3)) получают значение ноль. Индексация двоеточием позволяет выделить идущие подряд элементы в новый вектор. Начальный и конечный номера указываются в круглых скобках через двоеточие, например: Пример 3.5.3-23 >>z=[0.2 -3.8 7.9 4.5 7.2 -8.1 3.4]; >>znew=z(3:6) znew = 7.9000 4.5000 7.2000 -8.1000 >> Применение встроенных функций обработки данных к некоторым последовательно расположенным элементам вектора не представляет труда. Следующий вызов функции prod() вычисляет произведение элементов вектора z со второго по шестой: Пример 3.5.3-24 >>p=prod(z(2:6)) >> Индексация векторов служит для выделения элементов с заданными индексами в новый вектор. Индексный вектор должен содержать номера требуемых элементов, например: Пример 3.5.3-25 >>ind=[3 5 7]; >>znew=z(ind) znew = 7.9000 7.2000 3.4000 >> Для нахождения суммы элементов произвольного вектора z с четными индексами необходимо выполнить следующие команды: Тема 3.5. Основы работы с математическими пакетами Страница 312 Конструирование новых векторов из элементов имеющихся векторов производится при помощи квадратных скобок. Следующий оператор приводит к образованию вектора, в котором пропущен пятый элемент вектора z. Пример 3.5.3-27 >>znew=[z(1:4) z(6:end)] znew = 0.2000 -3.8000 7.9000 4.5000 -8.1000 3.4000 >> Для определения матрицы необходимо задать значение элементов строк и разделить строки матрицы символом - ;, заключенными в квадратные скобки: А=[v1;v2;v3], где v1, v2, v3 -векторы одинаковой размерности. Кроме того для определения матриц существует множество функций. Некоторые из них приведены в табл. 3.5.3-7. Таблица. 3.5.3-7 Функция Результат и примеры вызовов zeros Нулевая матрица F=zeros(4,5) F=zeros(3) F=zeros([3 4]) eye Единичная прямоугольная матрица (единицы расположены на главной диагонали) I=eye(5,8) I=eye(5) I=eye([5 8]) ones Матрица, целиком состоящая из единиц E=ones(3,5) E=ones(6) E=ones([2 5]) rand Матрица, элементы которой — случайные числа, равномерно распределенные на интервале (0,1) R=rand(5,7) R=rand(6) R=rand([3 5]) randn Матрица, элементы которой — случайные числа, распределенные по нормальному закону с нулевым средним и дисперсией, равной единице N=randn(5,3) N=randn(9) N=randn([2 4]) diag 1) диагональная матрица, элементы которой задаются во входном аргументе – векторе D=diag(v) 2) диагональная матрица со смещенной на k позиций диагональю (положительные k — смещение вверх, отрицательные — вниз), результатом является квадратная матрица размера length(v)+abs(k) D=diag(v,k) 3) выделение главной диагонали из матрицы в вектор d=diag(A) 4) выделение k-ой диагонали из матрицы в вектор d=diag(A,k) Пример 3.5.3-26 >>ind=2:2:length(z); >>s=sum(z(ind)) >> Тема 3.5. Основы работы с математическими пакетами Страница 313 Рассмотрим примеры формирования матриц. Пример 3.5.3-28 >>Z=zeros(3,5) Z = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >>A=[1 2 3 4; 5 6 7 8; 9 10 11 12] ; %матрица А(4х3) A = 1 2 3 4 5 6 7 8 9 10 11 12 >> Причем элементами матрицы могут быть матрицы или вектора. Пример 3.5.3-29 % первая "строка" матрицы К–матрица А, % вторая – вектор [1 2 3 4] >>K=[A;1 2 3] K = 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 >> Таким образом, как нам уже известно, вектор является матрицей с числом строк или столбцов равным 1, а число – матрица из одного элемента: Пример 3.5.3-30 >>x=[1 2 3 4] x = 1 2 3 4 >>c=1.256 c = 1.2560 >> Над матрицами и элементами матрицы можно выполнять различные операции, но при этом необходимо учитывать правила работы с матрицами. Рассмотрим примеры этих операций. Тема 3.5. Основы работы с математическими пакетами Страница 314 1) Умножение матрицы A на матрицу B: Пример 3.5.3-31 >>B=[2 5; 6 4; 6 5; 8 3] B = 2 5 6 4 6 5 8 3 >>C=A*B C = 64 40 152 108 240 176 >> 2) Умножение соответствующих элементов матриц необходимо использовать оператор поэлементного доступа ".": Пример 3.5.3-32 >>A1=[1 3 4 6; 9 7 4 0; 8 6 3 9]; >>С2=A.*A1 С2 = 1 6 12 24 45 42 28 0 72 60 33 108 >> 3) Добавление элементов ("увеличение матрицы"): Пример 3.5.3-33 >>a1=[A;x] a1 = 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 >> Пара квадратных скобок при этом является оператором объединения. 4) Транспонирование матрицы (апостроф - ' ): Пример 3.5.3-34 >>Bt=B' Bt = 2 6 6 8 5 4 5 3 >> Тема 3.5. Основы работы с математическими пакетами Страница 315 5) Удаление строки (столбца матрицы), в примере удален второй столбец: Пример 3.5.3-35 >>A(:,2)=[ ] %круглые скобки – оператор извлечения A = 1 3 4 5 7 8 9 11 12 >> 6) Извлечение элемента матрицы: Пример 3.5.3-36 >>y=A(3,3) %обращение к элементу в 3-й строке и 3-м столбце y = 12 >> % или >> A(5) %обращение по номеру так, %если записать все столбцы матрицы друг за другом> ans = 7 7) Извлечение строк или столбцов матрицы: Для извлечения строк или столбцов вместо номера элементов в строке или столбце используется двоеточие, которое является оператором перечисления (с первого до последнего элемента строки или столбца): Пример 3.5.3-37 >> %извлечение 3-й строки из А, >> %двоеточие означает весь набор чисел >>y=A(3,:) y = 9 11 12 >> % в этом примере это элементы из 3-й стоки и 1 2 3 столбцов. Двоеточие, поставленное между двумя числами – это перечисление от одного до другого числа, с указанным интервалом (по умолчанию 1): Пример 3.5.3-38 >>x=0:5 %вектор х = (0 1 2 3 4 5) x = 0 1 2 3 4 5 >>x=0:0.1:0.5 %вектор х = (0 0,2 0,3 0,4 0,5) x = 0 0.1000 0.2000 0.3000 0.4000 0.5000 >> Таким образом, матрицы небольших размеров удобно вводить из командной строки. Существует три способа ввода матриц. Например, необходимо определить следующую матрицу: Тема 3.5. Основы работы с математическими пакетами Страница 316 0.7 2.5 9.1 A 8.4 0.3 1.7 3.5 6.2 4.7 , < , Первый способ предполагает набрать в командной строке (разделяя элементы строки матрицы пробелами): A=[0.7 –2.5 9.1 и нажать Пример 3.5.3-39a >>A=[0.7 -2.5 9.1 8.4 0.3 1.7 -3.5 6.2 4.7] A = 0.7000 -2.5000 9.1000 8.4000 0.3000 1.7000 -3.5000 6.2000 4.7000 >> Второй способ ввода матрицы основан на том, что матрицу можно рассматривать как вектор-столбец, каждый элемент которого является строкой матрицы. Поскольку точка с запятой используется для разделения элементов вектора-столбца, то ввод, к примеру, матрицы 6.1 0.3 B 7.9 4.4 2.5 8.1 < , , осуществляется оператором присваивания: Пример 3.5.3-39b >>B=[6.1 0.3; -7.9 4.4; 2.5 -8.1] B = 6.1000 0.3000 -7.9000 4.4000 2.5000 -8.1000 >> Очевидно, что допустима такая трактовка матрицы, при которой она считается вектор-строкой, каждый элемент которой является столбцом матрицы. Следовательно, для ввода матрицы 0.4 7.2 5 / 3 C 0.1 2.1 9.5 , < , , достаточно воспользоваться командой: Пример 3.5.3-40 >> C=[[0.4; 0.1] [-7.2; -2.1] [5.3; -9.5]] C = 0.4000 -7.2000 5.3000 0.1000 -2.1000 -9.5000 >> Необходимо обратить внимание, что внутренние квадратные скобки действительно нужны. Оператор C=[0.4; 0.1 -7.2; -2.1 5.3; -9.5] является недопустимым и приводит к Тема 3.5. Основы работы с математическими пакетами Страница 317 сообщению об ошибке, поскольку оказывается, что в первой строке матрицы содержится только один элемент, во второй и третьей — по два, а в четвертой - снова один. Еще можно воспользоваться командой whos для получения информации о переменных A, B и C рабочей среды. В командное окно выводится таблица с информацией о размерах массивов, памяти, необходимой для хранения каждого из массивов, и типе – double array: Пример 3.5.3-41 >>whos A B C Name Size Bytes Class A 3x3 72 double array B 3x2 48 double array C 2x3 48 double array >> Функция size() позволяет установить размеры массивов, она возвращает результат в виде вектора, первый элемент которого равен числу строк, а второй – столбцов: Пример 3.5.3-42 >>s=size(B) s = 3 2 >> Сложение и вычитание матриц одинаковых размеров производится с использованием знаков +, -. Звездочка * служит для вычисления матричного произведения, причем соответствующие размеры матриц должны совпадать. Допустимо умножение матрицы на число и числа на матрицу, при этом происходит умножение каждого элемента матрицы на число и результатом является матрица тех же размеров, что и исходная. Апостроф - ' предназначен для транспонирования вещественной матрицы или нахождения сопряженной к комплексной матрице. Для возведения квадратной матрицы в степень применяется знак ^. MatLab обладает многообразием различных функций и способов для работы с матричными данными. Для обращения к элементу двумерного массива следует указать его номер строки и номер столбца в круглых скобках после имени массива. Индексация двоеточием позволяет получить часть матрицы — строку, столбец или блок, например: Пример 3.5.3-43 >>c1=A(2:3,2) c1 = 0.3000 6.2000 >> r1=A(1,1:3) r1 = 0.7000 -2.5000 9.1000 >> Для обращения ко всей строке или всему столбцу не обязательно указывать через двоеточие начальный (первый) и конечный индексы, то есть операторы r1=A(1,1:3) и r1=A(1,:) эквивалентны. Для доступа к элементам строки или столбца от заданного до последнего можно использовать end, так же как и для векторов: A(1,2:end). Выделение Тема 3.5. Основы работы с математическими пакетами Страница 318 блока, состоящего из нескольких строк и столбцов, требует индексации двоеточием, как по первому измерению, так и по второму. Пусть в массиве T хранится матрица: 1 7 3 2 4 9 0 5 6 3 8 7 T 2 4 5 1 0 3 6 4 7 2 61 , , , , < , , , Для выделения элементов матрицы T со второй строки по третью и со второго столбца по четвертый, достаточно использовать оператор: Пример 3.5.3-44 >>c1=A(2:3,2) c1 = 0.3000 6.2000 >> Ранее было описано применение поэлементных операций к векторам. Поэлементные вычисления с матрицами производятся практически аналогично, разумеется, необходимо следить за совпадением размеров матриц: ∂ A.*B, A./B - поэлементные умножение и деление; ∂ A.^p - поэлементное возведение в степень, p - число; ∂ A.^B - возведение элементов матрицы A в степени, равные соответствующим элементам матрицы B; ∂ A.' - транспонирование матрицы (для вещественных матриц A' и A.' приводят к одинаковым результатам). Иногда требуется не просто транспонировать матрицу, но и "развернуть" ее. Разворот матрицы на 90 o против часовой стрелки осуществляет функция rot90( ): Пример 3.5.3-45 >>Q=[1 2;3 4] Q = 1 2 3 4 >>R=rot90(Q) R = 2 4 1 3 >> Допустимо записывать сумму и разность матрицы и числа, при этом сложение или вычитание применяется, соответственно, ко всем элементам матрицы. Вызов математической функции от матрицы приводит к матрице того же размера, на соответствующих позициях которой стоят значения функции от элементов исходной матрицы. В MatLab определены и матричные функции, например, sqrtm( ) предназначена для вычисления квадратного корня. Например, найдем квадратный корень из матрицы 3 2 k 1 4 < и проверим полученный результат, возведя его в квадрат (по правилу матричного умножения, а не поэлементно): |