Содержание
MATLAB(Сокращенно от английского “Matrix laboratory”) – пакет программ, а также высокоуровневый язык программирования, используемый для решения различного рода задач(математических, инженерных, экономических, географических и др). Широко известен и распространен по всему мир. Поддерживается на большинстве современных операционных системах, таких как Linux, Mac и конечно же Windows.
История создания и развития языка MATLAB
Изначально MATLAB был разработан как язык программирования Кливом Моулером, бывшим на тот момент деканом факультета информатики в Университете Нью-Мексико, для обучения студентов пользования различными математическими библиотеками, без необходимости изучения языка Фортран. Вскоре язык распространился между другими университетами. Вскоре к проекту присоединились Стив Бангерт и инженер Джон Литтл. Вместе они переписали MATLAB с языка Фортран на язык С(тогда он носил название JACKPAC), сделали его платным и в 1984 году основали компанию The Math Works. Со временем язык очень сильно развился и стал использоваться в различных отраслях управления, экономики, инженерии и математики, и впоследствии был переименован в MATLAB.
Описание и основные принципы языка MATLAB
Как уже было сказано ранее, MATLAB также является высокоуровневым языком программирования. Язык MATLAB основан на матричных структурах данных, большое количество функций для работы с разнообразными типами информации, интегрированную среду разработки, возможности объектно-ориентированного программирования.
Программы, написанные на MATLAB, бывают двух типов — функции и скрипты. Функции имеют входные и выходные аргументы, а также собственное рабочее пространство для хранения промежуточных результатов вычислений и переменных. Скрипты же используют общее рабочее пространство. Как скрипты, так и функции не компилируются в машинный код и сохраняются в виде текстовых файлов.
Однако, отличительной особенностью языка MATLAB являются именно его широкие возможности по работе с матрицами, которые создатели языка выразили в лозунге «думай векторно»
Так же для решения различного рода прикладных задач разного вида отраслей человеческой деятельности(того же управления или архитектуры к примеру) разработано большое количество специальных наборов инструментов и функций, называемых ToolBox. Их нет в стандартном наборе пакета MATLAB, однако при необходимости их можно приобрести отдельно.
Синтаксис, операции, функции и команды языка MATLAB
Как уже было сказано ранее, MATLAB – это самостоятельный язык программирования, однако созданный на языке С. Как следствие, из С были взяты многие команды, такие как условный оператор if(использует как логические так и целочисленные переменные; можно использовать операции 'and(a, b)', синоним 'a && b' и 'or(a, b)', синоним 'a || b'.), цикл for, структуры ячеек и др. Рассмотрим конкретные примеры:
Оператор if:
if any([a>b, isempty(c), isnan(d), isinf(e)]) disp('something remarkeble happens') end
Цикл for:
x=rand(5,1); for i=1:length(x) fprintf(1,'%1.2f\n',x(i)); end
Структуры:
PP.niter = 100; PP.tolX = 10e-6; PP.display = 1; niter = PP(1).niter;
Массивы ячеек (имеют не только ту же функциональность с С, но и аналогичный синтаксис):
strarray = {'one','two', 'tree', 'next'} strarray = {'north','south';'east','west'} fprintf(1, 'Go to the %s!\n', strarray{1,1});
Поскольку отличительной особенностью MATLAB является именно работа с векторами и матрицами, то хотелось бы привести примеры базовых функций работы с ними:
ввести вектор-столбец
vec = [1; 2; 3; 4; 5]
вектор-строку
vec = [1 2 3 4 5]
и матрицу
mat = [1 2 3; ...4 5]
задать матрицы
a = 3; b = 2; mat1 = ones(a,b) mat0 = zeros(a,b) mat2 = rand(a,a) mat4 = randn(b,b) mat3 = rand(a,a,a)
задать векторы
vec = [0:0.01:1] vec = [0:100] vec = linspace(0,1,100)
соединить векторы
vec = [0:0.5:1, 2:0.4:3]
добавть элемент к вектору-столбцу
vec(end) vec(end+1) = 3
добавить элемент в вектору-строке
vec = [-1 vec]
векторизовать матрицу
vec = mat4(:)
удалить элементы
idx = find(vec < 0.05) vec(idx) = [] vec=[]
соединить матрицы
mat1 = [1:5]%%'*[%%1:5] mat2 = mat1(2:4,2:5) mat2 = mat2' mat2 = [mat1; mat1] mat2 = [mat1, mat1]
текстовая строка - это вектор
i = 2 str = %%['%%The lucky number is ', num2str(i)]
но не наоборот
str = %%''%%; % empty string str = sprintf%%('%% 1 plus%s %d',str,i)
скалярное произведение
a = [1:5]'; norm = a%%'*%%a table = a*a'
умножение матриц
A = rand(5,2) ATA = A%%'*%%A ATA1 = inv(ATA) ATA1%%'*%%ATA
поэлементные операции
b = 1+a
b = a+a
b = a.*a
b = A.*A
Порядок определения и вызова функций
Синтаксис для определения собственных функций в MatLab имеет следующий вид:
function [ RetVal1, RetVal2,… ] = FunctionName( arg1, arg2,… ) <тело функции>
где RetVal1, RetVal2,… – набор возвращаемых значений функцией (результаты работы); arg1, arg2,… – набор входных аргументов; тело функции – набор операторов (программа), которые выполняются при вызове функции.
Рассмотрим пример реализации функции для вычисления евклидового расстояния:
function length = euqlid(x1, y1, x2, y2) length = sqrt((x1-x2)^2+(y1-y2)^2);
Продемонстрируем возможность возвращения нескольких параметров на примере вычисления ширины и высоты прямоугольника, заданного координатами левого верхнего угла (x1,y1) и правого нижнего (x2,y2):
function [width, height] = RectangleHW(x1,y1,x2,y2) width = abs(x1-x2); height = abs(y1-y2);
Данную функцию можно записать еще и с таким набором параметров:
function [width, height] = RectangleHW(P1, P2) width = abs(P1(1)-P1(2)); height = abs(P2(1)-P2(2));
где P1 и P2 – векторы (массивы) размером в 2 элемента и описывают точку в двумерном пространстве. В этом случае при вызове функции, значения координат точек можно передавать таким образом:
[W, H] = RectangleHW([0 0], [10 20]);
Если же программист сделает ошибку и при вызове функции передаст неверный размер вектора, например, так
[W, H] = RectangleHW(0, [10 20]);
то выполнение функции завершится с ошибкой и выполнение всего алгоритма остановится. Чтобы избежать этой ситуации MatLab позволяет проводить проверку корректности переданных аргументов и корректно завершать работу функции без остановки работы всего алгоритма. Следующий пример записи функции демонстрирует работу такой проверки:
function [width, height] = RectangleHW(P1, P2) if length(P1) < 2 | length(P2) < 2 error( 'Bad 1st or 2nd parameter' ); end width = abs(P1(1)-P1(2)); height = abs(P2(1)-P2(2));
При выполнении данной функции с неверными параметрами, функция выдаст сообщение об ошибке в командное окно MatLab, но программа продолжит свою работу.
Предложенная проверка осуществляет контроль за корректностью переданных аргументов. Однако важной является также проверка числа переданных входных аргументов и числа возвращаемых значений функцией. Например, если вместо двух аргументов, был передан только один, то функция ошибочно завершит свою работу. Аналогично, если функция ожидает возврата трех аргументов, в то время как она определена лишь для двух, то также возникнет ошибочная ситуация.
Для проверки числа переданных аргументов и числа ожидающих возвращаемых значений используются переменные nargin и nargout. Ниже приведен пример функции, использующей проверку корректности числа входных и выходных аргументов.
function [width, height] = RectangleHW(P1, P2) if nargin ~= 2 error( 'Bad number of parameters' ); end if nargout ~= 2 error( 'Must be 2 return values' ); end if length(P1) < 2 | length(P2) < 2 error( 'Bad 1st or 2nd parameter' ); end width = abs(P1(1)-P1(2)); height = abs(P2(1)-P2(2));
При этом проверки корректности параметров функции будут срабатывать в следующих ситуациях:
[W, H] = RectangleHW([0 0]); % Bad number of parameters [W, H, V] = RectangleHW([0 0], [10 20]); % Must be 2 return % values [W, H] = RectangleHW(0, [10 20]); % Bad 1st or 2nd parameter
Графики и рисунки в MATLAB
В составе пакета MATLAB имеется большое количество функций для построения графиков, в том числе трёхмерных, визуального анализа данных и создания анимированных роликов.
Встроенная среда разработки позволяет создавать графические интерфейсы пользователя с различными элементами управления, такими как кнопки, поля ввода и другими. С помощью компонента MATLAB Compiler эти графические интерфейсы могут быть преобразованы в самостоятельные приложения, для запуска которых на других компьютерах необходима установленная библиотека MATLAB Component Runtime.
Основы работы в MatLab
MatLab, как и любая составная многомодульная программа, имеет интерфейс, образованный множеством окон-инструментариев.
Каждое окно выполняет свои выделенные ему функции. К примеру окно CurrentFolder отображает папку, в которой находится текущая среда, Command History отображает историю процедур, Workspace констатирует состояние текущих переменных в среде. Стоит отдельно сказать про окно CommandWindow. В него осуществляется ввод команд для выполнения.
Окно CommandWindow предоставляет интерфейс к возможностям MatLab для выполнения скриптовых комманд. Для того, чтобы писать полноценные программы, существует отдельная среда, называемая средой М-файлов (M-Files). С помощью этой среды можно создавать отдельные файлы-программы, которые можно редактировать и многократно запускать.
К примеру, так выглядит простейшей пример программы на MatLab:
Эта программа инициализирует переменную I единичной матрицей 3х3, переменную matrix - матрицей 3х3 с заданными числами. Переменная result - результат умножения матрицы matrix на единичную матрицу I. Чтобы запустить программу, достаточно нажатия клавиши F5. Результаты будут выведены в консоль Command Window.
Теперь можно немного поговорить о синтаксисе вводимых данных. MATLAB, являясь языком программирования высокого уровня, имеет основной набор типичных языковых конструкций - циклы, условные операторы, функции и даже обработчики ошибок. С другой стороны - MatLab позволяет реализовывать шаблоны объектно-ориентированного программирования, подключать сторонние модули на разных языках (DDE, COM, .NET) и работать с ними напрямую.
К примеру, рассмотрим следующую программу:
В этой программе вызывается метод библиотеки .NET Framework MatSharp, который вычисляет сумму вводимых чисел.
Ассортимент встроенных функций позволяет выполнять математические операции практически любого характера - сложение, умножение, транспонирование векторов и матриц, вывод и представление графиков, численные методы решения уравнений, и тд.
Пример: реализация программы построения полиномиальной линейной регресии.
Постановка задачи следующая: опираясь на значения свободной и зависимой переменной требуется восстановить между ними зависимость.
Для этого нужно построить регрессионную модель по заданной выборке.
Возьмем линейную модель $y_{i}=f(w, x_{i})+e_{i}$, где w – набор параметров.
В качестве функции параметров возьмем полином третей степени:
$$y_{i} = \sum_{i=1}^3 w_{j}x_{j}^{j-1}+e_{i}$$
Согласно методу наименьших квадратов, вектор параметров вычисляется по формуле:
$$w=(A^{T}A)^{-1}A^{T}y$$
где A – матрица значений подстановок, которая в данном случае является матрицей Вандермонда:
$$A = \left( \begin{array}{ccc} 1 & x_{1}^{1} & x_{1}^{2} & x_{1}^{3} \cr 1 & x_{2}^{1} & x_{2}^{2} & x_{2}^{3} \cr … & … & … & … \cr 1 & x_{m}^{1} & x_{m}^{2} & x_{m}^{3} \end{array} \right)$$
Вычислив параметры, можно восстановить значения зависимой переменной:
$$y^{*}=Aw$$
Ниже изложен способ практической реализации этого алгоритма на Matlab.
D = dlmread('variables.doc'); y = D( :,1); % в первом столбце значения зависимой переменной x = D( :,2); % во втором столбце - независимой % функция для построения матрицы подстановок f = inline('[x.^0, x, x.^2, x.^3]','x'); A = f(x); % матрица подстановок есть функция % значений свободной переменой w = (A'*A)\(A'*y); % решить нормальное уравнение y2 = A*w; % восстановить зависимую переменную % нарисовать график plot (x,[y y2], ‘.’);
Рассмотрим основные функции, используемые в этой программе.
Первая вызванная функция носит название dlmread. Эта функция служит для чтения матрицы из файла в формате ASCII. В MatLab есть также функции для чтения таблиц, графики и даже аудиофайлов.
Считав матрицу, нужно получить векторы первого и второго столбца. Для этого в MatLab есть специфический синтаксис. Для того, чтобы взять значения из столбца, достаточно обратится к матрице, как к обычной функции, указав в качестве первого аргумента промежуток рядов для выборки, а в качестве второго - промежуток столбцов. К примеру выражение D(2:5; 1:4) будет означать выборку из матрицы D 12 элементов, находящихся в промежутке между 2 и 5 строкой и 1 и 4 столбцом. В случае, когда вместо промежутка содержится двоеточие, функция выборки считает все значения без ограничений.
Функция inline служит для задания функций и матриц по строковым описаниям. В данном случае мы описали матрицу как матрицу Вандермонда, а затем с помощью вызова f(x) построили ее, приняв в качестве параметра вектор x.
Получив значение w по формуле наименьших квадратов, можно теперь восстановить значение y, перемножив матрицы A и w. Это значение будет использоваться при построении графика функцией plot, которая принимает в качестве аргументов один массив точек x, и массивы точек y и y2. Третий параметр функции plot говорит о том, что графиик необходимо выводить поточечно, а не в виде гладкой функции.
Получившийся график отображает восстановленную зависимость.



