- PVSM.RU - https://www.pvsm.ru -
Как я и обещал, перехожу от обзора программ замены калькулятора [1] к более серьезным инструментам. Если помните схему из предыдущего поста, то во второй категории находились табличные: OpenOpffice / LibreOffice
сотоварищи. Эту партию мы можем смело пропустить, так как к командной строке она не относится, к тому же, среди читателей Хабра трудно найти человека, который бы в них не разбирался. Поэтому перехожу сразу к третьей категории.
Специализированные математические программы, уровень студент+
Ocatve
.Scilab
.Maxima
.R
.Sage
.На первом месте в этом списке находится Octave
, и это не случайность. Исследователи из Университета Мэриленда в США провели сравнительный анализ математических вычислений [2], используя MATLAB, Octave, SciLab
и FreeMat
в простом сценарии и в сложном. В первом случае решали систему линейных уравнений а в втором — конечно-разностную дискретизацию уравнения Пуассона в двухмерном пространстве. Основной вывод — GNU Octave справляется с задачами лучше остальных открытых математических пакетов, демонстрируя результат (страницы 23 и 25) сопоставимый с матлабовским.
Но сначала немного исторического контекста, чтобы понять, как закалялись математические программы с открытыми исходниками.
Так сложилось, что коммерческие программы прибежали и первыми застолбили поляну математических вычислений. Уже с конца 1970-х гг. создатель языка программирования Клив Моулер распространяет MATLAB [3] в университетах США, а в 1984-м вместе с двумя компаньонами переписывают его с Фортрана на Си и создают компанию The MathWorks [4]. Примечательно, что ранние версии распространялись с открытым исходным кодом.
Это было-было, а MATLAB
, каким мы его знаем сегодня — это ЯП высокого уровня с поддержкой 2D / 3D графики, разнообразными математическими функциями, интерактивной средой программирования, численных расчетов и решения задач. Внешние интерфейсы позволяют ему интегрироваться со сторонними приложениями и языками программирования. Более 1 000 000 инженеров и ученых по всему миру используют MATLAB
и платят за это солидную денежку.
С большим опозданием в игру включаются программы с открытыми исходниками. Только в 1990-х появляются математические пакеты GNU Octave, Scilab
и вступают в конкуренцию с лидером вычислительного программирования.
Задуманный изначально как программное пособие для проектирования химического реактора [5] и названный в честь профессора химии Октава Левеншпиля, преподававшего автору математического пакета, Octave
призван был заменить студентам Техасского Университета сложный в отладке Fortran
. Версия 1.0 вышла в свет 17 февраля 1994 г. Проект стабильно развивается, и в июле нынешнего года зарелизился Octave 4.0.3
. Ждем ебилдов.
Основной миссией Octave
была, и в обозримом будущем скорее всего так и останется, быть годной заменой MATLAB так же, как OpenOffice/LibreOffice замещает MS Office для тех, кто умеет считать копейку. Собственно, для этого Octave
имеет совместимый с MATLAB
синтаксис и набор функций. Более того [6], несовместимость с MATLAB
считается багом, однако софтверная Фемида уже имеет подобный прецедент, и это не считается нарушением копирайта. В этой связи, можно считать Octave
программным клоном. Правда о полной совместимости пока говорить не приходится [7], но работа в этом направлении не прекращается.
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 не найдено.
Ошибка: Выполнять нечего
Благо, есть обходной путь [8]. Нужно сперва установить пакет epel-release [9].
[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=Ab
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
. Так [10] можно изобразить Аттрактор Лоренца [11], установив дополнительный пакет 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
стоит значительно дешевле, нежели для физических лиц и коммерческих организаций. Коммерческие организации, если будет нужно, найдут денежные средства, а обычные люди пусть занимаются математикой в университетах или считают столбиком.
Конечно же, это ошибочное мнение. Научные расчеты, выполненные с использованием открытого ПО имеют дополнительный «уровень защиты», ведь при желании любой может повторить прогнать те же самые расчеты и проверить валидность результатов. Те же самые вычисления, выполненные на дорогущем ПО, частично отсекают возможность проверки результатов. Проблема на самом деле гораздо шире [12] (английский текст) и дело не только в открытых или проприетарных математических программах. Не секрет, что научные журналы как правило не требуют от авторов предоставить данные и методику, достаточные для гарантированного повтора результатов эксперимента, проверки модели. Особенно часто этим грешат экономисты и финансисты, попросту засекречивая свои данные. Проверка расчетов и выводов среди выборки из массива статей с «засекреченными» данными дала неожиданные результаты [13] (английский текст). Наука, как и софт, должна быть открытой, вот почему открытые математические пакеты имеют ценность для всего общества.
Кроме последней книги, остальные материалы, использованные в статье, можно без труда найти в интернете. Половина из приведенных выше ссылок ведут на английские страницы. Буду рад вкратце сообщить о чем идет там речь или помочь с переводом.
Автор: temujin
Источник [16]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/197911
Ссылки в тексте:
[1] обзора программ замены калькулятора: https://habrahabr.ru/post/310566/
[2] провели сравнительный анализ математических вычислений: http://userpages.umbc.edu/~gobbert/papers/SharmaGobbertTR2010.pdf
[3] MATLAB: https://ru.wikipedia.org/wiki/MATLAB
[4] The MathWorks: https://ru.wikipedia.org/wiki/The_MathWorks
[5] Задуманный изначально как программное пособие для проектирования химического реактора: https://www.gnu.org/software/octave/about.html
[6] Более того: https://en.wikipedia.org/wiki/GNU_Octave#MATLAB_compatibility
[7] не приходится: http://hg.savannah.gnu.org/hgweb/octave/file/d63878346099/scripts/help/__unimplemented__.m#l530
[8] есть обходной путь: http://wiki.octave.org/Octave_for_GNU/Linux#Red_Hat_Enterprise.2FCentOS
[9] epel-release: https://fedoraproject.org/wiki/EPEL#What_packages_and_versions_are_available_in_EPEL.3F
[10] Так: http://octave.sourceforge.net/odepkg/function/odepkg_examples_ode.html
[11] Аттрактор Лоренца: https://ru.wikipedia.org/wiki/Аттрактор_Лоренца
[12] Проблема на самом деле гораздо шире: http://johnhcochrane.blogspot.ru/2015/12/secret-data.html
[13] дала неожиданные результаты: http://www.federalreserve.gov/econresdata/feds/2015/files/2015083pap.pdf
[14] GNU Octave 4.0.1 Manual: https://www.gnu.org/software/octave/doc/v4.0.1/
[15] GNU Octave: https://www.safaribooksonline.com/library/view/gnu-octave/9781849513326/
[16] Источник: https://habrahabr.ru/post/312004/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.