Что такое gnu octave
Высшая математика командной строки — GNU Octave
Как я и обещал, перехожу от обзора программ замены калькулятора к более серьезным инструментам. Если помните схему из предыдущего поста, то во второй категории находились табличные: OpenOffice / LibreOffice сотоварищи. Эту партию мы можем смело пропустить, так как к командной строке она не относится, к тому же, среди читателей Хабра трудно найти человека, который бы в них не разбирался. Поэтому перехожу сразу к третьей категории.
Специализированные математические программы, уровень студент+
Но сначала немного исторического контекста, чтобы понять, как закалялись математические программы с открытыми исходниками.
Догнать и перегнать MATLAB
Так сложилось, что коммерческие программы прибежали и первыми застолбили поляну математических вычислений. Уже с конца 1970-х гг. создатель языка программирования Клив Моулер распространяет MATLAB в университетах США, а в 1984-м вместе с двумя компаньонами переписывают его с Фортрана на Си и создают компанию The MathWorks. Примечательно, что ранние версии распространялись с открытым исходным кодом.
С большим опозданием в игру включаются программы с открытыми исходниками. Только в 1990-х появляются математические пакеты GNU Octave, Scilab и вступают в конкуренцию с лидером вычислительного программирования.
Основной миссией Octave была, и в обозримом будущем скорее всего так и останется, быть годной заменой MATLAB так же, как OpenOffice/LibreOffice замещает MS Office для тех, кто умеет считать копейку. Собственно, для этого Octave имеет совместимый с MATLAB синтаксис и набор функций. Более того, несовместимость с MATLAB считается багом, однако софтверная Фемида уже имеет подобный прецедент, и это не считается нарушением копирайта. В этой связи, можно считать Octave программным клоном. Правда о полной совместимости пока говорить не приходится, но работа в этом направлении не прекращается.
Установка
Установка Octave в Linux ничем не отличается от установки других программ. На Gentoo Linux запускаем:
Для SUSE и Arch тоже все очень просто, а вот пользователям Красной Шапки и CentOS придется чуток повозиться. Попытка установить Octave легким движением кисти завершается ошибкой, пакет в репозитариях не найден.
Благо, есть обходной путь. Нужно сперва установить пакет epel-release.
И только после этого yum install octave сработает.
Наконец, все готово и программа установлена.
Операции с матрицами
Сперва простое транспонирование матрицы:
Попробуем решить систему линейных уравнений:
Вбиваем матрицу A, вектор b и решаем уравнение Ax = b в матричном виде
Находим детерминант и собственные значения матрицы.
Комплексные числа тоже поддерживаются в вычислениях.
Функции и переменные
В Octave переменные и функции создавать гораздо проще, чем, к примеру, в Java или C. На примере матриц, мы уже видели как объявлять переменные. Создания новой функции имеет следующий синтаксис
Напишем функцию для решения квадратичного уравнения ax² + bx + c = 0
Графический интерфейс
Что-же дальше?
Может возникнуть вопрос: а зачем вообще нужны открытые математические пакеты? Офисные приложения нужны всем, но ведь далеко не каждому необходимо сидя дома решать уравнения Пуассона, с помощью преобразования Лапласа. Для ВУЗ-ов MATLAB стоит значительно дешевле, нежели для физических лиц и коммерческих организаций. Коммерческие организации, если будет нужно, найдут денежные средства, а обычные люди пусть занимаются математикой в университетах или считают столбиком.
Конечно же, это ошибочное мнение. Научные расчеты, выполненные с использованием открытого ПО имеют дополнительный «уровень защиты», ведь при желании любой может повторить прогнать те же самые расчеты и проверить валидность результатов. Те же самые вычисления, выполненные на дорогущем ПО, частично отсекают возможность проверки результатов. Проблема на самом деле гораздо шире (английский текст) и дело не только в открытых или проприетарных математических программах. Не секрет, что научные журналы как правило не требуют от авторов предоставить данные и методику, достаточные для гарантированного повтора результатов эксперимента, проверки модели. Особенно часто этим грешат экономисты и финансисты, попросту засекречивая свои данные. Проверка расчетов и выводов среди выборки из массива статей с «засекреченными» данными дала неожиданные результаты (английский текст). Наука, как и софт, должна быть открытой, вот почему открытые математические пакеты имеют ценность для всего общества.
Рекомендуется к прочтению
Кроме последней книги, остальные материалы, использованные в статье, можно без труда найти в интернете. Половина из приведенных выше ссылок ведут на английские страницы. Буду рад вкратце сообщить о чем идет там речь или помочь с переводом.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
GNU Octave
Разработчики: | John W. Eaton |
---|---|
Выпущена: | 1988 |
Написана на: | C++ |
Операционная система: | Linux, UNIX, Cygwin, Windows, Android [1] |
Тип ПО: | математическое программное обеспечение |
Лицензия: | GNU General Public License |
Веб-сайт | http://www.gnu.org/software/octave/ |
Octave представляет интерактивный командный интерфейс для решения линейных и нелинейных математических задач, а также проведения других численных экспериментов. Кроме того, Octave можно использовать для пакетной обработки. Язык Octave оперирует арифметикой вещественных и комплексных скаляров и матриц, имеет расширения для решения линейных алгебраических задач, нахождения корней систем нелинейных алгебраических уравнений, работы с полиномами, решения различных дифференциальных уравнений, интегрирования систем дифференциальных и дифференциально-алгебраических уравнений первого порядка, интегрирования функций на конечных и бесконечных интервалах. Этот список можно легко расширить, используя язык Octave (или используя динамически загружаемые модули, созданные на языках Си (язык программирования), С++, Фортран и др.)
Содержание
Технические детали
Язык Octave
Octave — интерпретируемый язык программирования. Он похож на Си и поддерживает большинство основных функций стандартной библиотеки Си, а также основные команды и системные вызовы Unix. С другой стороны, он не поддерживает передачу аргументов по ссылке (особенность дизайна).
Синтаксис языка очень похож на MATLAB, и грамотно написанные скрипты будут запускаться как в Octave, так и в MATLAB.
Некоторые возможности
Интерфейс командной строки Octave построен с использованием библиотеки GNU Readline, что дает доступ к таким обычным возможностям последней, как автодополнение по клавише TAB, история команд и инкрементальный поиск по ней CtrlR, клавишаCtrlS, возможность переопределения клавиш, и т. д. Графический интерфейс до версии 3.8.0 был представлен дополнениями (графики он мог выводить и без них).
Выражения Octave можно вычислять из программ на C++. К примеру, фрагмент кода для вычисления rand([9000,1]) :
Если в конце 1990-х гг. (2-я серия выпусков) отмечалось, что производительность Octave существенно уступает производительности MATLAB, то к концу 2000-х гг. (3-я серия выпусков) производительности этих пакетов «почти сравнялись», а остающуюся разницу приписывают наличию в составе MATLAB интерпретатора-компилятора (Just in Time — JIT), которого нет в Octave.
Основными решениями по организации распределенных вычислений в среде Octave являются библиотеки bcMPI, MPI Toolbox for Octave (MPITB), octave-parallel_mpi и parallel (ранее octave-parallel), предназначенные для кластерных систем, и модуль parcellfun библиотеки general для обеспечения параллельных вычислений в масштабе «одной машины» (на многоядерных и массивно-параллельных системах).
Первые три библиотеки обеспечивают интерфейс к наличной инсталляции библиотеки MPI и, насколько возможно, транслируют в Octave (bcMPI — и в MATLAB) синтаксис подмножества вызовов MPI. Соответственно в этих случаях вычисления распределены лишь настолько, насколько это подготовлено программистом, и обеспечиваются в пределах возможностей системной инсталляции MPI.
Библиотека parallel, напротив, не требует наличия среды типа MPI или PVM, а обеспечивает распределенность с помощью внутренних средств пакета Octave.
Совместимость с MATLAB
Octave был написан с учётом совместимости с MATLAB и реализует многие его возможности:
Запуск Octave
На большинстве систем Octave можно запустить, набрав в командной строке команду «octave»:
Octave отобразит начальное сообщение, затем приглашение командной строки сообщит о готовности программы к вводу. Сразу после этого вы можете приступить к вводу команд. Приглашание выглядит следующим образом:
Если у вас возникли проблемы, вы можете просто прервать Octave нажав «Ctrl-C» (далее для краткости пишется «C-c»).
Чтобы выйти из Octave, наберите «quit» или «exit» в командной строке:
В системах, которые поддерживают контроль над заданиями, можно приостановить Octave, послав ему сигнал SIGTSTP, обычно для этого нужно нажать «C-z».
Простейшие примеры
Следующие главы описывают все возможности Octave в подробностях, но прежде чем начать их изучение, может оказаться полезным рассмотрение нескольких примеров с демонстрацией некоторых возможностей Octave.
Если вы новичок в Octave, я бы рекомендовал вам начать обучение с рассмотрения этих примеров. Строки, содержащие пометки типа «octave:13>» — строки ввода, которые должны заканчиваться нажатием клавиши «Enter». После нажатия этой клавиши Octave либо выдаст ответ либо построит график.
Создание матрицы
Чтобы создать новую матрицу и сохранит её в переменной, введите команду:
Octave выведет на экран матрицу с аккуратно выровненными колонками. Если команду закончить «;», то Octave не будет выводить результат команды. Например, команда:
создаст матрицу с 3-мя строками и 2-мя столбцами, элементы которой примут случайные значения в промежутке между нулём и единицей.
Чтобы отобразить значение любой переменной, просто напишите имя переменной. Например, чтобы отобразить значения, хранящиеся в матрице B, наберите команду:
Арифметические операции с матрицами
Octave использует удобную форму записи операторов для представления арифметических операций над матрицами. Например, чтобы умножить матрицу A на число, наберите команду:
Чтобы перемножить две матрицы A и B, наберите команду:
Для того, чтобы выполнить матричное произведение матрицы A на транспонированную матрицу A (A * transpose(A)), наберите команду:
Решение линейных уравнений
Для решения системы линейных уравнений A ∗ X = b <\displaystyle
Если матрица коэффициентов вырождена, программа выведет сообщение о предупреждении и вычислит решение минимальной нормы.
Интегрирование дифференциальных уравнений
\frac
Задаём начальные условия:
Задаём вектор аргументов t <\displaystyle
t> (первый элемент вектора аргументов соответствует начальным условиям, записанным выше):
Теперь вводим простую команду для интегрирования дифференциальных уравнений:
Графический вывод
Чтобы вывести на экран графическое представление решения предыдущего примера, воспользуйтесь командой:
Если вы пользуетесь графическим интерфейсом, Octave автоматически создаст отдельное окно для графика.
Чтобы сохранить график, построенный на экране, воспользуйтесь командой «print». Например:
создаст файл с именем foo.eps в формате EPS, содержащий построенный график. Команда:
выдаст дополнительную информацию о параметрах команды «print», а также о файлах различных форматов, в которых можно сохранять полученные графики.
Редактирование в командной строке
Используя командную строку Octave, вы можете вызвать, исправить и повторить предыдущие команды с помощью Emacs-подобных или vi-подобных команд редактирования. По умолчанию используются клавиатурные привязки к командам в стиле Emacs. Например, чтобы вызвать предыдущую команду, нажмите «C-p». Нажатие «C-n» позволит перемещаться по истории введённых команд в прямом направлении. Нажатие клавиш «C-f» и «C-b» перемещает курсор ввода командной строки вправо и влево соответственно, и т. д.
Полное описание возможностей команд редактирования даётся в разделе «Редактирование командной строки».
Справка и документация
Octave имеет обширную справочную информацию, доступ к которой можно получить из командной строки Octave.
Для получения справочной информации, вы должны знать имя команды, о которой требуется получить справку. Имя функции может быть не всегда очевидным, хороший способ — набрать для начала команду «help». Она покажет все операторы, зарезервированные слова, функции, встроенные переменные и функции файлов. Другой способ — выполнить поиск с помощью функции «lookfor». Эта функция описывается в разделе «Получение помощи».
После того, как вам станет известно имя функции, о которой вы хотите получить справку, введите его в качестве аргумента команды «help». Например:
отобразит справку для функции «plot».
Для вывода на экран информации, которая не может полностью на нём поместиться, Octave использует пейджеры на подобие less и more. Нажатие «Enter» выводит следующую строку, «Пробел» — следующую страницу. Клавиша «q» закрывает пейджер.
Соглашения
Этот раздел объясняет типографические соглашения, используемые в этом руководстве. Возможно вы захотите пропустить этот раздел и вернуться к нему позже.
Шрифты
метасинтаксические переменные
Запись вычислений
В примерах, рассмотренных в данном руководстве, результаты выражений, которые вы вычисляете отмечаются символами „=>“. Например:
Эту запись можно интерпретировать как: «Корень из двух равен 1.4142».
В некоторых случаях, матричные значения, возвращаемые выражениями, отображаются следующим образом:
А в других случаях, чтобы наглядно показать результат, так:
Sometimes to help describe one expression, another expression is shown that produces identical results. The exact equivalence of expressions is indicated with `==’. For example:
Форматированный вывод
Большинство приведенных здесь примеров отображают результат своей работы на дисплее сразу после их выполнения. Выводимое на дисплей значение отображено после знака `-|’. Значение возвращенное в результате выполнения выражения, приведенного ниже, приведено после знака `=>’.
Сообщения об ошибках
Примеры сообщений об ошибках. Как правило сообщение об ошибке отображаются в терминале. Сообщения об ошибках выводятся на следующую строку, обозначается обычно красным цветом:
Моделирование динамических систем: введение в GNU Octave
Жили-были умные, но очень жадные люди, которые написали замечательную программу Matlab. Умные они были потому, что программа вышла хорошей, а жадными, потому что очень любили деньги. Так любили, что брали их за свой Matlab не только с дядек серьезных, матлабом деньги зарабатывающих, а и с бедных студентов тоже, которым порой и сухую корочку хлеба купить не за что было. И кончилась бы сказочка скоро и невесело, если бы мир был не без добрых и умных людей, написавших похожие на матлаб программы, хоть худо-бедно работающие, да для всех желающих бесплатные. И с открытыми исходными текстами. Так что сами бедные студенты стали те программы дописывать, и работать они лучше и лучше стали с каждым годом. И стали тогда все жить-поживать, да добра наживать.
Введение
Большинство научных работников не ломают голову над тем, как устроены численные методы внутри. Они просто используют их, применяя в своей работе специализированные пакеты численных расчетов. Это совершенно не означает, что не нужно разбираться с тем, как эти методы устроены. Программу пишет человек, а ему свойственно ошибаться. И ошибки сквозят даже в самых дорогих и навороченных системах численной математики сплошь и рядом. К тому же есть задачи, где применение стандартных систем невозможно.
Вместе с тем, умение использовать универсальный математический софт это must have для современного ученого, потому что изобретая велосипед можно никогда не добраться до решения своей основной задачи. Сегодня мы рассмотрим обещанный Octave, попытавшись решить с его помощью очередную детскую задачу, сделав при этом недетские выводы.
1. Что такое Octave и где его взять
GNU Octave — свободный математический пакет численной математики, основанный на концепциях своего проприетарного собрата Matlab. Он доступен для всех популярных на сегодняшний день десктопных платформ, и получить его можно, зайдя в раздел загрузки на официальном сайте.
Большую часть экрана занимает так называемое командное окно, с приглашием командной строки вида «>>». Введем туда что нибудь и нажмем Enter
шикарно, переменная ans содержит результат последней операции, если вы явно не завели переменную под результат, например так
переменные вводятся «на ходу», как это принято в интерпретируемых языках. Да собственно m-язык октава и есть язык интерпретатора, очень напоминающий аналогичный язык матлаба. Один раз заведенная переменная сохраняет свое значение и тип до следующего присваивания, либо до полной очистки памяти командной оболочки
С левой стороны окна есть область, в которой расположены (сверху вниз): файловый менеджер, список глобальных переменных с их значениями, а также история введенных команд
Стоит обратить внимание на то, что для переменных указана размерность (Dimention) 1х1. Основным типом данных в Octave, как и в Matlab является матрица. Так вот наши числа это на самом деле матрицы размером 1 на 1 элемент.
видно, что переменная x стала недоступна, до тех пока мы явно не присвоили ей значение снова.
Скажу честно, что с Ocatve я никогда не работал и разбираюсь вместе с читателем. Поэтому, предположим, что мы уже знаем достаточно, чтобы решить какую нибудь задачу. Например ту, которую решали в прошлый раз. Но сначала…
2. Нормальная форма Коши
и получаем вместо одного уравнения 2-го порядка два уравнения 1-го порядка, которые нужно решать вместе, одновременно
Это уже не одно уравнение, а система дифференциальных уравнений, содержащая две неизвестные зависимости и
.
Как решать систему уравнений численно? Да так же, как и одно уравнение. Соберем все наши переменные в вектор-столбец (или массив, или матрицу-столбец, кому как удобно выражаться это не важно)
и правые части тоже соберем в вектор-столбец
Тогда рекуррентная формула метода Эйлера будет справедлива для каждого элемента этих столбцов
где n — число уравнений, в нашем случае их два.
К чему я всё это? А к тому, что Octave требует представлять дифференциальные уравнения именно в нормальной форме Коши.
С точки зрения механики вектор-столбец y называется вектором состояния системы или вектором фазовых координат. Тогда наша система уравнений превращается в одно векторное уравнение
Теперь возьмем, и в командном окне Octave наберем
Таким образом мы определяем функцию, которая на вход принимает текущее значение фазовых координат y и текущее время t, а на выходе возвращает значение производных от фазовых координат. Видим, что приглашение командной строки «>>» пропало, система ждет что мы закончим ввод тела функции ключевым словом endfunction. Продолжим набирать функцию
Итак, в теле функции мы определили g = 10 — принятое нами значение ускорения свободного падения. Мы видим, что же не появилось в списке переменных слева — эта переменная является локальной, и существует лишь в пределах функции. Переменная y это матрица-столбец, первый элемент y(1) которой это координата z, второй y(2) — проекция вектора скорости vz. Соответственно, dydt — это то значение, которое возвращает наша функция, это тоже матрица-столбец первый элемент которой это производная от z по времени, а второй — производная от vz по времени. То есть мы записали нашу систему дифференциальных уравнений в терминах Octave.
Теперь определимся с диапазоном времени, для которого нам надо получить результат. Пусть это будет десять точек от 0 до 1 секунды, с шагом 0.1 — сравним результат с ручным примером
Тут всё очевидно: t0 — начальный момент времени, tend — конечный момент времени. А вот deltaT = 0.1 секунда — это не шаг интегрирования! Это интервал, с которым Ocatve будет отображать для нас численное решение уравнения. Последняя команда формирует массив моментов времени для которых мы хотим получить решение.
Как вы знаете из прошлой статьи, для решения уравнения численно необходимо знать начальные значения скорости и координаты. Необходимо задать их для Octave
тем самым мы определили матрицу-столбец, содержащую начальную координату и начальное значение вертикальной проекции скорости. А теперь решаем уравнение
Функция lsode решит для нас уравнение численно. Первый параметр — имя функции, которая вычисляет производные от фазовых координат. Это функция F, мы её задали. Второй параметр — начальные условия, то есть значения фазовых координат в момент времени t = t0. Последний параметр — массив моментов времени, для которых мы хотим рассчитать значения фазовых координат. Жмем Enter…
В ответ вываливается гора требухи, оканчивающаяся предложением
нам предлагают листать требуху дальше (f), вернуться назад (b), или выйти (q). Те, кто знает *nix-подобные системы, знают, что это консольный вывод под управлением юниксовой утилиты less. Мы притворимся что не знаем, выйдем отсюда, нажав на клавиатуре q.
Наберем теперь в командной строке «y» и нажмем Enter
Ничего не напоминает? Ну конечно же это то самое решение, что мы получили для задачи из прошлой статьи. Только оно теперь удивительно точное — значения совпадают с аналитическим решением! Открою вам тайну — это точное решение нашей задачи. Связано это с тем, что функция lsode использует для решения задачи отнюдь не метод Эйлера, а нечто более продвинутое. Движение камня происходит с постоянным ускорением, и та формула численной аппроксимации, что применяется в данном методе, очевидно просто совпадает с аналитическим решением задачи. Хотя, если лезть в дебри представления машиной чисел с плавающей запятой, то… А ну да ладно, сейчас не об этом.
3. Строим график
Наберите теперь команду
Выскочит окошко с графическим представлением решения
Синяя кривая сверху — координата камня. Оранжевая снизу — вертикальная проекция скорости. Введенная команда неудобна тем, что строит график для всех функций сразу. А если мы хотим, построить, зависимость скорости от высоты? Тогда поступим так
Будет построен график, где по оси абсцисс пойдет переменная y(1), а по оси ординат — y(2), что есть соответственно высота и вертикальная проекция скорости
Такой график в механике называют фазовым портретом системы, то есть траекторией движения системы в пространстве фазовых координат. В данном случае фазовые координаты это высота камня над поверхностью Земли и его скорость. В механике часто нельзя получить точного решения в виде функций времени, но можно связать между собой координаты и скорости исходя из энергетических соображений. По полученным зависимостям можно найти фазовую траекторию системы и сделать много выводов о характере её движения не решая задачу до конца. Об этом мы тоже как-нибудь поговорим.
А пока предлагаю выполнить самостоятельное задание — постройте график зависимости высоты от времени и скорости от времени в отдельных окнах. И старайтесь не смотреть под спойлер
Заключение
На этом первое знакомство с Octave, как средой для численного моделирования будем считать оконченным. Теперь у нас есть мощный инструмент, с помощью которого мы будем постигать более изощренные премудрости.
- Что такое gnu gpl
- Что такое gnu лицензия