Программирование на Octave/Основы Octave
Цель этого урока - кратко рассказать об основах Octave, а также показать вам, что многое из описанного вы уже знаете. Если вы что-то забудете или вам понадобится подробная информация о какой-либо функции или команде, просто наберите:
help command
в командной оболочке Octave. команда - это название команды или функции в Octave, справка по которой вам требуется. Стоит предупредить, что описания могут зачастую быть техническими и содержать много жаргонных выражений.
Заметка:
Если у вас возникли проблемы с запуском Octave, сайты NCLab и Verbosus позволяют вам работать с Octave в облаке. Обе системы бесплатны для использования.
Запуск Octave
правитьЧтобы запустить Octave введите octave
в окне терминала. Вы должны будете увидеть, что-то похожее на текст ниже, разница зависит от версии, которую вы установили:
GNU Octave, version 3.6.4 Copyright (C) 2013 John W. Eaton and others. This is free software; see the source code for copying conditions. There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'. Additional information about Octave is available at http://www.octave.org. Please contribute if you find this software useful. For more information, visit http://www.octave.org/get-involved.html Report bugs to <bug@octave.org> (but first, please read http://www.octave.org/bugs.html to learn how to write a helpful report). octave:1>
Ввод команд
правитьПоследняя строка снизу является приглашением командной строки Octave и, так же как и командная строка в Linux, это место где вы вводите команды Octave. Чтобы выполнить простейшие арифметические операции, используйте + (сложение), - (вычитание), * (умножение), / (деление) и ^ (возведение в степень).
Также доступно много математических функций, имеющих предсказуемые имена (во многом схожие с аналогичными в других языках программирования).
Например:
- Тригонометрические функции:
sin
,cos
,tan
- Обратные тригонометрические функции:
asin
,acos
,atan
- Натуральный и десятичный логарифмы:
log
,log10
- Экспонента:
exp
- Модуль числа:
abs
Также определены различные константы: pi, e, мнимая единица (i или j), inf (бесконечность), NaN (Неопределенность. Результат неопределенных операций, например inf/inf).
Вот несколько примеров операций и соответствующих им команд Octave.
octave:1> 2 + 3 ans = 5 |
|
octave:2> log10(100)/log10(10) ans = 2 |
|
octave:3> floor((1+tan(1.2)) / 1.2) ans = 2 |
|
octave:4> sqrt(3^2 + 4^2) ans = 5 |
|
octave:5> e^(i*pi) ans = -1.0000e+00 + 1.2246e-16i octave:6> # Comment: From Euler's famous formula octave:6> # extremely close to the correct value of -1 |
Несколько вещей, на которые стоит обратить внимание:
- В Octave требуются круглые скобки вокруг аргументов у функции (так, например log(10) - нормально, а вот (log 10) неверно).
- Любые пробелы до или после арифметических операций не являются обязательными, но допускаются
- Не все функции в Octave имеют очевидные имена (например, sqrt - извлечение корня). Не паникуйте. Вы узнаете о них по ходу обучения.
Построение графиков
правитьСейчас вы научитесь строить следующие графики с помощью Octave.
Figure 1 |
Figure 2 |
Figure 3 |
Figure 4 |
Форма 1 (Figure 1) содержащая в себе плоскость была сгенерирована с помощью команд, написанных ниже. Пока что это простой пример, предназначенный проиллюстрировать базовые возможности построения графиков. Мы рассмотрим более сложные примеры позже.
x = linspace(0, 2*pi, 100); y = sin(x); plot(x, y); figure;
Команда, создающая график - это, конечно же, plot(x,y)
. Да вызова это команды, мы должны задать две переменных - x
и y
. Функция plot
просто принимает в качестве аргументов два вектора одинаковой длины, интерпретирует значения из первого как значения координаты X, а второго, как значение координаты Y и рисует линию соединяя эти координаты.
Первая команда, x = linspace(0, 2*pi, 100)
, использует функцию linspace
, чтобы создать вектор равномерных интервалов (иногда также называемый вектором "линейно распределенных значений"). Первое значение в векторе равно нулю, а последнее 2π. Всего вектор содержит 100 значений. Этот вектор присваивается переменной с именем x
.
Вторая команда рассчитывает значение синуса от каждого значения в векторной переменной x
, и сохраняет вектор-результат в переменную y
.
(Немножко отходя от темы, стоит отметить, что имя переменной может состоять из любой последовательности букв, цифр и подчеркиваний, но не может начинаться с цифры. Нет никаких ограничений на длину имени переменной. Имя чувствительно к регистру, так a и A - это разные переменные).
Задание
правитьfor (рисунок 2)
Немного о командах
правитьСледующие команды и функции очень полезны для задания переменных при построении 2D графиков.
linspace
- создает вектор равномерно (линейно) распределенных значений
Использование: linspace(start, end, length)
.
Параметр length
является опциональным и определяет число элементов в возвращаемом векторе. Если вы опустите этот параметр, то вектор будет содержать 100 значений, первое из которых будет равно start
, а последнее stop
.
plot
- строит двумерный график
Использование: plot(x, y)
x
и y
- векторые одинаковой длины
figure
- создает новую форму для графика
Функция бывает полезна, когда вы хотите построить несколько графиков на разных окнах, а не заменять ваш предыдущий график или строить график на той же оси.
hold on
/hold off
- команда, определяющая хотите ли вы строить последующие графики на тех же осях (hold on
) или хотите заменить предыдущий построенный график (hold off
).
Пример
правитьСейчас мы построим графики, изображенные на рисунках 3 и 4. На рисунке 3 изображены три тригонометрические функции
- ,
- , and
на одном множестве осей. На рисунке 4 показан график суммы этих функций.
Первым делом, используем функцию linspace
, чтобы создать вектор X-значений
octave:1> x = linspace(0, 2*pi);
Затем посчитаем Y-значения для всех трёх функций
octave:2> a = cos(2*x); octave:3> b = sin(4*x); octave:4> c = 2*sin(x);
Следующие команды построят график всех трёх функций
octave:5> figure; octave:6> plot(x, a); octave:7> hold on; octave:8> plot(x, b); octave:9> plot(x, c);
На строке 5 (figure
) мы сообщаем Octave, что хотим построить новый график в новом окне. Считается хорошей практикой вызывать figure
перед построением нового графика. Такой подход помогает избежать случайно замены предыдущего важного графика.
Обратите внимание, что на строке 7, используется команда hold on
, чтобы сообщить Octave, что мы не хотим замещать предыдущий график (со строки 6) последующими. Octave, после использования hold on
, будет строить все последующие графики на той же плоскости, пока не будет вызвана команда hold off
.
Форма, которую вы видите, отображает все три построенные функции одинаковым цветом. Чтобы заставить Octave задать различные цвета автоматически, постройте все функции за один шаг:
octave:10> plot(x, a, x, b, x, c);
Ну, и наконец-то, построим второй график (рисунок 4):
octave:11> figure; octave:12> hold off; octave:13> plot(x, a+b+c);
Строка 11 создает новое окно, а строка 12 сообщает Octave, что все последующие построения графиков будут просто замещать предыдущие. На строке 13 мы строим график суммы всех функций.
Небольшая заметка для пользователей Mac:
Если команды для построения графиков не работают, выполните следующую команду:
setenv ("GNUTERM", "x11")
Упражнения
править- Постройте график функции abs(x) для .
- Постройте круг единичного радиуcа с центром в начале координат (это не так легко)
- Постройте графики функций, которые вам нравятся :)
Предупреждение
правитьЕсли вы попытаетесь (или уже попытались) построить что-нибудь вроде или у вас возникнут некоторые проблемы. Скорее всего вы получите следующие сообщения:
В случае x^2
:
error: for A^b, A must be square
В случае sin(x) * cos(x)
:
error: operator *: nonconformant arguments (op1 is 1x100, op2 is 1x100)
Эти две ошибки будут появляться, когда бы вы ни пытались умножить или разделить две векторные переменные (вспомните, ведь x
и y
- это векторы). На данный момент, чтобы исправить это вы можете сделать одну из двух вещей:
- Использоваеть
plot(sin(x).*cos(x))
. Обратие внимание на точку междуsin(x)
и*
. Для используйтеplot(x.*x)
илиplot(x.^2)
- Прочитайте раздел о векторах и матрицах.
Неочевидные проблемы
правитьТак как Octave - это математический пакет для численных (а не символических) вычислений, он тоже делает численные ошибки и не выполняет некоторые операции хорошо. Чтобы убедиться в этом, давайте построим график x для интервала [-π π]. Что же не так на получившемся рисунке? Он плохо смасштабирован из-за точек разрыва, которые тяжело обрабатывать численно.
Ваша задача заключается в том, чтобы сгенерировать (намного лучше выглядящий) график на рисунке ниже, используя всё то, что вы выучили до этого момента и функцию axis
.
axis
можно использовать, чтобы отрегулировать, какая часть графика будет фактически отображена на экране. Используйте команду help axis
, чтобы узнать, как работает эта функция.
Возможно, придется немного подумать, как нарисовать правильные асимптотические линии
Чтобы получить такой же график, как на рисунке выше, введите следующее:
octave:1> x_part_left = linspace(-pi, -pi/2-0.001, 100); octave:2> x_part_mid = linspace(-pi/2, pi/2, 100); octave:3> x_part_right = linspace( pi/2+0.001, pi, 100); octave:4> plot(x_part_left, tan(x_part_left)); octave:5> hold on; octave:6> plot(x_part_mid, tan(x_part_mid)); octave:7> plot(x_part_right, tan(x_part_right)); octave:8> y_limit = 4; octave:9> axis([-pi, pi, -y_limit, y_limit]); octave:10> plot(linspace(-pi/2, -pi/2, 100), linspace(-y_limit, y_limit, 100), '.'); octave:11> plot(linspace( pi/2, pi/2, 100), linspace(-y_limit, y_limit, 100), '.'); octave:12> hold off;
Горизонтальный диапазон [-π π] разбит на три части так, чтобы точки пропустить точки разрыва. В строках 4-7 строятся разные части функции тангенса. После этого, в строке 8, мы задаем ограничение оси Y, чтобы установить диапазон значений по вертикали (используя функцию axis
в строке 9). В конце мы добавляем две пунктирные линии на позициях
Скрипты
правитьВ Octave есть очень полезная возможность сохранять комманды и запускать их заново позже. Вы, вероятно, захотите сохранить вашу работу или написать код, который можно заново использовать (самостоятельно или отдать кому-то еще). Такие файлы называются скриптами Octave. Их стоит сохранять с расширением .m
и тогда Octave сможет самостоятельно распознать их. (Расширение .m
используется потому что MATLAB называет свои скрипты "М-файлами", а Octave основывается на MATLAB).
Чтобы запустить созданные скрипты в Octave вы должны находиться в той же директории, что и файл со скриптом и ввести имя файла без расширения .m
. Например, если у вас есть скрипт myscript.m в папке octave, следующие команды выполнят этот скрипт.
chdir('~/octave'); % This changes to the octave directory myscript;
Обратите внимание, что команда chdir('~/octave')
; необходима, если вы не находились внутри этой папки во время запуска Octave.
В следующих уроках вы узнаете несколько новых выражений, которые вы сможете использовать, чтобы сделать ваш Octave-код намного круче. Количество предоставляемых скриптов будет расти и вам следует сохранять их для дальнейшего использования. Хорошей идеей будет создать папку octave в вашей домашней папке и сохранять все ваши Octave файлы в неё.
Вернуться в список уроков