Арифметические вычисления
Основу многих расчетов составляют вычисления значений арифметических выражений. В качестве операндов этих выражений могут выступать константы, вещественные и комплексные переменные, элементарные и специальные функции. Одной из главных особенностей MATLAB является то, что, в отличие от большинства других языков программирования, эта система допускает непосредственное использование массивов в качестве операндов и аргументов функций. Основным типом данных, с которыми работает MATLAB, являются массивы. Чаще всего в математических вычислениях используются одно мерные (векторы) и двумерные массивы (матрицы). Чтобы задать вектор-строку, то есть массив размера 1 × n, необходимо заключить ее элементы в квадратные скобки, разделив их запятыми или пробелами. >> a = [1 2 3] a =1 2 3 Вектор-столбец задается похожим образом, только в качестве разделителя следует использовать точку с запятой. >> b = [1; 2; 3] b = Вектор-столбец может быть преобразован в вектор-строку с помощью операции транспонирования символом которой является апостроф ('). >> b' ans =1 2 3 Для формирования матрицы применяются оба типа разделителей. >> A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 В MATLAB имеется много функций, предназначенных для построения как стандартных, так и специальных матриц. Функция zeros, например, используется для создания матриц, заполненных нулями. >> zeros(3) ans = 0 0 0 0 0 0 0 0 0 С помощью функции eye можно построить единичную матрицу. >> eye(3) ans = 1 0 0 0 1 0 0 0 1 Функция magic строит магический квадрат – матрицу, у которой сумма элементов каждой строки, каждого столбца и каждой диагонали одинакова. >> magic(3) ans = 8 1 6 3 5 7 4 9 2 Элементами массивов могут быть вещественные и комплексные числа с плавающей точкой. В MATLAB используется аппаратно реализованная арифметика двойной точности для десятичных чисел с плавающей точкой. В MATLAB вещественные числа по модулю могут находится в интервале [10−308,10308]. Числа с плавающей точкой распределены в интервале между наименьшим и наибольшим представимым числом. Причем в окрестности нуля они расположены значительно гуще, чем по краям интервала. Очевидно, что однозначно отобразить континуальное множество вещественных чисел на конечное множество чисел с плавающей точкой невозможно. Поэтому любые операции, проводимые над числами с плавающей точкой, в принципе не могут быть точными, так как всегда приходится производить округление до ближайшего числа с плавающей точкой. Вещественное число в MATLAB состоит из целой части со знаком или без знака, десятичной точки, дробной и степенной части. Степенная часть должна состоять из буквы e и целого числа со знаком или без знака. Таким образом, правильная запись в MATLAB числа −1234.5678 должна иметь следующий вид. >> -1.2346e+003 Допустимы, однако, и другие варианты записи вещественных чисел, которые, впрочем, все равно автоматически приводятся к стандартной форме. >> -1234.5678 ans = -1.2346e+003 >> -1.2346*10^3 ans = -1.2346e+003 Количество значащих десятичных цифр при вычислениях в MATLAB может достигать 15-16. Однако для большей компактности результата при выводе в командное окно часть значащих цифр обычно отбрасывается. По умолчанию система использует компактный формат, задаваемый командой format short. Переключиться в режим вывода большего числа знаков после десятичной точки можно, выполнив команду format long. >> format long >> pi ans = 3.14159265358979 >> format short >> pi ans = 3.1416 Независимо от выбранного формата вывода результатов вычисления в MATLAB всегда проводятся с максимально возможной точностью. Но при этом всегда следует помнить, что количество верных значащих цифр в полученном ответе далеко не всегда будет совпадать с тем количеством цифр, что видны на экране. Иногда при неустойчивости задачи или при неудачном выборе вычислительного алгоритма верные значащие цифры в результате могут отсутствовать вообще. Если происходит переполнение разрядной сетки, то есть результат операции выходит за рамки диапазона, допустимого для чисел с плавающей точкой, то MATLAB возвращает в качестве результата внутреннее представление бесконечности (Inf). >> 1/0 ans = Inf В тех случаях, когда результат не определен, что происходит, например, при делении 0 на 0, возвращается специальная константа NaN (Not aNumber). >> 0/0 ans = NaN Комплексные числа в MATLAB представляются в памяти компьютера парой чисел с плавающей точкой и записываются в форме a+bi (или a+bj), где символом i (или j) обозначается мнимая единица. Обрати те внимание, что символ операции умножения между мнимой единицей и мнимой частью комплексного числа ставить не следует. Это связано с тем, что система MATLAB допускает пере обозначение переменных i и j,>> z = 5+7i z = 5.0000 + 7.0000i С помощью функций real и imag можно выделить вещественную и мнимую части комплексного числа. >> real(z) ans =5 >> imag(z) ans =7 Функция complex позволяет сконструировать комплексное число из упорядоченной пары вещественных чисел. >> complex(3, 5) ans = 3.0000 + 5.0000i Функция conj возвращает комплексно-сопряженное число (символом комплексного сопряжения в MATLAB является также апостроф). >> z’ ans = 5.0000 - 7.0000i Модуль и аргумент комплексного числа можно вычислить при помощи функций abs и angle. >> abs(z) ans = 8.6023 >> angle(z) ans = 0.9505 При работе в MATLAB необходимо учитывать две существенные особенности реализации арифметических вычислений в этой системе. Во-первых, в MATLAB все скалярные переменные трактуются как массивы размера 1 × 1. Действительно, если присвоить следующие значения переменным и с помощью команды whos вывести в командное окно информацию об этих переменных, то можно увидеть, что обе скалярные переменные рассматриваются системой MATLAB как одноэлементные векторы из чисел с плавающей точкой (doublearray и doublearray(complex >> x = 2; >> y = 1-i; >> a = [1 2 3]; >> A = [ 1 2 3; 4 5 6; 7 8 9]; >> whos Name Size Bytes Class A 3x3 72 double array A 1x3 24 double array x 1x1 8 double array y 1x1 16 double array (complex) Grand total is 26 elements using 216 bytes Кроме того, при выполнении арифметических операций MATLAB стремится, насколько это возможно, выполнить приведение операндов к одному размеру. Поэтому первой особенностью арифметики MATLAB является возможность, наряду со стандартной операцией умножения массива на скаляр, выполнить сложение или вычитание массива и скаляра. Скаляр в этом случае автоматически преобразуется в массив, размер которого совпадает с размером соседнего операнда, а все элементы равны исходному скаляру. >> a + x ans = 3 4 5 >> A - x ans = -1 0 1 2 3 4 5 6 7 Второй особенностью арифметики MATLAB является наличие в этой системе двух комплектов символов для операций умножения, деления и возведения в степень. Один набор операций имеет традиционную символику (*, /, ^) и выполняется для массивов по правилам линейной алгебры. Второй набор имеет ту же символику, перед которой ставится точка(.*,./,.^), при этом операции выполняются поэлементно. Необходимость в поэлементных операциях диктуется тем, что при программировании на языке MATLAB эти операции зачастую позволяют избежать чрезмерного использования операторов цикла. Различия между традиционными и поэлементными операциями удобно рассмотреть на примерах. >> A = [1 2; 3 4]; >> B = [2 4; 6 8]; >> b = [5; 6]; >> C = [1 2 3; 4 5 6]; >> D = [-4 5 -6; 1 -2 3]; Умножение матриц и векторов в линейной алгебре возможно только в том случае, если число столбцов первого сомножителя равно числу строк второго. Операция правого деления двух матриц эквивалентна умножению делимой матрицы на обратную матрицу делителя (A/B = AB−1). >> A*b ans = >> B/A ans = 2 0 0 2 Поэлементное умножение или деление массивов осуществимо толькотогда, когда они имеют одинаковые размеры. >> C.*D ans = -4 10 -18 4 -10 18 >> C./D ans = -0.2500 0.4000 -0.5000 4.0000 -2.5000 2.0000 В линейной алгебре возведение в степень может быть осуществлено только в случае квадратной матрицы. >> A^3 ans = 37 54 81 118 Операцию поэлементного возведения в степень можно применить к любой матрице. >>A.^3 ans = 1 8 27 64 >>C.^2 ans = 1 4 9 16 25 36 В системе MATLAB определены все элементарные и большая часть специальных функций: - sqrt(x) – квадратный корень; - exp(x), log(x) – экспонента и натуральный логарифм; - sin(x), cos(x), tan(x), cot(x), sec(x), csc(x) – тригонометрические функции; - asin(x), acos(x), atan(x), acot(x), asec(x), acsc(x) –обратные тригонометрические функции; - sinh(x), cosh(x), tanh(x), coth(x), sech(x), csch(x) – гиперболические функции; - asinh(x), acosh(x), atanh(x), acoth(x), asech(x), acsch(x)обратные гиперболические функции; - erf(x) – функция ошибок; - gamma(z) — гамма-функция; - airy(z), airy(2,z) — функции Эйри первого и второго порядка; - besselj(k,z), bessely(k,z), besseli(k,z), besselk(k,z) - функции Бесселя первого и второго рода и модифицированные функции Бесселя. Аргументами любой математической функции в MATLAB могут быть как вещественные, так и комплексные числа. В случае комплексного аргумента возвращается главное значение функции. >> atan(1) ans = 0.7854 >> sqrt(1+i) ans = 1.0987 + 0.4551i Векторы и матрицы могут также являться аргументами элементарныхи специальных функций. В этом случае значения функции вычисляютсядля всех элементов массива. >> exp([1 2 3 4 5]) ans = 2.7183 7.3891 20.0855 54.5982 148.4132 >> A = [ pi/2 pi/3; pi/6 -pi/2] A = 1.5708 1.0472 0.5236 -1.5708 >> sin(A) ans = 1.0000 0.8660 0.5000 -1.0000
.
|