Высшая математика командной строки — GNU Octave

  • Tutorial

Как я и обещал, перехожу от обзора программ замены калькулятора к более серьезным инструментам. Если помните схему из предыдущего поста, то во второй категории находились табличные: OpenOffice / LibreOffice сотоварищи. Эту партию мы можем смело пропустить, так как к командной строке она не относится, к тому же, среди читателей Хабра трудно найти человека, который бы в них не разбирался. Поэтому перехожу сразу к третьей категории.


Специализированные математические программы, уровень студент+


  1. GNU Octave.
  2. Scilab.
  3. Maxima.
  4. R.
  5. Sage.

На первом месте в этом списке находится Octave, и это не случайность. Исследователи из Университета Мэриленда в США провели сравнительный анализ математических вычислений, используя MATLAB, Octave, SciLab и FreeMat в простом сценарии и в сложном. В первом случае решали систему линейных уравнений а в втором — конечно-разностную дискретизацию уравнения Пуассона в двухмерном пространстве. Основной вывод — GNU Octave справляется с задачами лучше остальных открытых математических пакетов, демонстрируя результат (страницы 23 и 25) сопоставимый с матлабовским.


Но сначала немного исторического контекста, чтобы понять, как закалялись математические программы с открытыми исходниками.


Догнать и перегнать MATLAB


Так сложилось, что коммерческие программы прибежали и первыми застолбили поляну математических вычислений. Уже с конца 1970-х гг. создатель языка программирования Клив Моулер распространяет MATLAB в университетах США, а в 1984-м вместе с двумя компаньонами переписывают его с Фортрана на Си и создают компанию The MathWorks. Примечательно, что ранние версии распространялись с открытым исходным кодом.


Это было-было, а MATLAB, каким мы его знаем сегодня — это ЯП высокого уровня с поддержкой 2D / 3D графики, разнообразными математическими функциями, интерактивной средой программирования, численных расчетов и решения задач. Внешние интерфейсы позволяют ему интегрироваться со сторонними приложениями и языками программирования. Более 1 000 000 инженеров и ученых по всему миру используют MATLAB и платят за это солидную денежку.


С большим опозданием в игру включаются программы с открытыми исходниками. Только в 1990-х появляются математические пакеты GNU Octave, Scilab и вступают в конкуренцию с лидером вычислительного программирования.


Задуманный изначально как программное пособие для проектирования химического реактора и названный в честь профессора химии Октава Левеншпиля, преподававшего автору математического пакета, Octave призван был заменить студентам Техасского Университета сложный в отладке Fortran. Версия 1.0 вышла в свет 17 февраля 1994 г. Проект стабильно развивается, и в июле нынешнего года зарелизился Octave 4.0.3. Ждем ебилдов.




Основной миссией Octave была, и в обозримом будущем скорее всего так и останется, быть годной заменой MATLAB так же, как OpenOffice/LibreOffice замещает MS Office для тех, кто умеет считать копейку. Собственно, для этого Octave имеет совместимый с MATLAB синтаксис и набор функций. Более того, несовместимость с MATLAB считается багом, однако софтверная Фемида уже имеет подобный прецедент, и это не считается нарушением копирайта. В этой связи, можно считать Octave программным клоном. Правда о полной совместимости пока говорить не приходится, но работа в этом направлении не прекращается.


Octave написан на C++, используя стандартную библиотеку шаблонов, имеет интерактивный командный интерфейс, поддерживает расширения — динамически загружаемые модули на родном языке или на C, C++, Fortran и др. Так же как и MATLAB, в алгебраических вычислениях Octave использует библиотеки Basic Linear Algebra Subroutines (BLAS) и Linear Algebra Package (LAPACK).


Установка


Установка Octave в Linux ничем не отличается от установки других программ. На Gentoo Linux запускаем:


$ sudo emerge -av octave

Дебианщики делают то же самое с помощью apt.


$ sudo aptitude install octave

Для SUSE и Arch тоже все очень просто, а вот пользователям Красной Шапки и CentOS придется чуток повозиться. Попытка установить Octave легким движением кисти завершается ошибкой, пакет в репозитариях не найден.


[root@server ~]# yum install octave
Загружены модули: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
HighAvailability                                               | 4.1 kB  00:00:00
ResilientStorage                                               | 4.1 kB  00:00:00
server                                                         | 4.1 kB  00:00:00
vmware-tools                                                   |  951 B  00:00:00
Пакета с названием octave не найдено.
Ошибка: Выполнять нечего

