MATLAB Answers

optimization problem - problem using det funciton

20 views (last 30 days)
eden meirovich
eden meirovich on 19 Sep 2021
Commented: eden meirovich on 21 Sep 2021 at 6:01
Hello
i'm trying to solve an optimization problem with involve calcualte the det of a matrix (here it's the temp varible).
the temp operator work for me before with optimization varibles, but now there is a problem. i think it's involve with using a non-linear optimization varibles, such as the varible F.
the error i get:
Check for missing argument or incorrect argument data type in call to function 'det'.
Error in optimization_vector_form (line 82)
prob.Objective = det(temp);
any ideas?
Thank you
clc;
clear;
close all;
Time = 100;
dt=1;
N=Time/dt;
%% Optimization problem
prob = optimproblem('ObjectiveSense','max');
%optimization varibles
omega = optimvar('omega',N,'LowerBound',w_min,'UpperBound',w_max);
T = optimvar('T',N,'LowerBound',T_min,'UpperBound',T_max);
%% Constrains
for i=1:N-1
cons1(i) = (T(i+1)-T(i))/dt >= T_dot_min;
cons2(i) = (T(i+1)-T(i))/dt <= T_dot_max;
cons3(i) = (omega(i+1)-omega(i))/dt >= omega_dot_min;
cons4(i) = (omega(i+1)-omega(i))/dt <= omega_dot_max;
end
prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;
prob.Constraints.cons3 = cons3;
prob.Constraints.cons4 = cons4;
for i=1:N-1
A(i) = omega(i)^2;
B(i) = T(i)^2;
C(i) = omega(i)*T(i);
F(i) = omega(i)^2*T(i);
G(i) = omega(i)*T(i)^2;
H(i) = omega(i)^2*T(i)^2;
end
D = sum(omega);
E = sum(T);
temp = [A.sum F.sum D C.sum;
F.sum H.sum C.sum G.sum;
D C.sum Time E;
C.sum G.sum E B.sum];
prob.Objective = det(temp);

Accepted Answer

Alan Weiss
Alan Weiss on 20 Sep 2021 at 12:15
The main problem is that det is not a Supported Operations on Optimization Variables and Expressions. For example,
x = optimvar('x',2,2);
y = det(x)
Check for incorrect argument data type or missing argument in call to function 'det'.
You should also learn to make more efficient optimization expressions. I rewrote some of your expressions using an indexing technique that enables vectorized addition and subtraction, removing your inefficient loops.
Time = 100;
dt = 1;
N = Time/dt;
w_min = 0; % I made up constants to get this to work
w_max = 10; % Put in your own constants
T_min = 1;
T_max = 100;
T_dot_min = -10;
T_dot_max = 10;
omega_dot_min = -1;
omega_dot_max = 1;
%% Optimization problem
prob = optimproblem('ObjectiveSense','max');
%optimization varibles
omega = optimvar('omega',N,'LowerBound',w_min,'UpperBound',w_max);
T = optimvar('T',N,'LowerBound',T_min,'UpperBound',T_max);
indces = 1:(N - 1); % This is the technique
%% Constrains
% for i=1:N-1
% cons1(i) = (T(i+1)-T(i))/dt >= T_dot_min;
% cons2(i) = (T(i+1)-T(i))/dt <= T_dot_max;
% cons3(i) = (omega(i+1)-omega(i))/dt >= omega_dot_min;
% cons4(i) = (omega(i+1)-omega(i))/dt <= omega_dot_max;
% end
cons1 = (T(indces + 1) - T(indces))/dt >= T_dot_min;
cons2 = (T(indces + 1) - T(indces))/dt <= T_dot_max;
cons3 = (omega(indces + 1) - omega(indces))/dt >= omega_dot_min;
cons4 = (omega(indces + 1) - omega(indces))/dt <= omega_dot_max;
prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;
prob.Constraints.cons3 = cons3;
prob.Constraints.cons4 = cons4;
% I also use indces here
% for i=1:N-1
% A(i) = omega(i)^2;
% B(i) = T(i)^2;
% C(i) = omega(i)*T(i);
% F(i) = omega(i)^2*T(i);
% G(i) = omega(i)*T(i)^2;
% H(i) = omega(i)^2*T(i)^2;
% end
A = omega(indces).^2;
B = T(indces).^2;
C = omega(indces).*T(indces);
F = (omega(indces).^2).*T(indces);
G = omega(indces).*(T(indces).^2);
H = omega(indces).^2.*(T(indces).^2);
D = sum(omega(indces));
E = sum(T(indces));
temp = [A.sum F.sum D C.sum;
F.sum H.sum C.sum G.sum;
D C.sum Time E;
C.sum G.sum E B.sum];
To use the unsupportetd operation det, use fcn2optimexpr.
detexpr = fcn2optimexpr(@det,temp);
prob.Objective = detexpr;
Alan Weiss
MATLAB mathematical toolbox documentation

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!