GNU/Octave в Debian GNU/Linux.Источник: mydebianblog
Расчёты бывают разной сложности: проверить, сколько будет 6*6, посчитать сумму стоимости товаров в чеке, решить систему линейных уравнений для домашней работы, или, скажем, рассчитать деградацию волнового фронта при прохождении многослойной турбулентной атмосферы. Если первые два примера можно посчитать на любом калькуляторе, то линейные уравнения решают инженерные калькуляторы. Последний пример могут решить только системы численных расчётов, которые используют для научных исследований - например GNU/Octave. Вот о ней-то в этом посте и рассказывается. apt-caсhe search octave и установить самую свежую версию. Установка довольно проста: aptitude install octave3.0 qtoctave Первый пакет - собственно, система численных математических рассчётов GNU/Octave, а второй - это графическая оболочка QtOctave, о которой был отдельный пост. Для Windows сборка Octave тоже есть, и тоже бесплатная. Кроме того, под Windows есть и графический интерфейс для Octave - GUIOctave, доступный по этой ссылке. Другие графические оболочки для октавы обсуждаются тут. Всё вместе занимает около 50Мб на диске, но красота требует жертв:
Установка Octave в Windows хорошо проиллюстрирована здесь в красивых цветастых картинках. Правда, после всего этого вас встретит чёрная страшная консоль Octave:
Тем не менее, такой брутальный интерфейс стоит, чтобы его немного освоить. GNU/Octave как иллюстрированное пособие по курсу линейной алгебры Если вас учили или учат в институте старые советские преподаватели по старым советским книжкам, то GNU/Octave вам сильно поможет понять линейную алгебру, без которой инженеру абсолютно нечего делать в повседневной деятельности. Кстати, вместо старых советских учебников лучше купить \ найти на просторах Интернета замечательную книжку Linear Algebra and Its Applications за авторством Gilbert Strang. Ещё лучше вместе с книжкой посмотреть его видеолекции, чтобы сэкономить время, если требуется освежить разделы линейной алгебры. Вооружившись свежими книгами, смело идём постигать линейную алгебру до полного просветления. A=[1 2; 4 5 ] Столбцы матрицы можно набирать пробелом или запятой, разделение на строки - точка с запятой ; octave:3> A+B вычитать octave:4> A-B и умножать друг на друга, если они подходят по размерностям: octave:5> A*B Делить матрицы друг на друга, как числа, нельзя, но можно умножить матрицу на инверсную. Octave, как и MATLAB, это знают, но пользователь об этом может не догадываться: octave:> [1 2; 3 4]/[1 1; 1 1] Такая операция приводит к умножению матрицы A на (псевдо)инверсную матрицу B: octave:10> [1 2; 3 4]*pinv([1 1; 1 1]) То есть будет вычислено Least Squares решение, как намекает нам документация. Пойдём дальше и посмотрим на другие возможности Octave. Эту систему можно переписать в компактном виде А*X = В где коэффициенты являются элементами матриц: Матрица коэффициентов А и свободных членов В для этой системы:
Для Октавы это будет две команды: octave:9> A=[1 3 5; 3 1 3; 4 1 3] и octave:10> B = [22;14;15] Решать системы уравнений можно по-разному, например так: octave:11> A^(-1)*B Но это в реальных задачах всегда стараются избегать такого решения. Часто бывает так, что уравнений больше, чем неизвестных - тут нам на помощь придёт метод наименьших квадратов (Least Squares). В Октаве и Матлабе решение в смысле least squares можно записать компактно: octave:12> A\B Это на самом деле (A^T * A)^(-1)*A^T * B или, в выражениях Октавы, inv(A'*A)*A'*B Как вычислить собственные вектора и собственные значения в Octave
Это ещё один популярный сорт рыбьего жира, коим пичкают скубентов злые преподаватели высших учебных заведений, почти никогда не поясняя, зачем они (собственные вектора и значения) нужны. А они нужны, и даже очень - в обработке сигналов и изображений, для алгоритмов Face Detection и для анализа стабильности контроллеров в теории (и практике!) управления, и для много чего ещё. octave:13> A=[1 3 5; 3 1 3; 4 1 3] теперь считаем собственные вектора U и значения V вот так: octave:15> [U,V] = eig(A) Матрица выдаётся V в канонической форме, с собственными значениями по главной диагонали. Этим примером хотелось показать eigenvalue decomposition в действии: Детерминант и ранг матрицы
Эти важные свойства матриц, как правило, довольно просто посчитать вручную, но если это делать лень, можно запрячь Octave: octave:16> det(A) и ранг матрицы: octave:17> rank(A)
Matrix Reshape
Иногда удобнее всего работать с матрицей, если вытянуть её в одну строчку. Потом обычно её нужно собрать обратно, после того, как над ней сделали что-то. Для этого нам пригодится команда reshape. >> x = [1 2 3 4 5 6 ] Мы хотим сделать этот вектор-строку в виде матрицы 2х3 - легко: >> x1 = reshape(x,2,3) И обратно собрать: >> x1 = reshape(x,1,6) Разреженые (Sparce) Матрицы >> a = [1,0,0;0,2,0;0,0,3] Нулей в матрице много, а значений - всего два. Сделаем её разреженной: octave:19> a_sparse = sparse(a) Отлично. Теперь, например, мы хотим выцедить из неё главную диагональ. Для этого заведём переменную:
и воспользуемся специальной командой для разреженных матриц: >> a_diag = spdiags(a_sparse,d) Здесь d содержит номера диагоналей, которые надо вытащить: 0 - главная диагональ, 3 - третья справа от главной (выше на 3 позиции), а -2 это под главной диагональю на 2 позиции. Использование структур для хранения данных
Помимо матриц, в Octave можно хранить ещё и структуры. Структура это удобный метод хранения различных типов данных в одной "переменной". for ii=1:4 Для просмотра содержимого структуры достаточно вызвать её по имени. k = atm.n_layers Но это просто число. Так как здесь используются слои, структура получается многомерной. Например, нужно получить высоту слоя турбулентности layer_height пишем: >> whos k Что делать, как спрашивают классики? Фигурные скобки позволяют получить непосредственно значение элемента: |