fseminf с одномерным ограничением - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь использовать функцию fseminf в среде оптимизации MATLAB:

clc;
clear;
close;

% Define function 
global g f S
f= @(x) -x(1);
g= @(x,s) x(1)-x(2).*s(1)-x(3).*(-sqrt((2.25-10.*sqrt(12).*...
(s(1)-1.175).^2)./(5.*sqrt(24)))+1.2);
lb=[-Inf,0,0];
ub=[Inf,1,1];
S=[0.9220144,1.42985]; 
x0= [0.5,0.5,0.5]'; % initial condition
A= [];
b=[];
Aeq= [0,1,1];
beq= [1];
[x,fval,exitflag,output,lambda] = fseminf(f,x0,1,@seminfcon2,A,b,Aeq,beq,lb,ub);

seminfcon2 определяется следующим образом:

function [c, ceq, K1, s] = seminfcon2(x,s)
global S g

% No finite nonlinear inequality and equality constraints
c = [];
ceq = [];

% Sample set
if isnan(s(1,1))
      s(1,1)=0.001;
      s(1,2)=0;
end
t = S(1):s(1):S(2);
K1 = g(x,t);

Вот детали, дело в том, что это не работает должным образом, я получаю решение, которое не удовлетворяет ограничениям. В нем говорится:

Найден локальный минимум, который удовлетворяет ограничениям. завершено, потому что целевая функция не уменьшается в ↵ возможные направления, в пределах значения допуска оптимальности.

Я знаю, что ограничения не выполняются, потому что

  1. Я нарисовал область ограничения
  2. мои другие алгоритмы дают хороший результат

Мой вопрос к людям, которые знают, как работает функция fseminf. Возможно ли, что этот алгоритм не может выполнить оптимизацию для моего примера? Чтобы добавить, fseminf отлично работает с моими другими примерами.


РЕДАКТИРОВАТЬ

  • Решение, найденное алгоритмом: (1.1633, 0, 1.0000)
  • тогда как другие мои алгоритмы дали: (0.99069, 0.55395, 0.44605)

1 Ответ

1 голос
/ 04 июля 2019

Несколько ошибок:

  • f является функцией x и s, не только x
f = @(x, s) -x(1);
  • Полубесконечное ограничение оценивается на весь интервал , а не на фиксированная точка
  • Заменить s(1) в g(x, s) на s без индексации , все интервал будет использоваться
  • Полубесконечное ограничение g(x, s) выглядит следующим образом
g = @(x,s) x(1)-x(2).*s-x(3).*(-sqrt((2.25-10.*sqrt(12).*...
(s-1.175).^2)./(5.*sqrt(24)))+1.2);

решение

x = [0.9907    0.5546    0.4454]
...