Простейшие арифметические операции в Octave выполняются с помощью следующих операторов:
Вычислить значение арифметического выражения можно вводом его в командную строку и нажатием клавиши ENTER:
>>> 13.5/(0.2+4.2) ^2-2.3 ans = -1.6027
Обратите внимание, что при вводе вещественных чисел для отделения дробной части используется точка.
Если вычисляемое выражение слишком длинное, перед нажатием клавиши ENTER следует набрать три или более точки. Это будет означать продолжение командной строки:
>>> 1+2*3-4.... >>> +5/6+7 . . . . >>> -8+9 ans = 11.833
В первой главе мы уже говорили о значении символа точки с запятой ";" в конце выражения. Напомним, что если он указан в конце выражения, результат вычислений не выводится, а вместо этого активизируется следующая командная строка:
>>> 2-1; >>> 2-1 ans = 1
Правилом хорошего тона в программировании всегда считался легко читаемый программный код, снабжённый большим количеством комментариев. Поскольку далее речь пойдёт о достаточно сложных вычислениях, для наглядности мы также будем применять текстовые комментарии. Текстовый комментарий в Octave — это строка, начинающаяся с символа %. Использовать текстовые комментарии можно как в командной строке, так и в тексте программы. Строка после символа % не воспринимается как команда, и нажатие клавиши ENTER приводит к активации следующей командной строки. Примеры использования текстовых комментариев приведены в следующем разделе.
Числовые результаты могут быть представлены с плавающей (например, $$-3.2E-6, 6.42E+2$$), или с фиксированной (например, $$4.2, 6.05, -17.5489$$) точкой. Числа в формате с плавающей точкой представлены в экспоненциальной форме $$mE\pm p$$, где $$m$$ — мантисса (целое или дробное число с десятичной точкой), $$p$$ — порядок (целое число). Для того, чтобы перевести число в экспоненциальной форме к обычному представлению с фиксированной точкой, необходимо умножить мантиссу на десять в степени порядок. Например,
$$6.42E+2=6.42*10^2=642\\-3.2E-6=-3.2*10^6=-0.0000032$$Ниже приведён пример ввода вещественного числа.
>>> 0.987654321 ans = 0.98765
Нетрудно заметить, что число знаков в дробной части числа в строке ввода больше чем в строке вывода. Происходит это потому, что результат вычислений выводится в виде, который определяется предварительно установленным форматом представления чисел.
Команда, с помощью которой можно установить формат числа имеет вид:
format формат_числа;
В Octave предусмотрены следующие форматы чисел:
>>> format short >>> pi ans = 3.1416 >>> format long >>> pi ans = 3.14159265358979
>>> format short E >>> pi ans = 3.1416E+00 >>> format long E >>> pi ans = 3.14159265358979E+00
>>> format short G >>> pi ans = 3.1416 >>> format long G >>> pi ans = 3.14159265358979
>>> format native-hex >>> pi ans = 182d4454fb210940 >>> format hex >>> pi ans = 400921fb54442d18 >>> format bit >>> pi % Ответ в одну строку — здесь две из-за ширины страницы ans = 01000000000010010010000111111011 01010100010001000010110100011000 >>> format native-bit >>> pi % Ответ в одну строку ans = 00011000101101000010001000101010 11011111100001001001000000000010
>>> format bank >>> pi ans = 3.14 >>> format + >>> pi ans = + >>> -pi ans =
>>> format short >>> 3.1234+2.9876*i ans = 3.1234+2.9876i >>> format free >>> 3.1234+2.9876*i ans = (3.123, 2.988)
>>> format compact >>> 123.123456 ans = 123.12 >>> 1234.12345 ans = 1234.1 >>> 12345.123 ans = 1.2345e+04
Обратите внимание, что формат Short установлен по умолчанию. Вызов команды format с другим числовым форматом означает, что теперь вывод чисел будет осуществляться в установленном формате.
В Octave можно определять переменные и использовать их в выражениях. Для определения переменной необходимо набрать имя переменной, символ "=" и значение переменной. Здесь знак равенства — это оператор присваивания, действие которого не отличается от аналогичных операторов языков программирования. Таким образом, если в общем виде оператор присваивания записать как имя_переменной = значение_выражения, то в переменную, имя которой указано слева, будет записано значение выражения, указанного справа.
Имя переменной не должно совпадать с именами встроенных процедур, функций и встроенных переменных системы. Система различает большие и малые буквы в именах переменных. А именно: ABC, abc, Abc, aBc — это имена разных переменных.
Выражение в правой части оператора присваивания может быть числом, арифметическим выражением, строкой символов или символьным выражением. Если речь идёт о символьной или строковой переменной, то выражение в правой части оператора присваивания следует брать в одинарные кавычки.
>>> x=1.2 % Определение переменной x = 1.2000 >>> y=3.14 y = 3.1400 >>> z=x+y % Использование переменных в арифметическом выражении z = 4.3400 >>> s=sym ( ’a’ ) % Определение символьной переменной s = a % Определение строковой переменной >>> str=’Посадил дед репку. Выросла репка большая, пребольшая’ str = Посадил дед репку. Выросла репка большая, пребольшая
Рассмотрим несколько примеров присвоения значений переменным:
>>> a =1;b=2; c=a*b; d=c^2 d = 4
Обратите внимание, что если символ ; в конце выражения отсутствует, то в качестве результата выводится имя переменной и её значение. Наличие символа ; передаёт управление следующей командной строке. Это позволяет использовать имена переменных для записи промежуточных результатов в память компьютера.
Листинг ниже содержит пример использования в выражении не определённой ранее переменной.
% Сообщение об ошибке. Переменная не определена . >>> t /( a+b ) error: ’t’ undefined near line 37 column 1
Если команда не содержит знака присваивания, то по умолчанию вычисленное значение присваивается специальной системной переменной $$ans$$. Причём полученное значение можно использовать в последующих вычислениях, но важно помнить, что значение $$ans$$ изменяется после каждого вызова команды без оператора присваивания. Примеры использования системной переменной ans:
>>>25-3 ans = 22 % Значение системной переменной равно 22 >>> 2*ans ans = 44 % Значение системной переменной равно 44 >>> x=ans ^0.5 x = 6.6332 >>> ans % Значение системной переменной не изменилось и равно 44 ans = 44
Кроме переменной $$ans$$ в Octave существуют и другие системные переменные:
Все перечисленные переменные можно использовать в математических выражениях.
Если речь идёт об уничтожении определения одной или нескольких переменных, то можно применить команду: clear имя_переменной
Пример применения команды clear:
>>> a = 5.2; b=a ^2; >>> a,b a = 5.2000 b = 27.040 >>> clear a >>> a,b error: ’a’ undefined near line 126 column 1 >>> b b = 27.040
Все функции, используемые в Octave, можно разделить на два класса встроенные и определённые пользователем. В общем виде обращение к функции в Octave имеет вид:
имя переменной = имя функции(аргумент)
или
имя функции(аргумент)
Если имя переменной указано, то ей будет присвоен результат работы функции. Если же оно отсутствует, то значение вычисленного функцией результата присваивается системной переменной$$ ans$$.
Например:
>>> x=pi/2; % Определение значения аргумента >>> y=sin(x)% Вызов функции y = 1 >>> cos(pi/3)% Вызов функции ans = 0.50000
Рассмотрим элементарные встроенные функции Octave. С остальными будем знакомиться по мере изучения материала.
Далее приведены элементарные математические функции Octave.
| Функция | Описание функции |
|---|---|
| $$sin(x)$$ | синус числа $$x$$ |
| $$cos(x)$$ | косинус числа $$x$$ |
| $$tan(x)$$ | тангенс числа $$x$$ |
| $$cot(x)$$ | котангенс числа $$x$$ |
| $$sec(x)$$ | секанс числа $$x$$ |
| $$csc(x)$$ | косеканс числа $$x$$ |
| $$asin(x)$$ | арксинус числа $$x$$ |
| $$acos(x)$$ | арккосинус числа $$x$$ |
| $$atan(x)$$ | арктангенс числа $$x$$ |
| $$acot(x)$$ | арккотангенс числа $$x$$ |
| $$asec(x)$$ | арксеканс числа $$x$$ |
| $$acsc(x)$$ | арккосеканс числа $$x$$ |
Примеры работы с тригонометрическими функциями:
>>> x=pi/7 x = 0.44880 >>> sin(x) ans = 0.43388 >>> (1-cos(x) ^2) ^0.5 ans = 0.43388 >>> tan(x) /(1+tan(x) ^2) ^0.5 ans = 0.43388 >>> (sec(x) ^2-1) ^0.5/sec(x) ans = 0.43388 >>> 1/csc(x) ans = 0.43388 >>> asin(x) ans = 0.46542 >>> acos((1-x ^2) ^ 0.5) ans = 0.46542 >>> atan(x/((1-x ^2) ^ 0.5)) ans = 0.46542
| Функция | Описание функции |
|---|---|
| $$exp(x)$$ | Экспонента числа $$x$$ |
| $$log (x)$$ | Натуральный логарифм числа $$x$$ |
Применение экспоненциальных функций:
>>> x=1 x = 1 >>> exp(x) ans = 2.7183 >>> log(x) ans = 0 >>> log(e^2) ans = 2
| Функция | Описание функции |
|---|---|
| $$sinh(x)$$ | гиперболический синус числа $$x$$ |
| $$cosh(x)$$ | гиперболический косинус числа $$x$$ |
| $$tanh(x)$$ | гиперболический тангенс числа $$x$$ |
| $$coth(x)$$ | гиперболический котангенс числа $$x$$ |
| $$sech(x)$$ | гиперболический секанс числа $$x$$ |
| $$csch(x)$$ | гиперболический косеканс числа $$x$$ |
Листинг ниже содержит примеры работы с гиперболическими функциями.
>>> cosh(x)^2-sinh(x) ^2 ans = 1 >>> tanh(x)*coth(x) ans = 1
| Функция | Описание функции |
|---|---|
| $$fix(x)$$ | округление числа $$x$$ до ближайшего целого в сторону нуля |
| $$floor(x)$$ | округление числа $$x$$ до ближайшего целого в сторону отрицательной бесконечности |
| $$ceil(x)$$ | округление числа $$x$$ до ближайшего целого в сторону положительной бесконечности |
| $$round(x)$$ | обычное округление числа $$x$$ до ближайшего целого |
| $$rem(x, y)$$ | вычисление остатка от деления $$x$$ на $$y$$ |
| $$sign(x)$$ | сигнум–функция (знак) числа $$x$$, выдаёт 0, если $$x = 0, -1$$ при $$x < 0$$ и 1 при $$x > 0$$ |
Примеры работы с целочисленными функциями:
>>> pi ans = 3.1416 >>> fix(pi) ans = 3 >>> floor (pi) ans = 3 >>> floor(-pi ) ans = -4 >>> ceil(pi) ans = 4 >>> ceil(-pi ) ans = -3 >>> round(pi) ans = 3 >>> pi/2 ans = 1.5708 >>> round(pi/2) ans = 2 >>> rem(5, 2) ans = 1 >>> sign(0) ans = 0 >>> sign(pi) ans = 1 >>> sign(-pi ) ans = -1
| Функция | Описание функции |
|---|---|
| $$sqrt(x)$$ | корень квадратный из числа $$x$$ |
| $$abs(x)$$ | модуль числа $$x$$ |
| $$log 10(x)$$ | десятичный логарифм от числа $$x$$ |
| $$log 2(x)$$ | логарифм по основанию два от числа $$x$$ |
| $$pow2(x)$$ | возведение двойки в степень $$x$$ |
| $$gcd(x, y)$$ | наибольший общий делитель чисел $$x$$ и $$y$$ |
| $$lcm(x, y)$$ | наименьшее общее кратное чисел $$x$$ и $$y$$ |
| $$rats(x)$$ | представление числа $$x$$ в виде рациональной дроби |
Далее приведены примеры работы с функциям из таблицы 2.5.
>>> x=9; >>> sqrt(x) ans = 3 >>> abs(-x) ans = 9 >>> abs(x) ans = 9 >>> x=10; >>> log10(x) ans = 1 >>> log10(10*x ) ans = 2 >>> x=4; >>> log2(x) ans = 2 >>> pow2(x) ans = 16 >>> x=8;y=24; >>> gcd(x, y) ans = 8 >>> lcm(x, y) ans = 24 >>> rats(pi) ans = 355/113 >>> rats(e) ans = 2721/1001
Рассмотрим реализацию комплексной арифметики в Octave. Как было отмечено выше, для обозначения мнимой единицы зарезервировано два имени — $$i, j$$, поэтому ввод комплексного числа производится в формате:
действительная часть + $$i$$ * мнимая часть
или
действительная часть + $$j$$ * мнимая часть
Пример ввода и вывода комплексного числа:
>>> 3+i*5 ans = 3+5i >>> -2+3*i ans = -2 + 3i >>> 7+2*j ans = 7+2i >>> 0+7i ans = 0+7i >>> 6+0*j ans = 6
Кроме того, к комплексным числам применимы элементарные арифметические операции: +, -, *, \, /, ^; например:
>>> a= -5+2i; >>> b=3-5*i; >>> a+b ans = -2-3i >>> a-b ans = -8+7i >>> a*b ans = -5 + 31i >>> a/b ans = -0.73529-0.55882i >>> a^2+b^2 ans = 5-50i
Функции для работы с комплексными числами приведены в таблице 2.6.
| Функция | Описание функции |
|---|---|
| $$real(Z)$$ | выдаёт действительную часть комплексного аргумента $$Z$$ |
| $$imag(Z)$$ | выдаёт мнимую часть комплексного аргумента $$Z$$ |
| $$angle(Z)$$ | вычисляет значение аргумента комплексного числа $$Z$$ в радианах от $$-\pi$$ до $$\pi$$ |
| $$conj(Z)$$ | Выдаёт число, комплексно сопряжённое $$Z$$ |
Примеры использования функций из таблицs 2.6.:
>>> a=-3;b=4;Z=a+b*i Z = -3+4i >>> real(Z) ans = -3 >>> imag(Z) ans = 4 >>> angle(Z) ans = 2.2143 >>> conj(Z) ans = -3-4i
Обратите внимание, что большая часть математических функций, описанных в п. 2.5.1, работают с комплексным аргументом:
>>> a=-3; >>> b=4; >>> Z=a+b*i Z = -3+4i >>> sin(Z) ans = -3.8537-27.0168i >>> exp(Z) ans = -0.032543-0.037679i >>> sqrt(Z) ans = 1+2i >>> abs(Z) ans = 5
Операции отношения выполняют сравнение двух операндов и определяют, истинно выражение или ложно (таблица 2.7). Результат операции отношения — логическое значение. В качестве логических значений в Octave используются 1 ("истина") и 0 ("ложь").
| Операция | Описание операции |
|---|---|
| < | меньше |
| > | больше |
| == | равно |
| ~= | не равно |
| <= | меньше или равно |
| <= | больше или равно |
| A | B | $$\neg A$$ | A B | $$A \vee B$$ | $$A \veebar B$$ |
|---|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 | 1 | 0 |
| Тип выражения | Выражение | Логический оператор | Логическая операция |
|---|---|---|---|
| Логическое "и" | A and B | and(A, B) | A B |
| Логическое "или" | A or B | or(A, B) | A | B |
| Исключающее "или" | A xor B | xor(A,B) | |
| Отрицание | not A | not (A) | ~A |
Логическое выражение может быть составлено из операций отношения и логических операций (операторов). Логические выражения выполняются над логическими данными. В таблице 2.8 представлены основные логические выражения: "и", "или", "не".
В Octave существует возможность представления логических выражений в виде логических операторов и логических операций (таблица 2.9).
В таблице 2.9) $$A$$ и $$B$$ — логические выражения (или целочисленные значения 1 и 0).
Логические операторы (выражения) определены и над массивами (матрицами) одинаковой размерности и выполняются поэлементно над элементами. В итоге формируется результирующий массив (матрица) логических значений, каждый элемент которого вычисляется путём выполнения логической операции над соответствующими элементами исходных массивов. При одновременном использовании в выражении логических и арифметических операций возникает проблема последовательности их выполнения. В Octave принят следующий приоритет операций.
Ниже представлены примеры использования логических операций над скалярными и матричными значениями.
>>> A=3;B=4;C=2*pi; >>> P=~(((A+B)*C)>A^B) | (A+B) ==((B-A)+A^2) P = 1 >>> X=[2 1 6]; Y=[1 3 5]; >>> Z=~or ((X>2*Y), (X>Y)) | and ((X>2*Y), (X<Y)) Z = 0 1 0
В первой главе мы уже рассмотрели создание небольшой программы, которая решает конкретное квадратное уравнение. В этой программе отсутствовал заголовок (первая строка определённого вида), и в неё невозможно было передать входные параметры, то есть это был обычный список команд, воспринимаемый системой как единый оператор.
Функция, как и программа, предназначена для неоднократного использования, но она имеет входные параметры и не выполняется без их предварительного задания. Функция имеет заголовок вида
$$function\ name1[,name2,... ] = fun(var1[,var2,... ])$$
где $$name1[,name2,... ]$$ — список выходных параметров, то есть переменных, которым будет присвоен конечный результат вычислений, $$fun$$ — имя функции, $$var1[,var2,... ]$$ — входные параметры. Таким образом простейший заголовок функции выглядит так:
$$function\ name = fun(var)$$
Все имена переменных внутри функции, а также имена из списка входных и выходных параметров воспринимаются системой как локальные, то есть эти переменные считаются определёнными только внутри функции.
Программы и функции в Octave могут быть созданы при помощи текстового редактора и сохранены в виде файла с расширением .m или .M. Но при создании и сохранении функции следует помнить, что её имя должно совпадать с именем файла.
Вызов программ в Octave осуществляется из командной строки. Программу можно запустить на выполнение, указав имя файла, в котором она сохранена.
Обращение к функции осуществляется так же, как и к любой другой встроенной функции системы, то есть с указанием входных и выходных параметров. Вы можете вызвать функцию из командной строки или использовать её как один из операторов программы.
Пример 2.1. Создать функцию для решения кубического уравнения.
Кубическое уравнение
$$ax^3+bx^2+cx+d=0$$после деления на $$a$$ принимает канонический вид:
$$x^3+rx^2+sx+t=0,$$где $$r=\frac{b}{a}, s=\frac{c}{a}, t=\frac{d}{a}$$
В уравнении (2.1) сделаем замену
$$x=y-\frac{r}{3}$$и получим следующее приведённое уравнение:
$$y^3+py+q=0,$$где $$p=\frac{(3s-r^2)}{3},q=\frac{2r^3}{27}-\frac{rs}{3}+t$$
Число действительных корней приведённого уравнения (2.2) зависит от знака дискриминанта $$D =(\frac{p}{3})^3+(\frac{q}{2})^3$$ (табл. 2.10).
Корни приведённого уравнения могут быть рассчитаны по формулам Кардано:
$$y_1=u+v,y_2=\frac{-(u+v)}{2}+\frac{(u-v)}{2}i\sqrt{3},y_3=\frac{-(u + v)}{2}-\frac{(u-v)}{2}i\sqrt{3}$$| Дискриминант | Количество действительных корней | Количество комплексных корнейth |
|---|---|---|
| D$$\ge$$0 | 1 | 3 |
| D<0 | 3 | - |
Здесь $$u=\sqrt[3]{\frac{-q}{2}+\sqrt{D}}, v =\sqrt[3]{\frac{-q}{2}-\sqrt{D}},$$
Далее представлен список команд (листинг 2.1), реализующий описанный выше способ решения кубического уравнения:
>>> function [ x1, x2, x3]=cub (a, b, c, d) r=b/a; s=c /a; t=d/a; p=(3*s-r ^2) /3; q=2*r ^3/27-r*s/3+t; D=(p/3) ^3+(q /2) ^2; u=(-q/2+ sqrt (D)) ^(1/3); v=(-q/2-sqrt (D)) ^(1/3); y1=u+v; y2=-(u+v ) /2+(u-v ) /2*i*sqrt ( 3 ); y3=-(u+v ) /2 -(u-v ) /2*i*sqrt ( 3 ); x1=y1-r / 3; x2=y2-r / 3; x3=y3-r / 3; endfunction % Вычисляем корни уравнения $$3x^3-2x^2-x-4=0$$ >>> [x1, x2, x3]=cub(3, -2, -1, -4) x1 = 1.4905 x2 = -0.41191 + 0.85141i x3 = -0.41191 - 0.85141i
Как правило, массивы используют для хранения и обработки множества однотипных данных. Вместо создания переменной для хранения каждого данного создают один массив, где каждый элемент имеет порядковый номер. Таким образом, массив — множественный тип данных, состоящий из фиксированного числа элементов одного типа. Как и любой другой переменной, массиву должно быть присвоено имя.
Переменную, представляющую собой просто список данных, называют одномерным массивом или вектором. Для доступа к данным, хранящимся в определённом элементе массива, необходимо указать имя массива и порядковый номер этого элемента, называемый индексом.
Если возникает необходимость хранения данных в виде таблиц, в формате строк и столбцов, необходимо использовать двумерные массивы (матрицы). Для доступа к данным, хранящимся в таком массиве, необходимо указать имя массива и два индекса, первый должен соответствовать номеру строки, а второй — номеру столбца, в котором хранится необходимый элемент.
Значение нижней границы индексации в Octave равно единице. Индексы могут быть только целыми положительными числами или нулём.
Самый простой способ задать одномерный массив в Octave имеет вид имя массива = $$X_n : dX : X_k$$, где $$X_n$$ — значение первого элемента массива,$$ X_k$$ — значение последнего элемента массива, $$dX$$ — шаг, с помощью которого формируется каждый следующий элемент массива, то есть значение второго элемента составит $$X_n + dX$$, третьего — $$X_n + dX+dX$$, и так далее до $$X_k$$
Если параметр $$dX$$ в конструкции отсутствует: имя массива = $$X_n : X_k$$, это означает, что по умолчанию он принимает значение равное единице, то есть каждый следующий элемент массива равен значению предыдущего плюс один.
Примеры создания массивов:
>>> A=1:5 A = 1 2 3 4 5 >>> B=2:2:10 B = 2 4 6 8 10 >>> xn= -3.5; xk = 3.5; dx = 0.5; >>> X=xn : dx : xk X = Columns 1 through 8 : -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 Columns 9 through 1 5 : 0.5 1.0 1.5 2.0 2.5 3.0 3.5
Переменную, заданную как массив, можно использовать в арифметических выражениях и в качестве аргумента математических функций. Результатом работы таких операторов являются массивы:
>>> xn= -3.5; xk = 3.5; dx = 0.5; >>> X=xn : dx : xk; >>> Y=cos (X/2) Y = Columns 1 through 7 : -0.1782 0.0707 0.3153 0.5403 0.7316 0.8775 0.9689 Columns 8 through 1 5 : 1.0 0.9689 0.8775 0.7316 0.5403 0.3153 0.0707 -0.1782 >>> B= 2 : 2 : 10;C=sqrt (B) C = 1.4142 2.0000 2.4495 2.8284 3.1623 >>> -2:2 ans = -2 -1 0 1 2 >>> ans*2-pi /2 ans = -5.5708 -3.5708 -1.5708 0.4292 2.4292
Векторы и матрицы в Octave можно вводить поэлементно. Так для определения вектора–строки следует ввести имя массива, а затем, после знака присваивания, в квадратных скобках через пробел или запятую, перечислить элементы массива:
>>> x=[2 4 6 8 10] x = 2 4 6 8 10 >>> y=[ -1.2 3.4 -0.8 9.1 5.6 -7.3] y = -1.20000 3.40000 -0.80000 9.10000 5.60000 -7.30000
Элементы вектора–столбца вводятся через точку с запятой:
>>> X= [1; 3; 5; 7; 9] X = 1 3 5 7 9
Обратиться к элементу вектора можно указав имя массива и порядковый номер элемента в круглых скобках:
>>> x=[2 4 6 8 1 0 ]; >>> y=[ -1.2 3.4 -0.8 9.1 5.6 -7.3]; >>> x ( 1 )% значение первого элемента массива x ans = 2 >>> y ( 5 )% значение пятого элемента массива y ans = 5.6000 >>> x ( 1 ) /2+y ( 3 ) ^2-x (4) /y(5) ans = 0.21143
Ввод элементов матрицы так же осуществляется в квадратных скобках, при этом элементы строки отделяются друг от друга пробелом или запятой, а строки разделяются между собой точкой с запятой. Обратиться к элементу матрицы можно указав после имени матрицы в круглых скобках через запятую номер строки и номер столбца, на пересечении которых элемент расположен. Примеры задания матриц и обращение к их элементам показаны в листинге:
>>> M=[2 4 6; 1 3 5; 7 8 9] M = 2 4 6 1 3 5 7 8 9 >>> M(1, 2) ans = 4 >>> M(3, 1) ans = 7 >>> M(2, 2) /2+M(3,3) ^0.5 -M(1, 1)*5 ans = -5.5000
Подробно работа с векторами и матрицами описана в пятой главе.
Символьные вычисления в Octave поддерживает специальный пакет расширений octave-symbolic. Процедура установки пакетов расширений описана в первой главе. Если пакет уже установлен, то перед началом работы его нужно загрузить командой pkg load symbolic. Теперь можно использовать любые функции из пакета symbolic.
Оператор symbols инициализирует символические операции, с этого оператора должны начинаться любые действия в символьных переменных. Работа с символьными переменными в Octave требует их специального объявления: sym(’имя переменной’). Например, команда x = sym ("x") объявляет символьную переменную $$x$$.
Пример 2.2. Выполнить арифметические операции с символьными переменными $$z = x*y,t=\frac{x^3}{z}$$, где $$x=a+b, y=a^2-b^2$$(листинг 2.2).
>>> x = sym ( "x" );% Объявление >>> y = sym ( "y" );% символьных >>> z = sym ( "z" );% переменных >>> t = sym ( "t" ); >>> a = sym ( "a" ); >>> b = sym ( "b" ); % Вычисление символьных выражений >>> x=a+b x = a+b >>> y=a^2-b^2 y = -b ^ (2.0)+a ^ ( 2.0 ) >>> z=x*y z = -(b ^ ( 2.0 )-a ^ ( 2.0 ) ) *( a+b ) >>> t=x^3/ z t = -(b ^ ( 2.0 )-a ^ ( 2.0 ) ) ^( -1) *( a+b ) ^ ( 2.0 )
Символьные вычисления в Octave предусматривают работу с элементарными математическими функциями (таблица 2.11).
| Функция | Описание функции |
|---|---|
| $$Sin(x)$$ | синус числа $$x$$ |
| $$Cos(x)$$ | косинус числа $$x$$ |
| $$Tan(x)$$ | тангенс числа $$x$$ |
| $$aSin(x)$$ | арксинус числа $$x$$ |
| $$aCos(x)$$ | арккосинус числа $$x$$ |
| $$aTan(x)$$ | арктангенс числа $$x$$ |
| $$Log(x)$$ | натуральный логарифм числа $$x$$ |
| $$Exp(x)$$ | экспонента числа $$x (e^x)$$ |
| $$Sqrt(x)$$ | корень квадратный из числа $$x(\sqrt{x})$$ |
| $$Pi(x)$$ | число $$\pi$$ |
Вычислить значение символьного выражения при заданном значении переменной можно с помощью функции
subs(выражение,имя переменной,значение переменной)
Пример 2.3. Вычислить значение выражения: $$y = sin(a)^2-cos(a)^2$$, при $$a_1 =\frac{\pi}{3},a_2 =\frac{\pi}{6}$$ (листинг 2.3).
>>> x = sym ( "x" ); >>> y = sym ( "y" ); >>> y=Sin ( x )^2-Cos ( x ) ^2 y = -cos ( x ) ^ ( 2.0 )+sin ( x ) ^ ( 2.0 ) % Значение выражения при заданном значении переменной >>> subs ( y, x, Pi /3) ans = 0.5000000000000000001 >>> subs ( y, x, Pi /6) ans = -0.4999999999999999999
Преобразовать символьное выражение, представить его в виде элементарных функций возможно командой
expand(выражение)
Пример 2.4. Раскрыть скобки в выражении $$y =(\sqrt{x} + 1)(\sqrt{x}-1) + (x-1)^3$$ (листинг 2.1).
>>> y=( Sqrt ( x ) +1) *( Sqrt ( x ) -1)+(x-1) *( x -1) *( x -1) y = ( -1.0+x ) ^3+(-1.0+ sqrt ( x ) ) *(1.0+ sqrt ( x ) ) >>> expand ( y ) ans = -2.0+(4.0) *x+x ^3 -(3.0) *x^2
Далее, по ходу изложения материала, будут рассмотрены операции с матрицами символов, решение систем линейных уравнений в символьных переменных (п. 5.9), решение нелинейных уравнений и систем (п. 7.4), дифференцирование (п. 8.1).
Простейшие арифметические операции в Octave выполняются с помощью следующих операторов:
Вычислить значение арифметического выражения можно вводом его в командную строку и нажатием клавиши ENTER:
>>> 13.5/(0.2+4.2) ^2-2.3 ans = -1.6027
Обратите внимание, что при вводе вещественных чисел для отделения дробной части используется точка.
Если вычисляемое выражение слишком длинное, перед нажатием клавиши ENTER следует набрать три или более точки. Это будет означать продолжение командной строки:
>>> 1+2*3-4.... >>> +5/6+7 . . . . >>> -8+9 ans = 11.833
В первой главе мы уже говорили о значении символа точки с запятой ";" в конце выражения. Напомним, что если он указан в конце выражения, результат вычислений не выводится, а вместо этого активизируется следующая командная строка:
>>> 2-1; >>> 2-1 ans = 1
Правилом хорошего тона в программировании всегда считался легко читаемый программный код, снабжённый большим количеством комментариев. Поскольку далее речь пойдёт о достаточно сложных вычислениях, для наглядности мы также будем применять текстовые комментарии. Текстовый комментарий в Octave — это строка, начинающаяся с символа %. Использовать текстовые комментарии можно как в командной строке, так и в тексте программы. Строка после символа % не воспринимается как команда, и нажатие клавиши ENTER приводит к активации следующей командной строки. Примеры использования текстовых комментариев приведены в следующем разделе.
Числовые результаты могут быть представлены с плавающей (например, $$-3.2E-6, 6.42E+2$$), или с фиксированной (например, $$4.2, 6.05, -17.5489$$) точкой. Числа в формате с плавающей точкой представлены в экспоненциальной форме $$mE\pm p$$, где $$m$$ — мантисса (целое или дробное число с десятичной точкой), $$p$$ — порядок (целое число). Для того, чтобы перевести число в экспоненциальной форме к обычному представлению с фиксированной точкой, необходимо умножить мантиссу на десять в степени порядок. Например,
$$6.42E+2=6.42*10^2=642\\-3.2E-6=-3.2*10^6=-0.0000032$$Ниже приведён пример ввода вещественного числа.
>>> 0.987654321 ans = 0.98765
Нетрудно заметить, что число знаков в дробной части числа в строке ввода больше чем в строке вывода. Происходит это потому, что результат вычислений выводится в виде, который определяется предварительно установленным форматом представления чисел.
Команда, с помощью которой можно установить формат числа имеет вид:
format формат_числа;
В Octave предусмотрены следующие форматы чисел:
>>> format short >>> pi ans = 3.1416 >>> format long >>> pi ans = 3.14159265358979
>>> format short E >>> pi ans = 3.1416E+00 >>> format long E >>> pi ans = 3.14159265358979E+00
>>> format short G >>> pi ans = 3.1416 >>> format long G >>> pi ans = 3.14159265358979
>>> format native-hex >>> pi ans = 182d4454fb210940 >>> format hex >>> pi ans = 400921fb54442d18 >>> format bit >>> pi % Ответ в одну строку — здесь две из-за ширины страницы ans = 01000000000010010010000111111011 01010100010001000010110100011000 >>> format native-bit >>> pi % Ответ в одну строку ans = 00011000101101000010001000101010 11011111100001001001000000000010
>>> format bank >>> pi ans = 3.14 >>> format + >>> pi ans = + >>> -pi ans =
>>> format short >>> 3.1234+2.9876*i ans = 3.1234+2.9876i >>> format free >>> 3.1234+2.9876*i ans = (3.123, 2.988)
>>> format compact >>> 123.123456 ans = 123.12 >>> 1234.12345 ans = 1234.1 >>> 12345.123 ans = 1.2345e+04
Обратите внимание, что формат Short установлен по умолчанию. Вызов команды format с другим числовым форматом означает, что теперь вывод чисел будет осуществляться в установленном формате.
В Octave можно определять переменные и использовать их в выражениях. Для определения переменной необходимо набрать имя переменной, символ "=" и значение переменной. Здесь знак равенства — это оператор присваивания, действие которого не отличается от аналогичных операторов языков программирования. Таким образом, если в общем виде оператор присваивания записать как имя_переменной = значение_выражения, то в переменную, имя которой указано слева, будет записано значение выражения, указанного справа.
Имя переменной не должно совпадать с именами встроенных процедур, функций и встроенных переменных системы. Система различает большие и малые буквы в именах переменных. А именно: ABC, abc, Abc, aBc — это имена разных переменных.
Выражение в правой части оператора присваивания может быть числом, арифметическим выражением, строкой символов или символьным выражением. Если речь идёт о символьной или строковой переменной, то выражение в правой части оператора присваивания следует брать в одинарные кавычки.
>>> x=1.2 % Определение переменной x = 1.2000 >>> y=3.14 y = 3.1400 >>> z=x+y % Использование переменных в арифметическом выражении z = 4.3400 >>> s=sym ( ’a’ ) % Определение символьной переменной s = a % Определение строковой переменной >>> str=’Посадил дед репку. Выросла репка большая, пребольшая’ str = Посадил дед репку. Выросла репка большая, пребольшая
Рассмотрим несколько примеров присвоения значений переменным:
>>> a =1;b=2; c=a*b; d=c^2 d = 4
Обратите внимание, что если символ ; в конце выражения отсутствует, то в качестве результата выводится имя переменной и её значение. Наличие символа ; передаёт управление следующей командной строке. Это позволяет использовать имена переменных для записи промежуточных результатов в память компьютера.
Листинг ниже содержит пример использования в выражении не определённой ранее переменной.
% Сообщение об ошибке. Переменная не определена . >>> t /( a+b ) error: ’t’ undefined near line 37 column 1
Если команда не содержит знака присваивания, то по умолчанию вычисленное значение присваивается специальной системной переменной $$ans$$. Причём полученное значение можно использовать в последующих вычислениях, но важно помнить, что значение $$ans$$ изменяется после каждого вызова команды без оператора присваивания. Примеры использования системной переменной ans:
>>>25-3 ans = 22 % Значение системной переменной равно 22 >>> 2*ans ans = 44 % Значение системной переменной равно 44 >>> x=ans ^0.5 x = 6.6332 >>> ans % Значение системной переменной не изменилось и равно 44 ans = 44
Кроме переменной $$ans$$ в Octave существуют и другие системные переменные:
Все перечисленные переменные можно использовать в математических выражениях.
Если речь идёт об уничтожении определения одной или нескольких переменных, то можно применить команду: clear имя_переменной
Пример применения команды clear:
>>> a = 5.2; b=a ^2; >>> a,b a = 5.2000 b = 27.040 >>> clear a >>> a,b error: ’a’ undefined near line 126 column 1 >>> b b = 27.040
Все функции, используемые в Octave, можно разделить на два класса встроенные и определённые пользователем. В общем виде обращение к функции в Octave имеет вид:
имя переменной = имя функции(аргумент)
или
имя функции(аргумент)
Если имя переменной указано, то ей будет присвоен результат работы функции. Если же оно отсутствует, то значение вычисленного функцией результата присваивается системной переменной$$ ans$$.
Например:
>>> x=pi/2; % Определение значения аргумента >>> y=sin(x)% Вызов функции y = 1 >>> cos(pi/3)% Вызов функции ans = 0.50000
Рассмотрим элементарные встроенные функции Octave. С остальными будем знакомиться по мере изучения материала.
Далее приведены элементарные математические функции Octave.
| Функция | Описание функции |
|---|---|
| $$sin(x)$$ | синус числа $$x$$ |
| $$cos(x)$$ | косинус числа $$x$$ |
| $$tan(x)$$ | тангенс числа $$x$$ |
| $$cot(x)$$ | котангенс числа $$x$$ |
| $$sec(x)$$ | секанс числа $$x$$ |
| $$csc(x)$$ | косеканс числа $$x$$ |
| $$asin(x)$$ | арксинус числа $$x$$ |
| $$acos(x)$$ | арккосинус числа $$x$$ |
| $$atan(x)$$ | арктангенс числа $$x$$ |
| $$acot(x)$$ | арккотангенс числа $$x$$ |
| $$asec(x)$$ | арксеканс числа $$x$$ |
| $$acsc(x)$$ | арккосеканс числа $$x$$ |
Примеры работы с тригонометрическими функциями:
>>> x=pi/7 x = 0.44880 >>> sin(x) ans = 0.43388 >>> (1-cos(x) ^2) ^0.5 ans = 0.43388 >>> tan(x) /(1+tan(x) ^2) ^0.5 ans = 0.43388 >>> (sec(x) ^2-1) ^0.5/sec(x) ans = 0.43388 >>> 1/csc(x) ans = 0.43388 >>> asin(x) ans = 0.46542 >>> acos((1-x ^2) ^ 0.5) ans = 0.46542 >>> atan(x/((1-x ^2) ^ 0.5)) ans = 0.46542
| Функция | Описание функции |
|---|---|
| $$exp(x)$$ | Экспонента числа $$x$$ |
| $$log (x)$$ | Натуральный логарифм числа $$x$$ |
Применение экспоненциальных функций:
>>> x=1 x = 1 >>> exp(x) ans = 2.7183 >>> log(x) ans = 0 >>> log(e^2) ans = 2
| Функция | Описание функции |
|---|---|
| $$sinh(x)$$ | гиперболический синус числа $$x$$ |
| $$cosh(x)$$ | гиперболический косинус числа $$x$$ |
| $$tanh(x)$$ | гиперболический тангенс числа $$x$$ |
| $$coth(x)$$ | гиперболический котангенс числа $$x$$ |
| $$sech(x)$$ | гиперболический секанс числа $$x$$ |
| $$csch(x)$$ | гиперболический косеканс числа $$x$$ |
Листинг ниже содержит примеры работы с гиперболическими функциями.
>>> cosh(x)^2-sinh(x) ^2 ans = 1 >>> tanh(x)*coth(x) ans = 1
| Функция | Описание функции |
|---|---|
| $$fix(x)$$ | округление числа $$x$$ до ближайшего целого в сторону нуля |
| $$floor(x)$$ | округление числа $$x$$ до ближайшего целого в сторону отрицательной бесконечности |
| $$ceil(x)$$ | округление числа $$x$$ до ближайшего целого в сторону положительной бесконечности |
| $$round(x)$$ | обычное округление числа $$x$$ до ближайшего целого |
| $$rem(x, y)$$ | вычисление остатка от деления $$x$$ на $$y$$ |
| $$sign(x)$$ | сигнум–функция (знак) числа $$x$$, выдаёт 0, если $$x = 0, -1$$ при $$x < 0$$ и 1 при $$x > 0$$ |
Примеры работы с целочисленными функциями:
>>> pi ans = 3.1416 >>> fix(pi) ans = 3 >>> floor (pi) ans = 3 >>> floor(-pi ) ans = -4 >>> ceil(pi) ans = 4 >>> ceil(-pi ) ans = -3 >>> round(pi) ans = 3 >>> pi/2 ans = 1.5708 >>> round(pi/2) ans = 2 >>> rem(5, 2) ans = 1 >>> sign(0) ans = 0 >>> sign(pi) ans = 1 >>> sign(-pi ) ans = -1
| Функция | Описание функции |
|---|---|
| $$sqrt(x)$$ | корень квадратный из числа $$x$$ |
| $$abs(x)$$ | модуль числа $$x$$ |
| $$log 10(x)$$ | десятичный логарифм от числа $$x$$ |
| $$log 2(x)$$ | логарифм по основанию два от числа $$x$$ |
| $$pow2(x)$$ | возведение двойки в степень $$x$$ |
| $$gcd(x, y)$$ | наибольший общий делитель чисел $$x$$ и $$y$$ |
| $$lcm(x, y)$$ | наименьшее общее кратное чисел $$x$$ и $$y$$ |
| $$rats(x)$$ | представление числа $$x$$ в виде рациональной дроби |
Далее приведены примеры работы с функциям из таблицы 2.5.
>>> x=9; >>> sqrt(x) ans = 3 >>> abs(-x) ans = 9 >>> abs(x) ans = 9 >>> x=10; >>> log10(x) ans = 1 >>> log10(10*x ) ans = 2 >>> x=4; >>> log2(x) ans = 2 >>> pow2(x) ans = 16 >>> x=8;y=24; >>> gcd(x, y) ans = 8 >>> lcm(x, y) ans = 24 >>> rats(pi) ans = 355/113 >>> rats(e) ans = 2721/1001
Рассмотрим реализацию комплексной арифметики в Octave. Как было отмечено выше, для обозначения мнимой единицы зарезервировано два имени — $$i, j$$, поэтому ввод комплексного числа производится в формате:
действительная часть + $$i$$ * мнимая часть
или
действительная часть + $$j$$ * мнимая часть
Пример ввода и вывода комплексного числа:
>>> 3+i*5 ans = 3+5i >>> -2+3*i ans = -2 + 3i >>> 7+2*j ans = 7+2i >>> 0+7i ans = 0+7i >>> 6+0*j ans = 6
Кроме того, к комплексным числам применимы элементарные арифметические операции: +, -, *, \, /, ^; например:
>>> a= -5+2i; >>> b=3-5*i; >>> a+b ans = -2-3i >>> a-b ans = -8+7i >>> a*b ans = -5 + 31i >>> a/b ans = -0.73529-0.55882i >>> a^2+b^2 ans = 5-50i
Функции для работы с комплексными числами приведены в таблице 2.6.
| Функция | Описание функции |
|---|---|
| $$real(Z)$$ | выдаёт действительную часть комплексного аргумента $$Z$$ |
| $$imag(Z)$$ | выдаёт мнимую часть комплексного аргумента $$Z$$ |
| $$angle(Z)$$ | вычисляет значение аргумента комплексного числа $$Z$$ в радианах от $$-\pi$$ до $$\pi$$ |
| $$conj(Z)$$ | Выдаёт число, комплексно сопряжённое $$Z$$ |
Примеры использования функций из таблицs 2.6.:
>>> a=-3;b=4;Z=a+b*i Z = -3+4i >>> real(Z) ans = -3 >>> imag(Z) ans = 4 >>> angle(Z) ans = 2.2143 >>> conj(Z) ans = -3-4i
Обратите внимание, что большая часть математических функций, описанных в п. 2.5.1, работают с комплексным аргументом:
>>> a=-3; >>> b=4; >>> Z=a+b*i Z = -3+4i >>> sin(Z) ans = -3.8537-27.0168i >>> exp(Z) ans = -0.032543-0.037679i >>> sqrt(Z) ans = 1+2i >>> abs(Z) ans = 5
Операции отношения выполняют сравнение двух операндов и определяют, истинно выражение или ложно (таблица 2.7). Результат операции отношения — логическое значение. В качестве логических значений в Octave используются 1 ("истина") и 0 ("ложь").
| Операция | Описание операции |
|---|---|
| < | меньше |
| > | больше |
| == | равно |
| ~= | не равно |
| <= | меньше или равно |
| <= | больше или равно |
| A | B | $$\neg A$$ | A B | $$A \vee B$$ | $$A \veebar B$$ |
|---|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 | 1 | 0 |
| Тип выражения | Выражение | Логический оператор | Логическая операция |
|---|---|---|---|
| Логическое "и" | A and B | and(A, B) | A B |
| Логическое "или" | A or B | or(A, B) | A | B |
| Исключающее "или" | A xor B | xor(A,B) | |
| Отрицание | not A | not (A) | ~A |
Логическое выражение может быть составлено из операций отношения и логических операций (операторов). Логические выражения выполняются над логическими данными. В таблице 2.8 представлены основные логические выражения: "и", "или", "не".
В Octave существует возможность представления логических выражений в виде логических операторов и логических операций (таблица 2.9).
В таблице 2.9) $$A$$ и $$B$$ — логические выражения (или целочисленные значения 1 и 0).
Логические операторы (выражения) определены и над массивами (матрицами) одинаковой размерности и выполняются поэлементно над элементами. В итоге формируется результирующий массив (матрица) логических значений, каждый элемент которого вычисляется путём выполнения логической операции над соответствующими элементами исходных массивов. При одновременном использовании в выражении логических и арифметических операций возникает проблема последовательности их выполнения. В Octave принят следующий приоритет операций.
Ниже представлены примеры использования логических операций над скалярными и матричными значениями.
>>> A=3;B=4;C=2*pi; >>> P=~(((A+B)*C)>A^B) | (A+B) ==((B-A)+A^2) P = 1 >>> X=[2 1 6]; Y=[1 3 5]; >>> Z=~or ((X>2*Y), (X>Y)) | and ((X>2*Y), (X<Y)) Z = 0 1 0
В первой главе мы уже рассмотрели создание небольшой программы, которая решает конкретное квадратное уравнение. В этой программе отсутствовал заголовок (первая строка определённого вида), и в неё невозможно было передать входные параметры, то есть это был обычный список команд, воспринимаемый системой как единый оператор.
Функция, как и программа, предназначена для неоднократного использования, но она имеет входные параметры и не выполняется без их предварительного задания. Функция имеет заголовок вида
$$function\ name1[,name2,... ] = fun(var1[,var2,... ])$$
где $$name1[,name2,... ]$$ — список выходных параметров, то есть переменных, которым будет присвоен конечный результат вычислений, $$fun$$ — имя функции, $$var1[,var2,... ]$$ — входные параметры. Таким образом простейший заголовок функции выглядит так:
$$function\ name = fun(var)$$
Все имена переменных внутри функции, а также имена из списка входных и выходных параметров воспринимаются системой как локальные, то есть эти переменные считаются определёнными только внутри функции.
Программы и функции в Octave могут быть созданы при помощи текстового редактора и сохранены в виде файла с расширением .m или .M. Но при создании и сохранении функции следует помнить, что её имя должно совпадать с именем файла.
Вызов программ в Octave осуществляется из командной строки. Программу можно запустить на выполнение, указав имя файла, в котором она сохранена.
Обращение к функции осуществляется так же, как и к любой другой встроенной функции системы, то есть с указанием входных и выходных параметров. Вы можете вызвать функцию из командной строки или использовать её как один из операторов программы.
Пример 2.1. Создать функцию для решения кубического уравнения.
Кубическое уравнение
$$ax^3+bx^2+cx+d=0$$после деления на $$a$$ принимает канонический вид:
$$x^3+rx^2+sx+t=0,$$где $$r=\frac{b}{a}, s=\frac{c}{a}, t=\frac{d}{a}$$
В уравнении (2.1) сделаем замену
$$x=y-\frac{r}{3}$$и получим следующее приведённое уравнение:
$$y^3+py+q=0,$$где $$p=\frac{(3s-r^2)}{3},q=\frac{2r^3}{27}-\frac{rs}{3}+t$$
Число действительных корней приведённого уравнения (2.2) зависит от знака дискриминанта $$D =(\frac{p}{3})^3+(\frac{q}{2})^3$$ (табл. 2.10).
Корни приведённого уравнения могут быть рассчитаны по формулам Кардано:
$$y_1=u+v,y_2=\frac{-(u+v)}{2}+\frac{(u-v)}{2}i\sqrt{3},y_3=\frac{-(u + v)}{2}-\frac{(u-v)}{2}i\sqrt{3}$$| Дискриминант | Количество действительных корней | Количество комплексных корнейth |
|---|---|---|
| D$$\ge$$0 | 1 | 3 |
| D<0 | 3 | - |
Здесь $$u=\sqrt[3]{\frac{-q}{2}+\sqrt{D}}, v =\sqrt[3]{\frac{-q}{2}-\sqrt{D}},$$
Далее представлен список команд (листинг 2.1), реализующий описанный выше способ решения кубического уравнения:
>>> function [ x1, x2, x3]=cub (a, b, c, d) r=b/a; s=c /a; t=d/a; p=(3*s-r ^2) /3; q=2*r ^3/27-r*s/3+t; D=(p/3) ^3+(q /2) ^2; u=(-q/2+ sqrt (D)) ^(1/3); v=(-q/2-sqrt (D)) ^(1/3); y1=u+v; y2=-(u+v ) /2+(u-v ) /2*i*sqrt ( 3 ); y3=-(u+v ) /2 -(u-v ) /2*i*sqrt ( 3 ); x1=y1-r / 3; x2=y2-r / 3; x3=y3-r / 3; endfunction % Вычисляем корни уравнения $$3x^3-2x^2-x-4=0$$ >>> [x1, x2, x3]=cub(3, -2, -1, -4) x1 = 1.4905 x2 = -0.41191 + 0.85141i x3 = -0.41191 - 0.85141i
Как правило, массивы используют для хранения и обработки множества однотипных данных. Вместо создания переменной для хранения каждого данного создают один массив, где каждый элемент имеет порядковый номер. Таким образом, массив — множественный тип данных, состоящий из фиксированного числа элементов одного типа. Как и любой другой переменной, массиву должно быть присвоено имя.
Переменную, представляющую собой просто список данных, называют одномерным массивом или вектором. Для доступа к данным, хранящимся в определённом элементе массива, необходимо указать имя массива и порядковый номер этого элемента, называемый индексом.
Если возникает необходимость хранения данных в виде таблиц, в формате строк и столбцов, необходимо использовать двумерные массивы (матрицы). Для доступа к данным, хранящимся в таком массиве, необходимо указать имя массива и два индекса, первый должен соответствовать номеру строки, а второй — номеру столбца, в котором хранится необходимый элемент.
Значение нижней границы индексации в Octave равно единице. Индексы могут быть только целыми положительными числами или нулём.
Самый простой способ задать одномерный массив в Octave имеет вид имя массива = $$X_n : dX : X_k$$, где $$X_n$$ — значение первого элемента массива,$$ X_k$$ — значение последнего элемента массива, $$dX$$ — шаг, с помощью которого формируется каждый следующий элемент массива, то есть значение второго элемента составит $$X_n + dX$$, третьего — $$X_n + dX+dX$$, и так далее до $$X_k$$
Если параметр $$dX$$ в конструкции отсутствует: имя массива = $$X_n : X_k$$, это означает, что по умолчанию он принимает значение равное единице, то есть каждый следующий элемент массива равен значению предыдущего плюс один.
Примеры создания массивов:
>>> A=1:5 A = 1 2 3 4 5 >>> B=2:2:10 B = 2 4 6 8 10 >>> xn= -3.5; xk = 3.5; dx = 0.5; >>> X=xn : dx : xk X = Columns 1 through 8 : -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 Columns 9 through 1 5 : 0.5 1.0 1.5 2.0 2.5 3.0 3.5
Переменную, заданную как массив, можно использовать в арифметических выражениях и в качестве аргумента математических функций. Результатом работы таких операторов являются массивы:
>>> xn= -3.5; xk = 3.5; dx = 0.5; >>> X=xn : dx : xk; >>> Y=cos (X/2) Y = Columns 1 through 7 : -0.1782 0.0707 0.3153 0.5403 0.7316 0.8775 0.9689 Columns 8 through 1 5 : 1.0 0.9689 0.8775 0.7316 0.5403 0.3153 0.0707 -0.1782 >>> B= 2 : 2 : 10;C=sqrt (B) C = 1.4142 2.0000 2.4495 2.8284 3.1623 >>> -2:2 ans = -2 -1 0 1 2 >>> ans*2-pi /2 ans = -5.5708 -3.5708 -1.5708 0.4292 2.4292
Векторы и матрицы в Octave можно вводить поэлементно. Так для определения вектора–строки следует ввести имя массива, а затем, после знака присваивания, в квадратных скобках через пробел или запятую, перечислить элементы массива:
>>> x=[2 4 6 8 10] x = 2 4 6 8 10 >>> y=[ -1.2 3.4 -0.8 9.1 5.6 -7.3] y = -1.20000 3.40000 -0.80000 9.10000 5.60000 -7.30000
Элементы вектора–столбца вводятся через точку с запятой:
>>> X= [1; 3; 5; 7; 9] X = 1 3 5 7 9
Обратиться к элементу вектора можно указав имя массива и порядковый номер элемента в круглых скобках:
>>> x=[2 4 6 8 1 0 ]; >>> y=[ -1.2 3.4 -0.8 9.1 5.6 -7.3]; >>> x ( 1 )% значение первого элемента массива x ans = 2 >>> y ( 5 )% значение пятого элемента массива y ans = 5.6000 >>> x ( 1 ) /2+y ( 3 ) ^2-x (4) /y(5) ans = 0.21143
Ввод элементов матрицы так же осуществляется в квадратных скобках, при этом элементы строки отделяются друг от друга пробелом или запятой, а строки разделяются между собой точкой с запятой. Обратиться к элементу матрицы можно указав после имени матрицы в круглых скобках через запятую номер строки и номер столбца, на пересечении которых элемент расположен. Примеры задания матриц и обращение к их элементам показаны в листинге:
>>> M=[2 4 6; 1 3 5; 7 8 9] M = 2 4 6 1 3 5 7 8 9 >>> M(1, 2) ans = 4 >>> M(3, 1) ans = 7 >>> M(2, 2) /2+M(3,3) ^0.5 -M(1, 1)*5 ans = -5.5000
Подробно работа с векторами и матрицами описана в пятой главе.
Символьные вычисления в Octave поддерживает специальный пакет расширений octave-symbolic. Процедура установки пакетов расширений описана в первой главе. Если пакет уже установлен, то перед началом работы его нужно загрузить командой pkg load symbolic. Теперь можно использовать любые функции из пакета symbolic.
Оператор symbols инициализирует символические операции, с этого оператора должны начинаться любые действия в символьных переменных. Работа с символьными переменными в Octave требует их специального объявления: sym(’имя переменной’). Например, команда x = sym ("x") объявляет символьную переменную $$x$$.
Пример 2.2. Выполнить арифметические операции с символьными переменными $$z = x*y,t=\frac{x^3}{z}$$, где $$x=a+b, y=a^2-b^2$$(листинг 2.2).
>>> x = sym ( "x" );% Объявление >>> y = sym ( "y" );% символьных >>> z = sym ( "z" );% переменных >>> t = sym ( "t" ); >>> a = sym ( "a" ); >>> b = sym ( "b" ); % Вычисление символьных выражений >>> x=a+b x = a+b >>> y=a^2-b^2 y = -b ^ (2.0)+a ^ ( 2.0 ) >>> z=x*y z = -(b ^ ( 2.0 )-a ^ ( 2.0 ) ) *( a+b ) >>> t=x^3/ z t = -(b ^ ( 2.0 )-a ^ ( 2.0 ) ) ^( -1) *( a+b ) ^ ( 2.0 )
Символьные вычисления в Octave предусматривают работу с элементарными математическими функциями (таблица 2.11).
| Функция | Описание функции |
|---|---|
| $$Sin(x)$$ | синус числа $$x$$ |
| $$Cos(x)$$ | косинус числа $$x$$ |
| $$Tan(x)$$ | тангенс числа $$x$$ |
| $$aSin(x)$$ | арксинус числа $$x$$ |
| $$aCos(x)$$ | арккосинус числа $$x$$ |
| $$aTan(x)$$ | арктангенс числа $$x$$ |
| $$Log(x)$$ | натуральный логарифм числа $$x$$ |
| $$Exp(x)$$ | экспонента числа $$x (e^x)$$ |
| $$Sqrt(x)$$ | корень квадратный из числа $$x(\sqrt{x})$$ |
| $$Pi(x)$$ | число $$\pi$$ |
Вычислить значение символьного выражения при заданном значении переменной можно с помощью функции
subs(выражение,имя переменной,значение переменной)
Пример 2.3. Вычислить значение выражения: $$y = sin(a)^2-cos(a)^2$$, при $$a_1 =\frac{\pi}{3},a_2 =\frac{\pi}{6}$$ (листинг 2.3).
>>> x = sym ( "x" ); >>> y = sym ( "y" ); >>> y=Sin ( x )^2-Cos ( x ) ^2 y = -cos ( x ) ^ ( 2.0 )+sin ( x ) ^ ( 2.0 ) % Значение выражения при заданном значении переменной >>> subs ( y, x, Pi /3) ans = 0.5000000000000000001 >>> subs ( y, x, Pi /6) ans = -0.4999999999999999999
Преобразовать символьное выражение, представить его в виде элементарных функций возможно командой
expand(выражение)
Пример 2.4. Раскрыть скобки в выражении $$y =(\sqrt{x} + 1)(\sqrt{x}-1) + (x-1)^3$$ (листинг 2.1).
>>> y=( Sqrt ( x ) +1) *( Sqrt ( x ) -1)+(x-1) *( x -1) *( x -1) y = ( -1.0+x ) ^3+(-1.0+ sqrt ( x ) ) *(1.0+ sqrt ( x ) ) >>> expand ( y ) ans = -2.0+(4.0) *x+x ^3 -(3.0) *x^2
Далее, по ходу изложения материала, будут рассмотрены операции с матрицами символов, решение систем линейных уравнений в символьных переменных (п. 5.9), решение нелинейных уравнений и систем (п. 7.4), дифференцирование (п. 8.1).
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.