Проблема с разделением вещественной и мнимой частей для fmincon (ограниченная оптимизация MATLAB). Как правильно его запрограммировать? - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь решить эту проблему оптимизации с помощью функции fmincon в MATLAB :

enter image description here

Где все H - комплексные матрицы, g и Pdes - комплексные векторы столбцов, D0 и E0 - числа.

Я ожидаю получить сложный вектор-столбец g (и в целом он должен быть сложным), поэтому я разделил задачу на две части: настоящая и imag, но она не работает, MATLAB возвращает мне сообщение:

Not enough input arguments.

Error in temp>nonlincon (line 17)
c(1) = norm ( H_d*([g(1)+1i*g(4); g(2)+1i*g(5); g(3)+1i*g(6)]) )^2 - D_0;

Error in temp (line 12)
        = fmincon(objective,x0,[],[],[],[],[],[],nonlincon);

Где я не прав?

И вообще я прав в написании данной проблемы следующим образом:?

% For example:
D_0 = 2*10^(-5)*10^(60/10);
E_0 = 50;
H_b = rand(15,3) + 1i*rand(15,3);
P_des = rand(15,1) + 1i*rand(15,1);
H_d = rand(10,3) + 1i*rand(10,3);

    objective = @(g) (norm ( H_b*([g(1)+1i*g(4); g(2)+1i*g(5); g(3)+1i*g(6)]) - P_des ))^2;                        
x0 = ones(1,3*2)';
options = optimoptions('fmincon','MaxFunctionEvaluations',10e3);
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN]...
        = fmincon(objective,x0,[],[],[],[],[],[],nonlincon);

% So I expect to get a column vector g: 1st 3 elements - Real part, next 3 - Imag

function [c,ceq] = nonlincon(g, H_d, E_0, D_0)
c(1) = (norm ( H_d*([g(1)+1i*g(4); g(2)+1i*g(5); g(3)+1i*g(6)]) ))^2 - D_0;                        
c(2) = (norm ([g(1)+1i*g(4); g(2)+1i*g(5); g(3)+1i*g(6)]))^2 - E_0;
ceq = [];
end

1 Ответ

0 голосов
/ 20 мая 2019

Вам просто нужно указать, что nonlincon является функцией переменной g только при вызове fmincon

Код следующий:

[X,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN]...
        = fmincon(objective,x0,[],[],[],[],[],[],@(g)nonlincon(g, H_d, E_0, D_0));

Раствор Х

X = [0.2982; 0.1427; 0.3597; -0.0729; -0.1187; 0.2090]
...