Входные вектора описываются матрицей:
>> inp = [0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1;
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1;
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1;
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1]
Выходной вектор:
>> out=[0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0]
Созданим сеть прямого распространения с помощью команды:
>> network=newff([0 1;0 1; 0 1; 0 1],[6 1],{'logsig','logsig'})
В этой команде первый массив содержит диапазоны изменения сигнала для каждого входа, второй массив – размер каждого слоя (число нейронов), затем задается тип передаточной функции для каждого слоя.
До начала обучения выполняется инициализация НС:
>> network=init(network);
Зададим число эпох, скорость и запустим обучение:
>> network.trainParam.epochs = 500;
>> network.trainParam.lr = 0.05;
>> network=train(network,inp,out);
Проверим работу сети:
>> y=sim(network,inp);
>> out-y
ans =
1.0e-004 *
-0.0191 0.0044 0.0204 -0.0237 0.0039 -0.0000 -0.0316 0.0041 0.0014 -0.0367 -0.0253 0.1118 -0.0299 0.0384 0.0000 -0.0000
Ошибки между заданным выходом НС и реальным выходом можно считать пренебрежимо малыми.
Рассмотрим далее простейший закон логического управления динамическим объектом.
Пример 3.4. Требуется, чтобы нейросетевой регулятор, получающий на входе ошибку управления e, реализовывал релейный закон управления:
|
|
.
MatLab программа:
>> w=2*pi;
>> for i=1:300 % формирование обучающей выборки
time(i)=0.01*i;
e(i)=(exp(-time(i)))*sin(w*time(i));
if (e(i)>0.0) t(i)=1;
elseif (e(i)<0.0) t(i)=-1;
end
end
>> plot(time,e); grid on; hold on;
>> net = newff([min(e) max(e)],[10 1],{'tansig','purelin'});
>> net.trainParam.epochs = 1000;
>> net = train(net,e,t);
>> u=sim(net,e); plot(time,u,'+'); legend('ошибка','управление'); xlabel('t');
Работу релейного регулятора иллюстрирует рис. 3.6.
Рисунок 3.6. Нейросетевой релейный регулятор.