Найдите значения x , которые минимизируют
f (<reservedrangesplaceholder1>) = (x 1 – 0.5)2 + (x 2 – 0.5)2 + (x 3 – 0.5)2
где
для всех значений w 1 и w 2 по областям значений
1 <reservedrangesplaceholder0> 1 100,
1 <reservedrangesplaceholder0> 2 100.
Обратите внимание, что полубесконечные ограничения являются одномерными, то есть векторами. Поскольку ограничения должны быть в форме Ki (x, wi) ≤ 0, вы должны вычислить ограничения как
Сначала запишите файл, который вычисляет целевую функцию.
function f = myfun(x,s) % Objective function f = sum((x-0.5).^2);
Во-вторых, запишите файл mycon.m
который вычисляет нелинейные ограничения равенства и неравенства и полу-бесконечные ограничения.
function [c,ceq,K1,K2,s] = mycon(X,s) % Initial sampling interval if isnan(s(1,1)), s = [0.2 0; 0.2 0]; end % Sample set w1 = 1:s(1,1):100; w2 = 1:s(2,1):100; % Semi-infinite constraints K1 = sin(w1*X(1)).*cos(w1*X(2)) - 1/1000*(w1-50).^2 -... sin(w1*X(3))-X(3)-1; K2 = sin(w2*X(2)).*cos(w2*X(1)) - 1/1000*(w2-50).^2 -... sin(w2*X(3))-X(3)-1; % No finite nonlinear constraints c = []; ceq=[]; % Plot a graph of semi-infinite constraints plot(w1,K1,'-',w2,K2,':') title('Semi-infinite constraints') drawnow
Затем активируйте стандартную программу оптимизации.
x0 = [0.5; 0.2; 0.3]; % Starting guess [x,fval] = fseminf(@myfun,x0,2,@mycon);
После восьми итераций решение является
x x = 0.6675 0.3012 0.4022
Значение функции и максимальные значения полунепрерывных ограничений в решении x
являются
fval fval = 0.0771 [c,ceq,K1,K2] = mycon(x,NaN); % Initial sampling interval max(K1) ans = -0.0077 max(K2) ans = -0.0812
Получен график полунепрерывных ограничений.
Этот график показывает, как peaks в обоих ограничениях находятся на границе ограничений.
Команда plot inside mycon.m
замедляет расчет. Удалите эту линию, чтобы улучшить скорость.