Как я и обещал, перехожу от обзора программ замены калькулятора к более серьезным инструментам. Если помните схему из предыдущего поста, то во второй категории находились табличные: OpenOffice / LibreOffice
сотоварищи. Эту партию мы можем смело пропустить, так как к командной строке она не относится, к тому же, среди читателей Хабра трудно найти человека, который бы в них не разбирался. Поэтому перехожу сразу к третьей категории.
Специализированные математические программы, уровень студент+
- GNU
Octave
. Scilab
.Maxima
.R
.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
Комментарии (38)
MichaelBorisov
11.10.2016 00:49Octave — великолепный проект. В последний год я начал все чаще его использовать для замены Матлаба, в первую очередь в тех ситуациях, где установка Матлаба затруднена. Также в связи с тем, что в новых версиях Windows был приведен в полную негодность встроенный «калькулятор», я теперь даже для целей «устного счета» использую Octave. Она грузится быстрее.
Почти все нужные мне функции Матлаба имеются в Октаве. Постепенно учусь обходиться без тех, которых не имеется. Также гораздо выше мотивация поучаствовать в свободном проекте, нежели подарить разработку фирме Mathworks.pvvv
11.10.2016 12:42к сожалению до вольфрамовской математики им обоим ой как далеко.
а для устного счёта есть http://avt-lab.ru/calc.htmsvgrbnv
11.10.2016 16:00+1А разве корректно их сравнивать? С учетом того, что Matlab\Octave ориентированы на численные расчеты, а Mathematica — на символьные? Насколько я помню, Математику сравнивать корректно, например, с Maple\Maxima. Ну, это без учета вопроса стоимости лицензий, конечно :)
pvvv
11.10.2016 17:51не сказал бы что в математике с численными расчётами хуже чем в матлабе, соответственно зачем нужен матлаб когда есть математика, которая может ещё и в символьные вычисления, не очень понятно.
Ну, это без учета вопроса стоимости лицензий, конечно :)
tzlom
11.10.2016 01:18Дурному учите, матлаб как язык — инвалид с рождения, переходите на R, у нас есть пакеты (и нет выбора между 2й и 3й версией, если вы понимаете о чем я)
daiver19
11.10.2016 01:52+4А еще у вас есть write-only код. Спасибо, мы уж как-нибудь на питоне перебьемся.
0xd34df00d
11.10.2016 05:16+1На мой субъективный взгляд у питона и R степень write-only-вости примерно одинакова.
tzlom
11.10.2016 11:16Покажете? На мой взгляд R как и питон не те языки на которых можно случайно написать write-only код (и при этом быть в здравом уме) если конечно за таковой не считать сумасшедший копи-паст и именование переменных согласно звёздам на небе.
tsabir
11.10.2016 04:56На РХЕЛе и ЦентОСе 7 проще сделать: yum install epel-release; yum install octave
temujin
12.10.2016 08:28+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)
monah_tuk
11.10.2016 06:23+5Все курсовые считал в ней (2001-2006). К диплому обросла костыляками на bash/tcl/php (ну не спрашивайте почему так :)), которые правильно оформленный расчёт, его результат хавали, переваривали, делали подстановки в виде LaTeX формул в LaTeX-же шаблон, после чего генерился результирующий PDF пояснительной записки. Если обнаруживалась ошибка в расчётах, её исправление автоматически приводила к корректировке всех формул в записке.
nerudo
11.10.2016 12:37+4Выводы тоже переписывались автоматически в зависимости от результатов расчетов? ;)
monah_tuk
11.10.2016 18:36Юмор оценил :)
Конечно, если задача стояла так, что выводы нужно было корректировать в зависимости от результата, то приходилось ручками править. Но от львиной доли рутины и ошибок по недосмотру я всё-таки себя избавил.
svgrbnv
11.10.2016 07:48+1Несколько лет назад вычислительную часть диплома (кафедра Прикладная математика, численные расчеты были очень объемные) писал на Octave, графики по результатам расчетов строил с помощью Asymptote и картинками вставлял в диплом на TeX :) Эх, молодость :)
mystdeim
11.10.2016 09:09+1В институте частенько пользовался maxima. Подскажите, у кого есть опыт, сильно ли она сейчас octave проигрывает?
temujin
11.10.2016 09:39+2Maxima тоже классная, только она больше как алгебраическая система. Напрямую их сравнивать не стоит, у них несколько разные предметные области. Для численных методов —
Octave
рулит.
ainoneko
11.10.2016 10:42У меня картинки
другие получились:Jenyay
11.10.2016 12:17+1К сожалению, octave намного медленнее Matlab. Вроде бы в будущих версиях обещают ускорить расчет за счет JIT.
temujin
12.10.2016 14:59Скорее всего зависит от типа вычислений. Вторая ссылка в статье, сравнения прооизводительности на сложных вычисления на стр. 23 и 25. В некоторых вычислениях
Octave
превосходитMATLAB
, за счет более рационального алгоритма.
roman_antoshchenkov
11.10.2016 12:42Octave отличная программа (пакет программ), однако проблемы с юникодом в путях к файлам и подписям к графикам (Windows).
theoretician
11.10.2016 20:00+2Долгое время был уверен во всемогуществе таких именитых программ как Matlab, Mathematica, Maple… до тех пор пока не столкнулся с более-менее серъёзными вещами. Оказалось, например, Matlab, впрочем как и другие известные пакеты, не ахти как поддерживает тензоры, и решение задач математической физики за некторыми исключениями, касающихся некоторых простых случаев, крайне затруднительно в нём, в реальности возникает необходимость писать в нём реализацию численных схем с почти нуля, что само по себе устраняет преимущество его использования как набора эффективных готовых решений. Правда, в самых последних версиях Matlab данные расчётные инструменты были дополнены, но тем не менее, впечатление о Matlab и других гигантах индустрии как о всемогущих универсальных математических пакетах на все случаи жизни было испорчено. В итоге пришлось смотреть в сторону более специфических программ таких как ANSYS, COMSOL и прочих пакетов для решения задач математической физики. Но как и прежде остановился на открытом и опенсорсном варианте в виде OpenFOAM, потому как считаю, что использование открытых программ не только имеет те преимущества, которые описаны в статье, в частности, то, что открытый код всегда можно перепроверить и тем самым обосновать результат, получаемый с помощью этого открытого ПО, но и позволяет лучше разобраться в самих применяемых математических методах. Что касается Octave, хороший пакет, не то что для серъёзных научных работ, но, как было сказано, для категории студент+ прекрасная вещь. Много его использовал, правда, некоторых нужных мне в свое время возможностей, что были в Matlab по обработке сигналов в нем не оказалось.
smxfem
12.10.2016 19:46Matlab лучше решает некоторые минимаксные задачи, чем Maple, ИМХО(проверял своими кривыми руками).
Maple хорош в аналитике, как говорит знакомый д.ф-м н., который использовал его 25+ лет (маразмом вроде бы не болеет).
А для чисто численных методов лучше вручную писать, чтобы не упереться в ограничения конкретного пакета, что в какой-то момент обязательно произойдет.John_Minority
17.10.2016 13:52Самому реализовывать тоже бывает не лучшая идея. Есть же солверы вроде AMPL.
victor1234
Чем подобные пакеты удобнее питона, с подключенными математическими библиотеками?
temujin
Думаю, одним из преимуществ является пологая кривая обучения. Но вообще-то это разные категории софта, чисто языковые среды надо сравнивать с таковыми же а не с математическими пакетами.
bos4r
В последнее время экосистема python показывает значительный рост. Для этого языка есть отличные библиотеки, например, для машинного обучения python значительно удобнее, чем MATLAB.
masai
А вот зря вас люди минусуют. На самом деле классическая связка для Python из numpy, scipy и matplotlib вполне может составить конкуренцию Octave. Эти библиотеки тоже используют для вычислений высокооптимизированные варианты BLAS/LAPACK (вроде интеловской MKL), в них названия команд совпадают с матлабовскими, что очень снижает порог вхождения. Все больше научных работ основывается на Python. Хорошо это или плохо, но отрицать, что Python становится одной из рабочих лошадок в науке, нельзя. Во многом это заслуга еще и среды разработки Jupyter. Так что во многих сферах эта связка вполне себе замена MATLAB.
beduin01
Хотелось бы отметить, что если вам нужна реальная скорость, то вам следует ознакомиться со следующей статьей и посмотреть в сторону D.
masai
А что мешает ту библиотеку вызывать из Python? Преимущество Python как раз в том, что он — хороший язык-связка.
technic93
А ещё можно взять cython и если надо критический по производительности кусок написать на си. Думаю плюс питона еще в том что есть куча готовых библиотек, на случай если вдруг будет нужно кроме математики в проекте сделать какое то дополнительное действие.
Shchvova
Куда ближе к непосредственно счислениям и нужным математическим действиям. Если есть много опыта программирования и знания пакетов, то ты уже не видишь синтаксиса питона, а только необходимые мат. выражения.
В Октаве с этого начинают. Да, финальный код вряд ли можно в продакшн пускать, но сделать прототип модели очень быстро и удобно. Меньше оберточного кода.
serg_meus
В настоящее время занимаюсь разработкой численной модели движения космических аппаратов. Сделал полный аналог пробного проекта на двух языках: на Python (с использованием библиотеки numpy), и на языке MATLAB/Octave. На Python (CPython 3) модель работает в полтора-два раза быстрее, чем в MATLAB, в среде Gnu Octave в несколько раз медленнее, чем в MATLAB, в зависимости от настроек модели. Никакой особой разницы в плане удобства использования того или иного языка или набора библиотек не вижу.