MATLAB

MATLAB (сокращение от , в русском языке произносится как Матла́б) — пакет прикладных программ для решения задач технических вычислений. Пакет используют более миллиона инженерных и научных работников, он работает на большинстве современных операционных систем, включая Linux, macOS, Solaris (начиная с версии R2010b поддержка Solaris прекращена) и Windows.

История 
MATLAB как язык программирования был разработан Кливом Моулером () в конце 1970-х годов, когда он был деканом факультета компьютерных наук в Университете Нью-Мексико. Целью разработки служила задача дать студентам факультета возможность использования программных библиотек Linpack и EISPACK без необходимости изучения Фортрана. Вскоре новый язык распространился среди других университетов и был с большим интересом встречен учёными, работающими в области прикладной математики. До сих пор в Интернете можно найти версию 1982 года, написанную на Фортране, распространяемую с открытым исходным кодом. Инженер Джон Литтл () познакомился с этим языком во время визита Клива Моулера в Стэнфордский университет в 1983 году. Поняв, что новый язык обладает большим коммерческим потенциалом, он объединился с Кливом Моулером и Стивом Бангертом (). Совместными усилиями они переписали MATLAB на C и основали в 1984 компанию The MathWorks для дальнейшего развития. Эти переписанные на С библиотеки долгое время были известны под именем JACKPAC. Первоначально MATLAB предназначался для проектирования систем управления (основная специальность Джона Литтла), но быстро завоевал популярность во многих других научных и инженерных областях. Он также широко использовался и в образовании, в частности, для преподавания линейной алгебры и численных методов.

Язык MATLAB

Описание языка 
Язык MATLAB является высокоуровневым интерпретируемым языком программирования, включающим основанные на матрицах структуры данных, широкий спектр функций, интегрированную среду разработки, объектно-ориентированные возможности и интерфейсы к программам, написанным на других языках программирования.

Программы, написанные на MATLAB, бывают двух типов — функции и скрипты. Функции имеют входные и выходные аргументы, а также собственное рабочее пространство для хранения промежуточных результатов вычислений и переменных. Скрипты же используют общее рабочее пространство. Как скрипты, так и функции сохраняются в виде текстовых файлов и компилируются в машинный код динамически. Существует также возможность сохранять так называемые pre-parsed программы — функции и скрипты, обработанные в вид, удобный для машинного исполнения. В общем случае такие программы выполняются быстрее обычных, особенно если функция содержит команды построения графиков.

Основной особенностью языка MATLAB являются его широкие возможности по работе с матрицами, которые создатели языка выразили в лозунге «думай векторно» ().

Векторы и матрицы 
Пример кода, являющегося частью функции magic.m, генерирующего магический квадрат M для нечётных значений размера стороны n:
[J,I] = meshgrid(1:n);
A = mod(I+J-(n+3)/2,n);
B = mod(I+2*J-2,n);
M = n*A + B + 1;
Пример кода, загружающего одномерный массив A значениями массива B в обратном порядке (только если вектор A определён, и число его элементов совпадает с числом элементов вектора B):
A(1:end) = B(end:-1:1);

Графики 
Программа MATLAB может создавать трехмерную графику с помощью функций surf, plot3 или mesh.

Деление графического окна осуществляется командой subplot (количество строк, количество столбцов, текущий элемент) (представим что как бы матрицу создаем). Построение Полиномиальной регрессии для табличных данных возможно через команду Tools > Basic Fitting графического окна вывода.

