Программирование на 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, чтобы создать вектор равномерных интервалов (иногда также называемый вектором "линейно распределенных значений"). Первое значение в векторе равно нулю, а последнее . Всего вектор содержит 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 файлы в неё.


Вернуться в список уроков