Благо, есть обходной путь. Нужно сперва установить пакет epel-release.


[root@server ~]# wget https://dl.fedoraproject.org/pub/epel/7/x86_64/
[root@server ~]# yum localinstall epel-release-6-7.noarch.rpm

И только после этого yum install octave сработает.
Наконец, все готово и программа установлена.


[root@server ~]# octave
GNU Octave, version 3.8.2
Copyright (C) 2014 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type 'warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

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

Read http://www.octave.org/bugs.html to learn how to submit bug reports.
For information about changes from previous versions, type 'news'.

octave:1> 

Операции с матрицами


Не будем терять время и делать операции, которые можно повторить с помощью bc и awk, о ктоторых речь шла в прошлый раз. Поиграемся немного с матрицами.


Сперва простое транспонирование матрицы:


octave:1> A=[1 3 5; 2 4 6]
A =
   1   3   5
   2   4   6

octave:2> A'
ans =
   1   2
   3   4
   5   6

Попробуем решить систему линейных уравнений:


x + y + z = 9
2x + 4y - 3z = 1
3x + 6y - 5z = 0

Вбиваем матрицу A, вектор b и решаем уравнение Ax = b в матричном виде


octave:1> A=[1 1 1; 2 4 -3; 3 6 -5]
A =
   1   1   1
   2   4  -3
   3   6  -5

octave:2> b=[9; 1; 0]
b =
   9
   1
   0

octave:3> x=A\b
x =
   7.00000
  -1.00000
   3.00000

Находим детерминант и собственные значения матрицы.


octave:4> det (A)
ans = -1.00000

octave:5> eig (A)
ans =
-2.88897
2.76372
0.12525

Комплексные числа тоже поддерживаются в вычислениях.


octave:6> A=[-3 0 2; 1 -1 0; -2 -1 0]
A =
  -3   0   2
   1  -1   0
  -2  -1   0

octave:7> x=det (A)
x = -6
octave:8> y=eig(A)
y =

  -1.00000 + 1.41421i
  -1.00000 - 1.41421i
  -2.00000 + 0.00000i

Функции и переменные


В Octave переменные и функции создавать гораздо проще, чем, к примеру, в Java или C. На примере матриц, мы уже видели как объявлять переменные. Создания новой функции имеет следующий синтаксис


function [res1, res2, ..., resM] = имя_функции (arg1, arg2, ..., argN)
тело функции
endfunction

Как правило, новую функцию создают либо в отдельном файле, либо в скрипт-файле Octave
до первого ее вызова. Если предполагается использовать пользовательскую функцию в разных скрипт-файлах, то, конечно, предпочтительно создать ее в отдельном файле. В GNU Octave файлы с функциями имеют расширение .m и загружаются автоматически. Имя файла должно строго совпадать с именем функции.

Напишем функцию для решения квадратичного уравнения ax² + bx + c = 0


octave:9> function [x1,x2] = quadr(a, b, c)
> D = sqrt(b^2-4*a*c);
> x1 = (-b-D)/(2*a);
> x2 = (-b+D)/(2*a);
> endfunction
octave:10> [y1,y2]=quadr(a, b, c)
y1 =  2
y2 =  3

Графический интерфейс


Вообще-то, мы тут за математику командной строки гутарим, но пока непонятно как вывести на экран график функции. Впрочем, никакого секрета тут нет — для этих целей используется Gnuplot. Так можно изобразить Аттрактор Лоренца, установив дополнительный пакет odepkg.


 function [vyd] = froessler (vt, vx)
   vyd = [- ( vx(2) + vx(3) );
          vx(1) + 0.2 * vx(2);
          0.2 + vx(1) * vx(3) - 5.7 * vx(3)];
 endfunction

 A = odeset ('MaxStep', 1e-1);
 [t, y] = ode78 (@froessler, [0 70], [0.1 0.3 0.1], A);

 subplot (2, 2, 1); grid ('on'); 
   plot (t, y(:,1), '-b;f_x(t);', t, y(:,2), '-g;f_y(t);', \
         t, y(:,3), '-r;f_z(t);');
 subplot (2, 2, 2); grid ('on'); 
   plot (y(:,1), y(:,2), '-b;f_{xyz}(x, y);');
 subplot (2, 2, 3); grid ('on'); 
   plot (y(:,2), y(:,3), '-b;f_{xyz}(y, z);');
 subplot (2, 2, 4); grid ('on'); 
   plot3 (y(:,1), y(:,2), y(:,3), '-b;f_{xyz}(x, y, z);');