Вычисление площади ограниченной линиями 
Вычисление площади ограниченной двумя линиями возможно с помощью команды quad (площадь определенного интеграла, код см. ниже). Аргументами quad являются точки пересечения линий (находятся с помощью команды fzero(первый аргумент разница между функциями, второй аргумент отрезок или точка где разница между фунуциями равна нулю).
clear all
clc
close all
f=@(x) 0.5*x.^2+sin(5*x)-5*x+1
g=@(x) sqrt(x.^2+5.5)
X=-2:0.01:14;
subplot(2,1,1)
plot(X,f(X),'m','LineWidth',2)
hold on
plot(X,g(X),'g','LineWidth',2)
grid
xlabel('x')
ylabel('f,g')
legend('f','g','Location','best')
F=@(x) g(x)-f(x)
subplot(2,1,2)
plot(X,F(X),'b','LineWidth',2)
hold on
plot([-2 14],[0 0],'k','LineWidth',2)
grid
xlabel('x')
ylabel('f,g')
x1=fzero(F,0)
x2=fzero(F,[10,14])
S=quad(F,x1,x2)

Перенос строки в командном окне
В случае длинных формул, когда выражение не влезает в строку в программе предусмотрена функция переноса в командном окне осуществляется тремя точками "...". Точки становятся синего цвета, курсор на следующей строке мигает но нет знака двойного неравенства >> (знак начала командной строки). Например, 
t=sqrt(abs(sin(1.3*pi)/cos(4.6)*tan(0.7*pi)/acot(0.3)))-...
(exp(-0.2)*log(3.8)^1.2)^(1/3)

равносильно 
 t=sqrt(abs(sin(1.3*pi)/cos(4.6)*tan(0.7*pi)/acot(0.3)))-(exp(-0.2)*log(3.8)^1.2)^(1/3)

Оформление графиков 
Функция plot() позволяет менять цвет и тип отображаемой линии, в т. ч. логарифмической шкале. Для этого, используются дополнительные параметры, которые записываются следующим образом: plot(<x>, <y>, <’цвет линии, тип линии, маркер точек’>); Например,
plot(X,Y,'r--','LineWidth',2, 'Marker','o','MarkerFaceColor','k')
построит график красного цвета (r), штрихпунктирный(--), с толщиной линии 2 ('LineWidth',2), с маркером в виде круга ('Marker','o'), закрашенного в черный цвет ('MarkerFaceColor','k').

grid

xlabel('x')

ylabel('y')

title('Lomanaya liniya')
grid создает сетку, xlabel('x') и ylabel('y') подписывает оси координат, title('Lomanaya linia') дает заголовок графику.

Ввод векторов (соответственно потом и матриц (массивов))
В квадратных скобках перечисляем элементы вектора через пробел (можно разделять запятой) и элементы выложатся в строчку. Например, 
X=[2 3 4 3 5 1]Если потребуется выложить элементы в столбец то элементы нужно разделять точкой с запятой ";" (в принципе всегда можно применить процедуру транспонирования).

Очень часто нужно задать вектор, элементы которого отличаются на одинаковую величину - шаг. Особенно это актуально когда строим графики функций (область построения этой функции разделяем точками с каким-то шагом). Для этой задачи используется символ индексации двоеточие ":". Например, от 0 до 10 для шага 2:
Y=[0:2:10]
(если шаг равен 1 то его не пишем, единицу MATLAB поставит по умолчанию).
Вектор может быть аргументом функции, например 
 F=sin(Y)

Самый сложный момент для понимания и восприятия программы 
Есть такие вещи, которые в математике определенной операцией не описаны. Например работа поэлементно с элементами массива. В математике мы можем поэлементно работать с элементами массива, но нет определенного обозначения для этого. В Matlabe есть. В случае, если нужно применить действие к каждому элементу массива то нужно ставить точку ".". Например, есть вектор F F=[0 3 4 3 5 1] мы спокойно его можем поделить на два:
F/2
Далее получим (каждый элемент вектора будет поделен на 2):
 0    1.5000    2.0000    1.5000    2.5000    0.5000

Однако, если написать 2/F Matlab выдаст ошибку:
Error using  / 
Matrix dimensions must agree.
Как только в голове возникает мысль, что действие нужно применить к каждому элементу вектора в Matlabe на это нужно указать проставлением точки перед действием: 
2./F. Далее получим:
Inf    0.6667    0.5000    0.6667    0.4000    2.0000.
Inf обозначает что было произведено деление на ноль.

Задание функций 
В случае если есть два графика функции и нужно определить их пересечение, далее посчитать площадь которая ограничивается в результате пересечения. В Matlabe пользовательскую функцию можно создать добавлением знака "@" (в круглых скобках пишем то, от чего эта функция зависит):
f=@(x)0.5*x^2+sin(5*x)-5*x+1 что соотвтетствует функции . Точка стоит только перед степенью (.^), это говорит о том, что функция будет вектором. Перед суммой, разностью точки не ставятся так как векторы складывать, вычитать можно по обычным правилам.

MATLAB выведет:
f =

function_handle with value:

@(x)0.5*x.^2+sin(5*x)-5*x+1
function_handle говорит о том что функция ручной работы, пользовательская.

Пример кода для вывода диапазона построения от -2 до 12 с шагом 0.01 (можно вводить как 0.01 так и .01):
X=-2:.01:12;
Точка с запятой ";"в конце команды обозначает, что результат не будет выведен на экран.
Для вывода функций вместе в одном окне можно использовать команду hold on:
plot(X,f(X))
hold on
plot(X,g(X))
grid
legend('f','g','Location','best')

legend('f','g','Location','best') говорит о том что подписи функций на совместном графике будут расположены в наиболее свободном месте.

Применение

Математика и вычисления 
MATLAB предоставляет пользователю большое количество (несколько сотен) функций для анализа данных, покрывающие практически все области математики, в частности:

 Матрицы и линейная алгебра — алгебра матриц, линейные уравнения, собственные значения и векторы, сингулярности, факторизация матриц и другие.
 Многочлены и интерполяция — корни многочленов, операции над многочленами и их дифференцирование, интерполяция и экстраполяция кривых и другие.
 Математическая статистика и анализ данных — статистические функции, статистическая регрессия, цифровая фильтрация, быстрое преобразование Фурье и другие.
 Обработка данных — набор специальных функций, включая построение графиков, оптимизацию, поиск нулей, численное интегрирование (в квадратурах) и другие.
 Дифференциальные уравнения — решение дифференциальных и дифференциально-алгебраических уравнений, дифференциальных уравнений с запаздыванием, уравнений с ограничениями, уравнений в частных производных и другие.
 Разреженные матрицы — специальный класс данных пакета MATLAB, использующийся в специализированных приложениях (функция появилась в 1992 году).
 Целочисленная арифметика — выполнение операций целочисленной арифметики в среде MATLAB.

Разработка алгоритмов 
MATLAB предоставляет удобные средства для разработки алгоритмов, включая высокоуровневые с использованием концепций объектно-ориентированного программирования. В нём имеются все необходимые средства интегрированной среды разработки, включая отладчик и профайлер. Функции для работы с целыми типами данных облегчают создание алгоритмов для микроконтроллеров и других приложений, где это необходимо.

Визуализация данных 
В составе пакета MATLAB имеется большое количество функций для построения графиков, в том числе трёхмерных, визуального анализа данных и создания анимированных роликов.

Встроенная среда разработки позволяет создавать графические интерфейсы пользователя с различными элементами управления, такими как кнопки, поля ввода и другими.

Независимые приложения 
Программы MATLAB, как консольные, так и с графическим интерфейсом пользователя, могут быть собраны с помощью модуля MATLAB Compiler в независимые от MATLAB исполняемые приложения или динамические библиотеки, для запуска которых на других компьютерах, однако, требуется установка свободно распространяемой среды MATLAB Runtime (ранее называлась MATLAB Compiler Runtime MCR).

Внешние интерфейсы 
Пакет MATLAB включает различные интерфейсы для получения доступа к внешним подпрограммам, написанным на других языках программирования, данным, клиентам и серверам, общающимся через технологии Component Object Model или Dynamic Data Exchange, а также периферийным устройствам, которые взаимодействуют напрямую с MATLAB. Многие из этих возможностей известны под названием MATLAB API.

COM 
Пакет MATLAB предоставляет доступ к функциям, позволяющим создавать, манипулировать и удалять COM-объекты (как клиенты, так и серверы). Поддерживается также технология ActiveX. Все COM-объекты принадлежат к специальному COM-классу пакета MATLAB. Все программы, имеющие функции контроллера автоматизации (), могут иметь доступ к MATLAB как к серверу автоматизации ().

.NET 
Пакет MATLAB в Microsoft Windows предоставляет доступ к программной платформе .NET Framework. Имеется возможность загружать .NET сборки (Assemblies) и работать с объектами .NET классов из среды MATLAB. В версии MATLAB 7.11 (R2010b) поддерживается .NET Framework версий 2.0, 3.0, 3.5 и 4.0.

DDE 
Пакет MATLAB содержит функции, которые позволяют ему получать доступ к другим приложениям среды Windows, равно как и этим приложениям получать доступ к данным MATLAB, посредством технологии динамического обмена данными (DDE). Каждое приложение, которое может быть DDE-сервером, имеет своё уникальное идентификационное имя. Для MATLAB это имя — Matlab.

Веб-сервисы 
В MATLAB существует возможность использовать веб-сервисы. Специальная функция создаёт класс, содержащий методы API веб-сервиса, что позволяет обращаться к веб сервису, через вызовы методов класса.

MATLAB взаимодействует с клиентом веб-сервиса с помощью получения от него данных, их обработки и отправки результата. Поддерживаются следующие технологии: Simple Object Access Protocol (SOAP) и Web Services Description Language (WSDL).

Последовательный порт 
Интерфейс для последовательного порта пакета MATLAB обеспечивает прямой доступ к периферийным устройствам, таким как модемы, принтеры и научное оборудование, подключающееся к компьютеру через последовательный порт (COM-порт). Интерфейс работает путём создания объекта специального класса для последовательного порта. Имеющиеся методы этого класса позволяют считывать и записывать данные в последовательный порт, использовать события и обработчики событий, а также записывать информацию на диск компьютера в режиме реального времени. Это бывает необходимо при проведении экспериментов, симуляции систем реального времени и для других приложений.

MEX-файлы 
Пакет MATLAB включает интерфейс взаимодействия с внешними приложениями, написанными на языках C и Фортран. Осуществляется это взаимодействие через MEX-файлы. Существует возможность вызова подпрограмм, написанных на C или Фортране из MATLAB, как будто это встроенные функции пакета. MEX-файлы представляют собой динамически подключаемые библиотеки, которые могут быть загружены и исполнены интерпретатором, встроенным в MATLAB. MEX-процедуры имеют также возможность вызывать встроенные команды MATLAB.

DLL 
Интерфейс MATLAB, относящийся к общим DLL, позволяет вызывать функции, находящиеся в обычных динамически подключаемых библиотеках, прямо из MATLAB. Эти функции должны иметь C-интерфейс.

Кроме того, в MATLAB имеется возможность получить доступ к его встроенным функциям через C-интерфейс, что позволяет использовать функции пакета во внешних приложениях, написанных на C. Эта технология в MATLAB называется C Engine.

Наборы инструментов 
Для MATLAB имеется возможность создавать специальные наборы инструментов (), расширяющие его функциональность. Наборы инструментов представляют собой коллекции функций и объектов, написанных на языке MATLAB для решения определённого класса задач. Компания Mathworks поставляет наборы инструментов, которые используются во многих областях, включая следующие:

 Цифровая обработка сигналов, изображений и данных: Signal Processing Toolbox (появился в 1987 году), DSP System Toolbox, Image Processing Toolbox (появился в 1993 году), Wavelet Toolbox, Communications System Toolbox — наборы функций и объектов, позволяющих решать широкий спектр задач обработки сигналов, изображений, проектирования цифровых фильтров и систем связи.
 Системы управления: Control Systems Toolbox, Robust Control Toolbox, System Identification Toolbox, Model Predictive Control Toolbox, Model-Based Calibration Toolbox — наборы функций и объектов, облегчающих анализ и синтез динамических систем, проектирование, моделирование и идентификацию систем управления, включая современные алгоритмы управления, такие как робастное управление, H∞-управление, ЛМН-синтез, µ-синтез и другие.
 Финансовый анализ: Econometrics Toolbox, Financial Instruments Toolbox, Financial Toolbox, Datafeed Toolbox, Trading Toolbox — наборы функций и объектов, позволяющие быстро и эффективно собирать, обрабатывать и передавать различную финансовую информацию.
 Анализ и синтез географических карт, включая трёхмерные: Mapping Toolbox.
 Сбор и анализ экспериментальных данных: Data Acquisition Toolbox, Image Acquisition Toolbox, Instrument Control Toolbox, OPC Toolbox — наборы функций и объектов, позволяющих сохранять и обрабатывать данные, полученные в ходе экспериментов, в том числе в реальном времени. Поддерживается широкий спектр научного и инженерного измерительного оборудования.
 Визуализация и представление данных: Virtual Reality Toolbox — позволяет создавать интерактивные миры и визуализировать научную информацию с помощью технологий виртуальной реальности и языка VRML.
 Средства разработки: MATLAB Builder for COM, MATLAB Builder for Excel, MATLAB Builder for NET, MATLAB Compiler, HDL Coder — инструменты, позволяющие создавать независимые приложения из среды MATLAB.
 Взаимодействие с внешними программными продуктами: MATLAB Report Generator, Excel Link, Database Toolbox, MATLAB Web Server, Link for ModelSim — наборы функций, позволяющие сохранять данные различных видов таким образом, чтобы другие программы могли с ними работать.
 Базы данных: Database Toolbox — инструменты работы с базами данных.
 Научные и математические пакеты: Bioinformatics Toolbox, Curve Fitting Toolbox, Fixed-Point Toolbox, Optimization Toolbox, Global Optimization Toolbox, Partial Differential Equation Toolbox, Statistics And Machine Learning Toolbox, RF Toolbox — наборы специализированных математических функций и объектов, позволяющие решать широкий спектр научных и инженерных задач, включая разработку генетических алгоритмов, решения задач в частных производных, целочисленные проблемы, оптимизацию систем и другие.
 Нейронные сети: Neural Network Toolbox — инструменты для синтеза и анализа нейронных сетей.
 Нечёткая логика: Fuzzy Logic Toolbox — инструменты для построения и анализа нечётких множеств.
 Символьные вычисления: Symbolic Math Toolbox (появился в 1993 году) — инструменты для символьных вычислений с возможностью взаимодействия с символьным процессором программы Maple.

Помимо вышеперечисленных, существуют тысячи других наборов инструментов для MATLAB, написанных другими компаниями и энтузиастами.

Альтернативные пакеты 
Существует большое количество программных пакетов для решения задач численного анализа. Многие из таких пакетов являются свободным программным обеспечением.

Совместимые с MATLAB на уровне языка программирования 
 GNU Octave
 Scilab
 FreeMat

Близкие по функциональности 
 Julia
 R, S и SPlus.
 APL и его потомки: например J
 Python, при использовании пакета программ Python(x,y), а также с такими библиотеками как NumPy, SciPy и matplotlib реализует сходные возможности. Также, среда Enthought Canopy.
 IDL (, интерактивный язык описания данных), когда-то был коммерческим конкурентом MATLAB, сейчас остаётся серьёзным конкурентом во многих прикладных областях, хотя его доля на рынке программных продуктов для численного анализа резко упала.
 Fortress, язык программирования, созданный Sun Microsystems, является наследником Фортрана, но с ним не совместим.
 При необходимости разработки больших проектов для численного анализа возможно использование языков программирования общего назначения, поддерживающих статическую типизацию и модульную структуру. Примерами могут служить Modula-3, Haskell, Ада, Java. При этом рекомендуется использовать известные в научно-инженерной среде специализированные библиотеки (см. ссылки).

Примечания

Литература

Ссылки 

 MathWorks — ПО для матвычислений и имитационного моделирования
 MATLAB на сайте разработчика The MathWorks
 MATLAB Central -сообщество пользователей MATLAB
 Русскоязычные книги на сайте разработчика системы MATLAB
 Категория MATLAB на Open Directory Project
 Сообщество пользователей Matlab и Simulink на сайте Exponenta.Ru
 GNU Scientific Library (GSL) — GNU научная библиотека
 
 Библиотека линейной алгебры LAPACK
 Библиотека быстрого преобразования Фурье FFTW
 Библиотека визуализации PLPlot
 Русскоязычный консультационный центр компании MATLAB
 Блог, посвящённый недокументированным возможностям MATLAB

Программы математического моделирования
Программное обеспечение для macOS
Программное обеспечение для Solaris
Программное обеспечение для Windows
Программное обеспечение для Linux
Программное обеспечение, написанное на Си
Предметно-ориентированные языки программирования
Системы компьютерной алгебры
Проприетарное кроссплатформенное программное обеспечение
Численные методы линейной алгебры