📄 opttrain.m
字号:
x0 = x(length(time),:)';
eval(['y = ' model_out '(x0);']);
elseif strcmp(simul,'nnet')
y = yhat;
end
%>>>>>>>>>>>>>>>>>>>>>>> CALCULATE PREDICTION ERROR <<<<<<<<<<<<<<<<<<<<<<<
ey = ym(i) - y;
%>>>>>>>>>>>> COMPUTE DERIVATIVE OF PREDICTED OUTPUT W.R.T. CONTROL <<<<<<<<<<<<
if iter >first, % wait a few samples before updating
% Matrix containing the partial derivative of the output w.r.t
% each of the outputs from the hidden units
if H_outputf,
d21 = (1-yhat*yhat)*W2f(1:hiddenf);
end
% Matrix containing partial derivatives of the output from each hidden unit
% w.r.t the most recent control input:
d10(H_hiddenf) = (1-y1f(H_hiddenf).*y1f(H_hiddenf)).*W1f(H_hiddenf,na+1);
% Partial derivative of output w.r.t the most recent control input
d20 = d21(1:hiddenf)*d10;
%>>>>>>>>>>>>>> COMPUTE DERIVATIVE OF CONTROL W.R.T. EACH WEIGHT <<<<<<<<<<<<<<
% ========== Elements corresponding to the linear output units ============
if L_outputc'
% -- The part of PSI corresponding to hidden-to-output layer weights --
index1 = 1;
PSI(index1:index1+hiddenc) = y1c;
% ---------------------------------------------------------------------
% -- The part of PSI corresponding to input-to-hidden layer weights ---
for j = L_hiddenc',
PSI(index(j):index(j)+inputs) = W2c(j)*phic;
end
for j = H_hiddenc',
PSI(index(j):index(j)+inputs) = W2c(j)*(1-y1c(j)*y1c(j))*phic;
end
% ---------------------------------------------------------------------
% ============ Elements corresponding to the tanh output units =============
elseif H_outputc',
% -- The part of PSI corresponding to hidden-to-output layer weights --
index1 = 1;
PSI(index1:index1+hiddenc,i) = y1c * (1 - u*u);
% ---------------------------------------------------------------------
% -- The part of PSI corresponding to input-to-hidden layer weights ---
for j = L_hiddenc',
PSI(index(j):index(j)+inputs) = W2c(j)*(1-u*u) * phic;
end
for j = H_hiddenc',
PSI(index(j):index(j)+inputs) = W2c(j)*(1-y1c(j)*y1c(j))*(1-u*u) * phic;
end
% ---------------------------------------------------------------------
end
%>>>>>>>>>>> COMPUTE DERIVATIVE OF PREDICTED OUTPUT W.R.T. WEIGHT <<<<<<<<<<<
PSI_red = PSI*d20;
%>>>>>>>>>>>>>>>>>>>>>>>>>>> UPDATE THE WEIGHTS <<<<<<<<<<<<<<<<<<<<<<<<<
% ---------- Forgetting factor method ----------
if mflag==1,
% -- Update P matrix --
P = (P - P*PSI_red/(lambda + PSI_red'*P*PSI_red)*PSI_red'*P ) / lambda;
% -- Update Parameters --
theta = theta + P*PSI*(d20*ey - rho*u_old(1));
% ---------- Constant trace method ----------
elseif mflag == 2,
% -- Correction factor --
K = P*PSI_red /(lambda + PSI_red'*P*PSI_red);
% -- Measurement update of P matrix --
Pbar = (P - P*PSI_red/(1 + PSI_red'*P*PSI_red)*PSI_red'*P )/lambda;
% -- Update Parameters --
theta = theta + K*ey- Pbar*PSI*(rho*u_old(1));
% -- Time update of P matrix --
P = ((alpha_max-alpha_min)/trace(Pbar))*Pbar;
P(index3) = P(index3)+alpha_min;
% ---------- EFRA method ----------
else
% -- Correction factor --
K = P*PSI_red * (alpha/(1 + PSI_red'*P*PSI_red));
% -- Update Parameters --
theta = theta + K*ey - P*PSI*(rho*u_old(1));
% -- Update P --
P = P/lambda - K*PSI_red'*P + betaI-delta*P*P;
end
SSE = SSE + ey*ey; % Update performance index (SSE)
J = J + 0.5*(ey*ey + rho*u_old(1)*u_old(1));
% -- Put parameters back into weight matrices --
W1c = reshape(theta(parameters2+1:parameters),inputs+1,hiddenc)';
W2c = reshape(theta(1:parameters2),hiddenc+1,1)';
end
%>>>>>>>>>>>>>>>>>>>>>>> DETERMINE CONTROL SIGNAL <<<<<<<<<<<<<<<<<<<<<<<<
% Control using the detuned inverse model
phic= [ym(i+1);y;y_old(1:na-1);u_old(1:nb-1);1];
h1c = W1c*phic;
y1c(H_hiddenc) = pmntanh(h1c(H_hiddenc));
y1c(L_hiddenc) = h1c(L_hiddenc);
h2c = W2c*y1c;
u(H_outputc) = pmntanh(h2c(H_outputc));
u(L_outputc) = h2c(L_outputc);
%>>>>>>>>>>>>>>>>>> COPY DATA INTO THE DATA VECTORS <<<<<<<<<<<<<<<<<
u_data(i) = u;
y_data(i) = y;
yhat_data(i) = yhat;
%>>>>>>>>>>>>>>>>>>>>>>>> TIME OPDATES <<<<<<<<<<<<<<<<<<<<<<<<<
y_old = shift(y_old,y);
u_old = shift(u_old,u);
%>>>>>>>>>>>>>>>>>>>> PRINT %-AGE OF EPOCH COMPLETED <<<<<<<<<<<<<<<<<<
progress(fighandle,floor(100*i/samples));
%>>>>>>>>>>>>>>>>>>>>>>>>>>> DRAW PLOTS <<<<<<<<<<<<<<<<<<<<<<<<<<<<
if i==samples,
epochs = epochs+1;
figure(gcf)
% Plot A
if(exist('plot_a')==1),
if epochs==1,
[a_plots,dummy]=size(plot_a); % # of plots in plot A
plmata = zeros(samples,a_plots); % Collect vectors in plmat
end
for nn = 1:a_plots,
plmata(:,nn) = eval(plot_a(nn,:));
end
subplot(2,1,1);
plot([0:samples-1],plmata); % Plot plmat
xlabel('Samples');
set(gca,'Xlim',[0 samples-1]); % Set x-axis
title(['Specialized Training (J = ' num2str(J) ...
', epoch = ' num2str(epochs) ')']);
grid on
end
% Plot B
if(exist('plot_b')==1),
if epochs==1,
[b_plots,dummy]=size(plot_b); % # of plots in plot B
plmatb = zeros(samples,b_plots); % Collect the vectors in plmat
end
for nn = 1:b_plots,
plmatb(:,nn) = eval(plot_b(nn,:));
end
subplot(2,1,2);
plot([0:samples-1],plmatb); % Plot plmat
xlabel('Samples');
set(gca,'Xlim',[0 samples-1]); % Set x-axis
grid on
end
figure(gcf); drawnow
i = 0;
SSE = 0;
J = 0;
if iter<maxiter, fighandle=progress; end
end
end
%----------------------------------------------------------------------------------
%---------------- >>> END OF MAIN LOOP <<< -----------------
%----------------------------------------------------------------------------------
subplot(111)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -