Как заставить оптимизацию черного ящика работать с временными выборками - PullRequest
0 голосов
/ 16 октября 2019

Я получил оптимизацию черного ящика, которую я хочу изменить так, чтобы она могла работать с временными выборками. Теперь я имею в виду оптимизацию черного ящика, которая, например, запускает мою основную систему управления 30 раз (количество итераций оптимизатора черного ящика)Я хочу поместить этот черный ящик и его функцию (@theproblem) в мой основной код и заставить его работать с выборками времени. Я имею в виду, что каждый раз, когда sample дает вывод для fminsearch, он находит минимум вывода. здесь выводом является норма L2, определяемая как «f». как я могу это сделать?

clc;
clear;
close all;
%% Find LQ tunng to achive desired response
nx = 2;
nu = 2;
Q0 = eye(nx);
q0 = Q0(find(triu(ones(nx))));
R0 = eye(nu);
r0 = R0(find(triu(ones(nu))));
x0 = [q0;r0];
options = optimset('Display','iter-detailed','MaxIter',80);
[x,fval,exitflag,output] = fminsearch(@theproblem,x0,options);
function f = theproblem(x)
nx = 2;
nu = 2;
q = x(1:nx*(nx+1)/2);
r = x(nx*(nx+1)/2+1:end);
pattern = find(triu(ones(nx)));
Q(pattern) = q;
Q = reshape(Q,nx,nx);
Q = Q+Q'-diag(diag(Q));
pattern = find(triu(ones(nu)));
R(pattern) = r;
R = reshape(R,nu,nu);
R = R+R'-diag(diag(R));
% parameterizing roots of weight to ensure the objects always are psd
% to avoid problems in LQR, hence Q is really a root factor of the weight
f = computegoodness(Q'*Q,R'*R);
% Does not work well as solver makes too long steps into negative definite
%f = computegoodness(Q,R);
end
function f = computegoodness(Q,R)
% Create LQ controller with this Q and R
A = [1 2;4 5];
B = [1 0;0 1];
C = [1 0;0 1];
L = lqr(A,B,Q,R);
L0 = pinv(-C*inv(A-B*L)*B);
Gc = ss(A-B*L,B*L0,C,0);
y = step(Gc,0:0.01:10);
clf
subplot(2,2,1);plot(y(:,1,1),'linewidth',2);hold on
subplot(2,2,2);plot(y(:,2,1),'linewidth',2);hold on;
subplot(2,2,3);plot(y(:,1,2),'linewidth',2);hold on;
subplot(2,2,4);plot(y(:,2,2),'linewidth',2);hold on;
% Dream step response
Gdream = ss(-.5*eye(2),.5*eye(2),eye(2),zeros(2));
ydream =  step(Gdream,0:0.01:10);
subplot(2,2,1);plot(ydream(:,1,1),'--','linewidth',2);hold on
subplot(2,2,2);plot(ydream(:,2,1),'--','linewidth',2);hold on;
subplot(2,2,3);plot(ydream(:,1,2),'--','linewidth',2);hold on;
subplot(2,2,4);plot(ydream(:,2,2),'--','linewidth',2);hold on;
drawnow
f = norm((y(:)-ydream(:)))^2;
end
...