%plot(x1(1), x1(2), 'bo'); hold on; %plot(x2(1), x2(2), 'g*'); hold on; %plot(x3(1), x3(2), 'r*'); grid on;
patch([x1(1) x2(1) x3(1)], [x1(2) x2(2) x3(2)], [1 1 1], 'FaceColor', 'none')
F1 = F(x1);
F2 = F(x2);
F3 = F(x3);
sprintf('ЦФ в точке х1 %f', F1) sprintf('ЦФ в точке х2 %f', F2) sprintf('ЦФ в точке х3 %f', F3)
%самая высокая точка F
Fmax = max([F1 F2 F3]); switch Fmax
case F1
xh = x1; nh = 1; case F2
xh = x2; nh = 2; case F3
xh = x3; nh = 3;
end
%самая низкая точка F Fmin = min([F1 F2 F3]); switch Fmin
case F1
xl = x1; case F2
xl = x2; case F3
xl = x3;
end
%Центр тяжести, спроецированный на ребро симплекса, относительно которого выполняется отображение
x4 = 1./n .* (x1+x2+x3-xh); plot(x4(1), x4(2), 'kh'); F4 = F(x4);
% проверка критерия достаточной малости симплекса if (((F1-F4)^2+(F2-F4)^2+(F3-F4)^2)/3 < TolFun),
disp('Сходимость достигнута');
6
sprintf('x1 опт = %f, x2 опт = %f, Fmin = %f', xl(1), xl(2), Fmin)
break;
end
% отображаем точку
x5 = x4 + alpha*(x4-xh); plot(x5(1), x5(2), 'ms'); F5 = F(x5);
sprintf('ЦФ в точке х5 %f', F(x5))
if (F5 < F(xh)), % в новой точке получено меньшее значение ЦФ
x(:,nh) = x5;
plot([xh(1) x5(1)], [xh(2) x5(2)], '--')
|
% растяжение вершины |
||
|
x6 |
= |
x4 + gamma*(x4-xh); |
% |
x6 = x4 + gamma*(x5-x4); |
||
|
plot(x6(1), x6(2), 'c^'); |
||
|
F6 |
= F(x6); |
|
|
plot([xh(1) x6(1)], [xh(2) x6(2)], '--') |
||
|
if (F6 < F5), % в новой точке получено меньшее значе- |
||
ние ЦФ |
|
|
|
|
|
x(:,nh) = x6; |
|
|
else |
% сжатие вершины |
|
|
|
x7 |
= x4 + beta*(x4-xh); |
% |
|
x7 = x4 + beta*(xh-x4); |
|
|
|
plot(x7(1), x7(2), 'cv'); |
|
|
|
F7 |
= F(x7); |
if (F7 < F5), % в новой точке получено меньшее значен ЦФ x(:,nh) = x7;
end end
else % сжатие симплекса
if (x1 ~= xl), x(:,1) = xl + 0.5*(x1 - xl); end if (x2 ~= xl), x(:,2) = xl + 0.5*(x2 - xl); end if (x3 ~= xl), x(:,3) = xl + 0.5*(x3 - xl); end
end
x1 = x(:,1);
x2 = x(:,2);
x3 = x(:,3); end
7