Можно ли контролировать значение, вычисленное при оптимизации, до конечного значения? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть функция.m такая, что function(x,y), которая является непрерывной функцией для нее, четко определена.Для каждого y в диапазоне от 0.04:0.02:0.2 я хочу найти x такой, что function(x,y) дает значение 0.5.К сожалению, function(x,y) не определен ни для какого x.Например, когда y=0.04, function(x,y)=0.4, когда x=2, function(x,y)=0.55, когда x=3.Это также дает, что function(x,y)=-inf когда x<2.С другой стороны, когда y=0.05, function(x,y)=0.4, когда x=5, function(x,y)=0.81, когда x=9 и function(x,y)=-inf, когда x<5.Я хотел бы использовать fmincon в Matlab для решения проблемы, поэтому я пишу цикл, чтобы я нашел x

y = 0,04: 0,02: 0,2;

дляi = 1: длина (y)

результат = fmincon (@ (x) abs (функция (x, y (i)) - 0,5), 2, [], [], [], [], [], []);

end

Однако при выполнении оптимизации бывает, что, например, когда y=0.04, x является значением, выбранным какменьше 2 и дает значение -inf и не может идти дальше.Я хотел бы знать, можно ли установить, что matlab может находить только конечные значения, или когда он пытается указать точку, которая дает target -inf, он может автоматически найти другое значение x и продолжить процедуру.

Я понимаю, что мог бы найти определенный диапазон, который сначала дает значение 0.5 для каждого y, но это очень много времени, и я не хочу этого делать.

1 Ответ

0 голосов
/ 11 июля 2019

Предполагается,

f = @(x, y)-y.*exp(x);
  • Минимальное значение f равно -inf
  • Цель: Найти x, для которого f имеет наименьшее значение, но не -inf
  • Ограничение
-inf < f < inf --> f - inf < 0 and -f - inf < 0
  • inf аппроксимация значения на matlab
>> exp(709) = 8.2184e+307 

, в то время как

>> exp(710) = inf

Я выбрал inf как exp(709)

Теперь у меня есть нелинейное ограничение

f - exp(710) < 0 and -f - exp(710) < 0

Добавление этого к fmincon() f не будет принимать бесконечное значение

Пожалуйста, прочитайте комментарии

% Given y
y = 0.04:0.02:0.2;

% Given function f
f = @(x, y)-y.*exp(x);



% store fmincon solution x
x = zeros(size(y));

% store fminconfunction evaluation x
fval =zeros(size(y));
for i = 1:length(y)

    % function depending on x only
    g =@(x)f(x, y(i));

    % initial function evaluation constrained not to take infinite values
    c =  @(x)[g(x)-exp(709); -g(x)-exp(709)]; 
    ceq = @(x)[];
    constraints = @(k)deal(c(k),ceq(k));

    [x(i), fval(i)] = fmincon(g,2,[],[],[],[],[],[],constraints);
end

Вывод:

x = [76.6352  551.6941  702.1137   10.4739   13.6470  250.4344   22.4630   
28.4753  100.6441];

fval =  1.0e+303 *[-0.0000   -0.0000   -6.7174   -0.0000   -0.0000   -0.0000   
-0.0000   -0.0000   -0.0000]
...