Вища математика командного рядка — GNU Octave

Як я і обіцяв, переходжу від огляду програм заміни калькулятора до більш серйозних інструментів. Якщо пам'ятаєте схему з попереднього поста, то у другій категорії перебували табличні:
OpenOpffice / LibreOffice
співтовариші. Цю партію ми можемо сміливо пропустити, так як до командного рядку вона не відноситься, до того ж, серед читачів Хабра важко знайти людину, яка б у них не розбирався. Тому переходжу відразу до третьої категорії.
Спеціалізовані математичні програми, рівень студент+
  1. GNU
    Ocatve
    .
  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 Підпрограм (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 © 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 'гарантія'.

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.41421 i
-1.00000 - 1.41421 i
-2.00000 + 0.00000 i

Функції та змінні
Octave
змінні і функції створювати набагато простіше, ніж, приміром, в Java або C. На прикладі матриць, ми вже бачили, як оголошувати змінні. Створення нової функції має наступний синтаксис
function [res1, res2, ..., resM] = имя_функции (arg1, arg2, ..., argN)
тіло функції
endfunction

Як правило, нову функцію створюють або в окремому файлі, або в скрипт-файл Octave
до першого її виклику. Якщо передбачається використати власну функцію в різних скрипт-файл, то, звичайно, переважно створити її в окремому файлі. У GNU Octave файли з функціями мають розширення .m і завантажуються автоматично. Ім'я файлу повинно суворо збігатися з ім'ям функції.
Напишемо функцію для вирішення квадратичного рівняння
ax2 + 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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.