Оптимизация fmincon с определенной функцией Matlab - PullRequest
0 голосов
/ 05 февраля 2019

Можно ли использовать функцию оптимизации fmincon с определенной в Matlab функцией?

Я написал функцию, в которой я даю несколько постоянных параметров (реальных или сложных), и на данный момент, каждый раз, когда я изменяю эти параметры, результат изменяется (вы не говорите).

[output1, output2] = my_function(input1,input2,input3,input4)

Я видел, что функция fmincon позволяет найти оптимальный результат с заданным ограничением.Допустим, я хочу найти оптимальный выходной сигнал, действующий только на input1 и сохраняющий постоянным все остальные входы.Можно ли определить что-то вроде

fmincon(@(input1)my_function,[1,2],[],mean)

для input1, которое идет от 1 до 2 для лучшего значения mean, где среднее значение - это среднее значение некоторых других результатов.

Я знаю, что это довольно расплывчатый вопрос, но я не могу привести минимальный пример, так как function делает много вещей

Первое посещение с несколькими выходами дало мне ошибку Only functions can return multiple values.

Затем я попытался только с одним выходом, и если я использую

output1 = @(input1)function(input2,input3);
fmincon(@output1,[1,2],[],mean)

, я получаю ошибку

Ошибка: «output1» ранее использовался в качестве переменной,конфликтует с его использованием здесь в качестве имени функции или команды.Подробности смотрите в разделе «Как MATLAB распознает синтаксис команды» в документации MATLAB.

С fmincon(@my_function,[1,2],[],mean) Я получаю Not enough input arguments.

1 Ответ

0 голосов
/ 05 февраля 2019

Входные данные должны использоваться в вашем определении функции - читайте о том, как анонимные функции должны быть написаны.Вам не нужно использовать анонимные функции для определения фактической целевой функции (myFunction ниже), вы можете использовать функции в их собственном файле.Ключ в том, что целевая функция должна возвращать минимизируемый скаляр.

Вот очень простой пример, использующий fmincon для поиска минимумов в myFunction, основанный наначальное предположение [1.5,1.5].

% myFunction is min when x=1,y=2
myFunction = @(x,y) (x-1).^2 + (y-2).^2;
% Define the optimisation function.
% This should take one input (can be an array) 
% and output a scalar to be minimised
optimFunc = @(P) myFunction( P(1), P(2) );

% Use fmincon to find the optimum solution, based on some initial guess
optimSoln = fmincon( optimFunc, [1.5, 1.5] );

% >> optimSoln
% optimSoln =
%     0.999999990065893   1.999999988824129

% Optimal x = optimSoln(1), optimal y = optimSoln(2);

Вы можете видеть, что рассчитанный оптимум не совсем [1,2], но он находится в пределах допустимого отклонения по умолчанию.Вы можете изменить параметры для решателя fmincon - прочитайте документацию .


Если вы хотите сохранить y=1 как константу, вам просто нужно обновить функциюопределение:

% We only want solutions with y=1
optimFunc_y1 = @(P) myFunction( P(1), 1 ); % y=1 always
% Find new optimal solution
optimSoln_y1 = fmincon( optimFunc_y1, 1.5 );

% >> optimSoln_y1
% optimSoln_y1 = 
%    0.999999990065893
% Optimal x when y=1 = optimSoln(1)

Вы можете добавить ограничения неравенства, используя входные данные A, B, Aeq и Beq к fmincon, но это слишком широк, чтобы здесь углублятьсяПожалуйста, обратитесь к документации.


Обратите внимание, что вы используете ключевое слово function таким образом, что недопустимый синтаксис.Вместо этого я использовал допустимые имена переменных для функций в моей демонстрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...