Наиболее удобной графической оболочкой для работы с Octave является программа QtOctave. Последняя уже стабилизировалась и включена в состав пакета с момента выхода Octave 4.0.


Что-же дальше?


Может возникнуть вопрос: а зачем вообще нужны открытые математические пакеты? Офисные приложения нужны всем, но ведь далеко не каждому необходимо сидя дома решать уравнения Пуассона, с помощью преобразования Лапласа. Для ВУЗ-ов MATLAB стоит значительно дешевле, нежели для физических лиц и коммерческих организаций. Коммерческие организации, если будет нужно, найдут денежные средства, а обычные люди пусть занимаются математикой в университетах или считают столбиком.


Конечно же, это ошибочное мнение. Научные расчеты, выполненные с использованием открытого ПО имеют дополнительный «уровень защиты», ведь при желании любой может повторить прогнать те же самые расчеты и проверить валидность результатов. Те же самые вычисления, выполненные на дорогущем ПО, частично отсекают возможность проверки результатов. Проблема на самом деле гораздо шире (английский текст) и дело не только в открытых или проприетарных математических программах. Не секрет, что научные журналы как правило не требуют от авторов предоставить данные и методику, достаточные для гарантированного повтора результатов эксперимента, проверки модели. Особенно часто этим грешат экономисты и финансисты, попросту засекречивая свои данные. Проверка расчетов и выводов среди выборки из массива статей с «засекреченными» данными дала неожиданные результаты (английский текст). Наука, как и софт, должна быть открытой, вот почему открытые математические пакеты имеют ценность для всего общества.


Рекомендуется к прочтению


Кроме последней книги, остальные материалы, использованные в статье, можно без труда найти в интернете. Половина из приведенных выше ссылок ведут на английские страницы. Буду рад вкратце сообщить о чем идет там речь или помочь с переводом.


  • GNU Octave 4.0.1 Manual
  • Алексеев Е.Р., Чеснокова О.В GNU Octave для студентов и преподавателей, 2011
  • Н. Б. Шамрай Краткое руководство по работе с пакетами GNU Octave и Gnuplot, 2011
  • Jesper Schmidt Hansen GNU Octave
Share post

