- •Содержание
- •Введение
- •1. Описание панели инструментов
- •1.1. Командное окно
- •1.2. Окно редактирования и отладки
- •1.3. Окно рабочей области
- •2.1. Переменные, константы и специальные символы
- •1.4. Пути доступа к m-файлам
- •1.5. Окно справки Help Window
- •2. Переменные, операторы и функции системы matlab
- •2.2. Арифметические операторы
- •2.3. Операторы и функции отношения
- •2.4. Логические операторы
- •2.5. Элементарные функции
- •2.6. Массивы и матрицы
- •3. Графические средства системы matlab
- •3.1. Основные операторы и функции графики
- •3.2. Окно графики
- •3.3. Графика в прямоугольных координатах
- •3.4. Масштабирование осей и вывод на экран
- •3.5. Графика в полярных координатах
- •3.6. Построение столбиковых даграмм и гистограмм
- •3.7. Отображение трехмерных поверхностей
- •4. Программирование в системе matlab
- •4.1. Структура m-файла сценария и функции
- •4.2. Ввод и вывод иформации
- •4.3. Форматы вывода чисел
- •4.4. Функции nargin и nargout
- •4.5. Локальные и глобальные переменные
- •4.6. Управление последовательностью выполнения
- •4.7. Ускорение вычислений
- •4.8. Примеры программирования с использованием средств пакета Matlab
- •5. Система simulink
- •5.1. Библиотека модулей
- •5.2. Раздел Sinks (получатели сигналов)
- •5.3. Раздел Sources (источники сигналов)
- •5.4. Раздел Continuous (аналоговые блоки)
- •5.5. Раздел Discrete (дискретные блоки)
- •5.6. Раздел Function & Tables (функции и таблицы)
- •5. Логические операторы (&& | | !).
- •5.7. Раздел Math (математические блоки)
- •5.8. Раздел Nonlinear (нелинейные компоненты)
- •5.9. Раздел Signal & Systems (блоки преобразования сигналов и создания систем)
- •5.10. Применение системы Simulink в задачах моделирования динамических систем
- •Литература
4.7. Ускорение вычислений
Этот раздел описывает методы повышения быстродействия при выполнении программы и управление памятью:
векторизация циклов;
предварительное размещение векторов.
Под векторизацией понимается преобразование циклов for и while к эквивалентным векторным или матричным выражениям. При векторизации алгоритма ускоряется выполнение m-файла.
Пример 4.4. Табулирование функции. Одним из способов вычисления 1001 значение функции синуса на интервале [0 10] может быть реализован с помощью оператора цикла:
i = 0;
for t = 0:.01:10
i = i + 1;
y(i) = sin(t);
end
Второй способ: применение векторизованной формы
t = 0:.01:10;
y = sin(t);
Именно второй способ вычисления выполняются намного быстрее, и такой подход в системе Matlab является предпочтительным.
В системе Matlab есть возможность для существенного сокращения времени выполнения программы за счёт предварительного размещения массивов для выходных данных. Для этого необходимо использовать операции zeros, struct и cell. Предварительное выделение памяти позволяет избежать фрагментации памяти при работе с большими матрицами. Предварительное выделение памяти позволяет определить непрерывную область, достаточную для проведения всех вычислений.
Существует несколько подходов к повышению эффективности использования памяти, они рассмотрены ниже. В системе Matlab предусмотрено пять функций для работы с памяти:
команда clear - удаление переменных из оперативной памяти;
команда pack - запись текущих переменных на диск и последующей их загрузкой;
функция quit - по мере необходимости выход из системы Matlab с освобождением всей памяти;
команда save - сохранение переменных в файле;
команда load - считывание данных из файла.
Команды save и load работают быстрее, чем команды ввода-вывода.
4.8. Примеры программирования с использованием средств пакета Matlab
Пример 4.5. Моделирование дискретного фильтра Калмана. Фильтр Калмана используется для построения оценок процессов при косвенных измерениях с ошибками. Подробно алгоритм описан в [14].
Текст m-сценария имеет вид:
%Дискретный фильтр Калмана
A=[0 1;0.05 0.9]; % матрица динамики
S=[0 1]; % матрица канала измерений
Q=[0.1 0;0 0.325]; V=0.09; % интенсивности
P=[0.03 0;0 0.05]; %начальная дисперсия
E=eye(2); %единичная матрица
x=[5 7.5]'; % начальные условия для объекта
xx=[0 0]'; % начальные условия для оценок
T=[]; X=[]; Y=[]; %объявление переменных
i=0;
while i<=20
T=[T i]; X=[X x]; Y=[Y xx];%формирование результата
x=A*x+Q*randn(2,1); % модель объекта
y=S*x+V*randn; %модель канала наблюдений
P1=A*P*A'+Q*Q'; %дисперсия прогноза
K=P1*S'*inv(S*P1*S'+V*V); %коэффициенты передачи фильтра
P=(E-K*S)*P1;% дисперсия оценки на очередном шаге
xx=A*xx+K*(y-S*A*xx);%вычисление оценки
i=i+1;
end;
subplot(2,1,1);
plot(T,X(1,:)',T,Y(1,:)');%графики 1-ой компоненты и ее оценки
grid;
subplot(2,1,2);
plot(T,X(2,:)',T,Y(2,:)');%графики 2-ой компоненты и ее оценки
grid;
Результаты вычислений приведены на рис 4.2; из них видно, что оценки процессов начинают удерживаться вблизи истинных значений практически, начиная с 1-го и 2-го такта.
Рис. 4.1 - Результаты моделирования
Пример 4.6. Модальное управление. Смысл модального управления заключается в следующем. Необходимо для линейной динамической системы
,
(4.1)
найти
управление в виде
,
такое, чтобы матрица замкнутой динамики
имела заданные желаемые собственные
числа. Эта задача решается средствами
пакета Matlab.
Выбор матрицы
осуществляется с помощью m-функции
пакета с именем place.
Кроме того, программа вычисляет матрицу
управляемости Калмана с помощью функции
ctrb (m-файл,
реализующий эту функцию приведен в
примере 4.1).
Ранг матрицы
управляемости вычисляется с помощью
функции rank
(исходная система является управляемой,
если ранг равен размерности исходного
объекта). Решение дифференциального
уравнения замкнутой системы
(4.2)
осуществляется с помощью функции ode45, реализующей метод Рунге-Кутта численного интегрирования дифференциальных уравнений (более подробно проблема численного решения дифференциальных уравнений описана в [3]). Ниже приведен текст m-сценария:
%Модальное управление
A=[0 1; 2 3];
B=[4 3]';
c=ctrb(A,B); %вычисление матрицы управляемости
rnk=rank(c);%вычисление ее ранга
disp('Ранг=')
disp(rnk);
disp('Если ранг равен 2 то система управляема')
r=[-0.3+i -0.3-i]';%желаемые собственные числа
K=place(A,B,r); %вычисление матрицы К
Phi=A-B*K;
rr=eig(Phi); %вычисление собственных чисел матрицы Phi
disp('Собств. числа=')
disp(rr) % вектор rr должен совпасть с r
x0=[1 0.1];
interval=[0 10];%временной интервал моделирования
[T,X]=ode45('model',interval,x0,[],Phi);
subplot(1,2,1)
plot(T,X)%графики переходных процессов
grid
subplot(1,2,2)
plot(X(:,1),X(:,2)) %фазовый портрет
grid
Используемая программой ode45 m-функция model, реализующая правую часть дифференциального уравнения (4.2), имеет вид:
function f=model(t,x,flag,L);
f=L*x;
Здесь t - независимая переменная; x - зависимая переменная; flag - строковая переменная, которая имеет вид возвращаемой информации; L - дополнительный параметр (их может быть несколько, разделяются запятыми), в m-сценарии это матрица Phi.
На рис 4.3 приведены переходные процессы в системе и фазовый портрет. Так как желаемые собственные числа имели отрицательные действительные части, то видим, что замкнутая система устойчива.
Рис. 4.2 - Переходные процессы и фазовый портрет
Пример
4.7.
Оптимальное управление по квадратичному
интегральному критерию. Предполагается,
что модель объекта описывается уравнением
(4.1). Требуется найти управление
,
минимизирующее квадратичный интегральный
критерия вида:
,
где
и
- весовые матрицы. Оптимальное управление
имеет вид:
,
где
матрица
вычислятся с помощью функции пакета
Matlab
lqr.
Входные переменные этой функции являются
матрицы
,
,
и
.
Ниже приведен текст m-сценария:
%Оптимальное управление
global Phi
A=[0 1; 2 3]; B=[4 3]';
С =[1 0; 0 1]; D=1;
K=lqr(A,B,C,D)% вычисление оптимальной матрицы K
Phi=A-B*K;
eig(Phi) %вычисление собственных чисел
x0=[1 1];%начальные условия
tt=[0 3]; %временной интервал моделирования
[T,X]=ode45('fun',tt,x0);
plot(T,X)%графики переходных процессов
Используемый программой ode45 m-функция fun, реализующая правую часть дифференциального уравнения (4.2) имеет вид:
function f=fun(t,x);
global Phi
f=Phi*x;
return
Отметим, что в этом примере матрица Phi объявлена глобальной переменной. На рис 4.4 приведены переходные процессы.
Рис. 4.3 - Переходные процессы в оптимальной системе
Пример
4.8. Минимизации
без ограничений. Рассмотрим
задачу нахождения значений переменных
и
,
обеспечивающих решение задачи минимизации
функции:
.
Нахождение решения производится в соответствии со следующими этапами.
1. Составление m-файла (с именем fun), реализующего вычисление значения целевой функции:
function f=fun(x)
f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
2. Составление программы с использованием подходящей функции пакета (в данном случае - функции fminunc):
x0=[-1,1];% начальные значения
options=optimset('LargeScale','off');
[x,fval,exitflag,output] = fminunc(‘fun’,x0,options)
Выполнение программы после нескольких шагов приведет к следующему результату:
Optimization terminated successfully
Current search direction is a descent direction, and magnitude of directional derivative in search direction less than 2*options TolFun
x =
0.5 -1.0000
Значение функции в точке х возвращается через fval:
fval=1.3030e-10,
exitflag > 0.
Значение exitflag=l (exitflag > 0) дает информацию, что найдена точка минимума (возможно, локального). Выходная структура (информация о результатах оптимизации) определяется идентификатором output:
число выполненных итераций (iterations): 7;
число вычислений функции (funcCount): 40;
шаг поиска (stepsize): 1;
степень оптимальности найденного решения (firstorderopt) - норма вектора-градиента в точке найденного решения:
8.1995е-004.
С помощью выбора переменных в опциях возможно в fminunc изменить характеристики оптимизационного алгоритма, например как x = fminunc(fun,x0,options). Структура options включает в себя значения точности окончания расчета и выбор алгоритма. Структура options может быть задана с помощью функции optimset: options = optimset('LargeScale','off'); В данном примере исключается принимаемый по умолчанию алгоритм для задачи большой размерности и был использован алгоритм средней размерности. Для задач большой размерности используется функция: options = optimset('LargeScale','on')
Пример 4.9. Минимизация с ограничениями. Пусть оптимизируемая функция будет таже, что и в примере 4.9. Ограничения имеют вид:
Определим функцию ограничений confun с ограничениями в форме неравенств:
function [c,ceq]=confun(x)
%огр. в форме неравенств
c=[1.5+x(1)*x(2)-x(1)-x(2);-x(1)*x(2)-10];
ceq=[];%в виде равенств ограничений нет
Основная программа:
x0=[-1,1];%начальные значения
options=optimset('LargeScale','off');
[x,fval]=fmincon('fun',x0,[],[],[],[],[],[],'confun',options)
Если минимизация осуществляется с дополнительным диапазоном в векторной форме:
,
то основная программа изменится и будет следующей:
x0=[-1,1];%начальные значения
lb=[0,0];%нижние границы
ub=[];%верхних ограничений нет
options=optimset('LargeScale','off');
[x,fval]=fmincon('fun',x0,[],[],[],[],lb,ub,'confun',options)
В последней строке четыре знака [],[],[],[] означают, что в задаче отсутствуют линейные ограничения в векторно-матричном форме (в виде равенств и неравенств) типа (4.3) и (4.5).
Пример 4.10. Метод наименьших квадратов (МНК) для переопределенной системы
с ограничениями в векторно-матричной форме:
(4.3)
(4.4)
Пример программы для этой задачи с исходными данными имеет вид:
C=[0.951 0.762 0.615
0.231 0.45 0.79
0.61 0.185 0.922
0.48 0.82 0.738];
d=[0.578, 0.353,0.8131,0.0098]';
A=[0.203 0.272 0.747
0.198 0.199 0.445];
b=[0.5251,0.2026]';
lb=-0.1*ones(3,1);
ub=2*ones(3,1);
x=lsqlin(C,d,A,b,[],[],lb,ub)
Cимволы [] и [] в последней строке означают, что в задаче отсутствуют линейные ограничения в виде равенств вида
,
(4.5)
где
- матрица,
- вектор.
Пример 4.11. Определение минимакса. Постановка задачи формулируется следующим образом:
.
Программа для этой задачи в случае 5-ти мерной вектор-функции имеет вид:
x0=[0.1; 0.1];% начальные условия
[x, fval]=fminimax('myfun',x0)
Программа m-файла для вектор-функции цели:
function f=myfun(x)
f(1)=2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304;
f(2)=-x(1)^2-3*x(2)^2;
f(3)=x(1)+3*x(2)-18;
f(4)=-x(1)-x(2);
f(5)=x(1)+x(2)-8;
В задачах на минимакс могут учитываться как линейные так и нелинейные ограничения в виде равенств и неравенств.
Пример 4.12. Линейное программирование. Постановка задачи следующая:
(4.6)
при
дополнительных ограничениях вида (4.3)
– (4.5). В (4.6)
- вектор-столбец,
- вектор-столбец.
Конкретная программа при отсутствии линейных ограничений в виде равенств имеет вид:
f=[-5; -4; -6];
A=[1 -1 1;3 2 4;3 2 0];
b=[20; 42; 30];
lb=zeros(3,1);
ub=[];
x=linprog(f,A,b,[],[],lb,ub)
Пример 4.13. Квадратичное программирование. Постановка задачи следующая:
(4.7)
при
дополнительных ограничениях вида (4.3)
– (4.5). В (4.7)
- матрица,
- вектор-столбец,
- вектор-столбец.
Ниже приведен пример программы.
H=[1 -1; -1 2];
f=[-2; -6];
A=[1 1; -1 2; 2 1];
b=[2; 2; 3];
x=quadprog(H,f,A,b)
В этом примере присутствуют только линейные ограничения в форме неравенств.
Отметим, что задачи максимизации функций сводятся к задачам минимизации тех же функций, но с противоположным знаком.
Пример
4.14.
Оптимизация
нормы матрицы при ограничениях в виде
линейного матричного неравенства (типа
неравенства Ляпунова). Необходимо найти
матрицу
как результат решения следующей задачи:
при ограничениях:
,
где
- заданные матрицы. Пример программы
решения подобной задачи имеет вид:
Q=[-1 -2; -2 -1];
P=[1 -1; -1 -3];
M=[10 0; 0 10];
X=basiclmi(M,P,Q,'Xmin')
Пример 4.15. Оптимизация следа матрицы при ограничениях в виде квадратичного матричного неравенства (типа неравенства Риккати). Необходимо найти матрицу как результат решения следующей оптимизационной задачи:
при ограничениях:
,
где
- заданные матрицы. Пример программы
решения данной оптимизационной задачи
имеет вид:
A=[-1 -2 1; 3 2 1;1 -2 -1];
B=[ 1 0 1]’;
Q=[1 -1 0; -1 -3 -12; 0 -12 -36];
setlmis([])
X=lmivar(1,[3 1])
lmiterm([1 1 1 X],1,A,'s')
lmiterm([1 1 1 0],Q)
lmiterm([1 2 2 0],-1)
lmiterm([1 2 1 X],B',1)
LMIs=getlmis
C=mat2dec(LMIs,eye(3))
option=[1e-5,0,0,0,0]
[copt,xopt]=mincx(LMIs,C,option)
Xopt = dec2mat(LMIs,xopt,X)%фомирование результата
%в виде матрицы
Отметим, что пояснения смысла операторов, используемых в данной программе можно найти в комментариях, выполнив в командном окне команду help «имя оператора».
Пример 4.16. Построение аппроксимирующей нейронной сети (обобщенно-регрессионной). Ниже приведен пример программы с конкретными исходными данными..
in=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]%табличные значения
%аргумента
d=[0.2 3 2 5 6 7 8 5 4 3 2 1 1 2 2 ]%табличные значения
%функции
nf=newgrnn(in,d,0.4);%настройка нейронной сети
%по заданной обучающей выборке
%0.4 – допустимая ошибка
x=0:0.1:15 %входной массив
y=sim(nf,x);%опрос (моделирование) сети
plot(x,y,in,d,'*') %построение графика
На рис. 4.5 приведен график аппроксимирующей функции, построенной с помощью нейройной сети.
Рис. 4.4 - График аппроксимирующей функции
Пример 4.17. Линейная прогнозирующая нейронная сеть. Пример программы:
T=[14.0 14.7 14.7 15.1 15.2 15.3 15.8 16.0 17.2 ... %значения
20 20.2 23.1 23 22 20.9 22.1 22.2 24.1 28 27.9 ...%временного
26.2 24.5 22 20 22.2 23.3 22.6 21.4 22.8 22.2 ...%ряда
24.3 28.4 28.7 26.6 21.6 21.1 20.5 23.2 24.7 25.5];
Q=length(T);
time=1:Q;
M=max(T);
T=T./M; %масштабирование исходного временного ряда
P=zeros(5,Q);%5 - глубина памяти алгоритма прогноза
P(1,2:Q)=T(1,1:(Q-1));
P(2,3:Q)=T(1,1:(Q-2));
P(3,4:Q)=T(1,1:(Q-3));
P(4,5:Q)=T(1,1:(Q-4));
P(5,6:Q)=T(1,1:(Q-5));
net=newlind(P,T);%создание нейронной сети
%(проектирование нового линейного слоя)
a=sim(net,P);%опрос сети
e=T-a;%вычисление ошибки
subplot(2,1,1)
plot(time,M*a,time,M*T,'*')%построение графика
%прогнозируемых значений
subplot(2,1,2)
plot(time,M*e,time,0)%построение графика ошибок прогноза
На рис. 4.6 в верхнем окне приведен график значений прогноза и символом «*» обозначениы значения временного ряда, в нижнем окне приведен график ошибки прогноза
Рис. 4.5 - График значений прогноза и ошибок прогноза
Подробней вопросы построения нейронных сетей отражены в учебнике [1].
