Код нужно оформлять как код Матлаба. Неправильное использование заголовков. Машинный или дословный перевод. Для формул нужно использовать TeX.


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 говорит о том, что графиик необходимо выводить поточечно, а не в виде гладкой функции.

Получившийся график отображает восстановленную зависимость.

Печать/экспорт