Comments 39

    +2
    Чем подобные пакеты удобнее питона, с подключенными математическими библиотеками?
      0
      Думаю, одним из преимуществ является пологая кривая обучения. Но вообще-то это разные категории софта, чисто языковые среды надо сравнивать с таковыми же а не с математическими пакетами.
        +3
        В последнее время экосистема python показывает значительный рост. Для этого языка есть отличные библиотеки, например, для машинного обучения python значительно удобнее, чем MATLAB.
        +7

        А вот зря вас люди минусуют. На самом деле классическая связка для Python из numpy, scipy и matplotlib вполне может составить конкуренцию Octave. Эти библиотеки тоже используют для вычислений высокооптимизированные варианты BLAS/LAPACK (вроде интеловской MKL), в них названия команд совпадают с матлабовскими, что очень снижает порог вхождения. Все больше научных работ основывается на Python. Хорошо это или плохо, но отрицать, что Python становится одной из рабочих лошадок в науке, нельзя. Во многом это заслуга еще и среды разработки Jupyter. Так что во многих сферах эта связка вполне себе замена MATLAB.

          +2
          Хотелось бы отметить, что если вам нужна реальная скорость, то вам следует ознакомиться со следующей статьей и посмотреть в сторону D.
            0

            А что мешает ту библиотеку вызывать из Python? Преимущество Python как раз в том, что он — хороший язык-связка.

            +1
            А ещё можно взять cython и если надо критический по производительности кусок написать на си. Думаю плюс питона еще в том что есть куча готовых библиотек, на случай если вдруг будет нужно кроме математики в проекте сделать какое то дополнительное действие.
            +3
            Куда ближе к непосредственно счислениям и нужным математическим действиям. Если есть много опыта программирования и знания пакетов, то ты уже не видишь синтаксиса питона, а только необходимые мат. выражения.

            В Октаве с этого начинают. Да, финальный код вряд ли можно в продакшн пускать, но сделать прототип модели очень быстро и удобно. Меньше оберточного кода.
              +1
              В настоящее время занимаюсь разработкой численной модели движения космических аппаратов. Сделал полный аналог пробного проекта на двух языках: на Python (с использованием библиотеки numpy), и на языке MATLAB/Octave. На Python (CPython 3) модель работает в полтора-два раза быстрее, чем в MATLAB, в среде Gnu Octave в несколько раз медленнее, чем в MATLAB, в зависимости от настроек модели. Никакой особой разницы в плане удобства использования того или иного языка или набора библиотек не вижу.
              +6
              Хочу Simulink под октавом!
                0
                Octave — великолепный проект. В последний год я начал все чаще его использовать для замены Матлаба, в первую очередь в тех ситуациях, где установка Матлаба затруднена. Также в связи с тем, что в новых версиях Windows был приведен в полную негодность встроенный «калькулятор», я теперь даже для целей «устного счета» использую Octave. Она грузится быстрее.

                Почти все нужные мне функции Матлаба имеются в Октаве. Постепенно учусь обходиться без тех, которых не имеется. Также гораздо выше мотивация поучаствовать в свободном проекте, нежели подарить разработку фирме Mathworks.
                  0
                  Вместо встроенного калькулятора давно пользуюсь DevCalc
                    0
                    к сожалению до вольфрамовской математики им обоим ой как далеко.

                    а для устного счёта есть http://avt-lab.ru/calc.htm
                      +1
                      А разве корректно их сравнивать? С учетом того, что Matlab\Octave ориентированы на численные расчеты, а Mathematica — на символьные? Насколько я помню, Математику сравнивать корректно, например, с Maple\Maxima. Ну, это без учета вопроса стоимости лицензий, конечно :)
                        0
                        не сказал бы что в математике с численными расчётами хуже чем в матлабе, соответственно зачем нужен матлаб когда есть математика, которая может ещё и в символьные вычисления, не очень понятно.

                        Ну, это без учета вопроса стоимости лицензий, конечно :)
                  • UFO just landed and posted this here
                      0
                      Дурному учите, матлаб как язык — инвалид с рождения, переходите на R, у нас есть пакеты (и нет выбора между 2й и 3й версией, если вы понимаете о чем я)
                        +4
                        А еще у вас есть write-only код. Спасибо, мы уж как-нибудь на питоне перебьемся.
                          +1
                          На мой субъективный взгляд у питона и R степень write-only-вости примерно одинакова.
                            0
                            Покажете? На мой взгляд R как и питон не те языки на которых можно случайно написать write-only код (и при этом быть в здравом уме) если конечно за таковой не считать сумасшедший копи-паст и именование переменных согласно звёздам на небе.
                            • UFO just landed and posted this here
                                0

                                Ну, если бегло просмотреть вакансии, то прям сейчас в Apple в команду разработки Siri нужен человек со знанием NumPy, в Tesla Motors и в Google в команду автономных автомобилей,


                                Детишки неплохо зарабатывают нынче.

                            • UFO just landed and posted this here
                              0
                              На РХЕЛе и ЦентОСе 7 проще сделать: yum install epel-release; yum install octave
                                +1
                                Я тоже так думал, но вот RHEL 7, ничего не найдено.

                                [root@server ~]# yum install epel-release
                                Загружены модули: langpacks, product-id, subscription-manager
                                This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
                                HighAvailability                                                     | 4.1 kB  
                                00:00:00
                                ResilientStorage                                                     | 4.1 kB
                                00:00:00
                                server                                                               | 4.1 kB
                                00:00:00
                                vmware-tools                                                         |  951 B
                                00:00:00
                                Пакета с названием epel-release не найдено.
                                Ошибка: Выполнять нечего
                                [root@server ~]# cat /etc/redhat-release
                                Red Hat Enterprise Linux Server release 7.0 (Maipo)
                                
                                  0

                                  Да, действительно… Я был неправ насчет RHEL.

                                +5

                                Все курсовые считал в ней (2001-2006). К диплому обросла костыляками на bash/tcl/php (ну не спрашивайте почему так :)), которые правильно оформленный расчёт, его результат хавали, переваривали, делали подстановки в виде LaTeX формул в LaTeX-же шаблон, после чего генерился результирующий PDF пояснительной записки. Если обнаруживалась ошибка в расчётах, её исправление автоматически приводила к корректировке всех формул в записке.

                                  +4
                                  Выводы тоже переписывались автоматически в зависимости от результатов расчетов? ;)
                                    0

                                    Юмор оценил :)


                                    Конечно, если задача стояла так, что выводы нужно было корректировать в зависимости от результата, то приходилось ручками править. Но от львиной доли рутины и ошибок по недосмотру я всё-таки себя избавил.

                                  +1
                                  Несколько лет назад вычислительную часть диплома (кафедра Прикладная математика, численные расчеты были очень объемные) писал на Octave, графики по результатам расчетов строил с помощью Asymptote и картинками вставлял в диплом на TeX :) Эх, молодость :)
                                    +1
                                    В институте частенько пользовался maxima. Подскажите, у кого есть опыт, сильно ли она сейчас octave проигрывает?
                                      +2
                                      Maxima тоже классная, только она больше как алгебраическая система. Напрямую их сравнивать не стоит, у них несколько разные предметные области. Для численных методов — Octave рулит.
                                      0
                                      У меня картинки
                                      другие получились:
                                      image

                                      (
                                      octave:1> ver
                                      ----------------------------------------------------------------------
                                      GNU Octave Version 3.6.2
                                      GNU Octave License: GNU General Public License
                                      Operating System: Linux 3.2.0-4-486 #1 Debian 3.2.41-2 i686
                                      ----------------------------------------------------------------------
                                      Package Name | Version | Installation directory
                                      --------------+---------+-----------------------
                                      odepkg *| 0.8.2 | /usr/share/octave/packages/odepkg-0.8.2
                                      )
                                        +1
                                        К сожалению, octave намного медленнее Matlab. Вроде бы в будущих версиях обещают ускорить расчет за счет JIT.
                                          0
                                          Скорее всего зависит от типа вычислений. Вторая ссылка в статье, сравнения прооизводительности на сложных вычисления на стр. 23 и 25. В некоторых вычислениях Octave превосходит MATLAB, за счет более рационального алгоритма.
                                          0
                                          Octave отличная программа (пакет программ), однако проблемы с юникодом в путях к файлам и подписям к графикам (Windows).
                                            +2
                                            Долгое время был уверен во всемогуществе таких именитых программ как Matlab, Mathematica, Maple… до тех пор пока не столкнулся с более-менее серъёзными вещами. Оказалось, например, Matlab, впрочем как и другие известные пакеты, не ахти как поддерживает тензоры, и решение задач математической физики за некторыми исключениями, касающихся некоторых простых случаев, крайне затруднительно в нём, в реальности возникает необходимость писать в нём реализацию численных схем с почти нуля, что само по себе устраняет преимущество его использования как набора эффективных готовых решений. Правда, в самых последних версиях Matlab данные расчётные инструменты были дополнены, но тем не менее, впечатление о Matlab и других гигантах индустрии как о всемогущих универсальных математических пакетах на все случаи жизни было испорчено. В итоге пришлось смотреть в сторону более специфических программ таких как ANSYS, COMSOL и прочих пакетов для решения задач математической физики. Но как и прежде остановился на открытом и опенсорсном варианте в виде OpenFOAM, потому как считаю, что использование открытых программ не только имеет те преимущества, которые описаны в статье, в частности, то, что открытый код всегда можно перепроверить и тем самым обосновать результат, получаемый с помощью этого открытого ПО, но и позволяет лучше разобраться в самих применяемых математических методах. Что касается Octave, хороший пакет, не то что для серъёзных научных работ, но, как было сказано, для категории студент+ прекрасная вещь. Много его использовал, правда, некоторых нужных мне в свое время возможностей, что были в Matlab по обработке сигналов в нем не оказалось.
                                              0
                                              Matlab лучше решает некоторые минимаксные задачи, чем Maple, ИМХО(проверял своими кривыми руками).
                                              Maple хорош в аналитике, как говорит знакомый д.ф-м н., который использовал его 25+ лет (маразмом вроде бы не болеет).

                                              А для чисто численных методов лучше вручную писать, чтобы не упереться в ограничения конкретного пакета, что в какой-то момент обязательно произойдет.
                                              • UFO just landed and posted this here

                                            Only users with full accounts can post comments. Log in, please.