
3. Лабораторне завдання
Варіант 19
19. |
|
Знайти мінімум за допомогою симплекс-методу |
4. Виконання роботи Текст програми
% Lab No 4: sympl_met
% Two dimensional space
% ------------------------
% Minimum search
% REGULAR SYMPLEX-METHOD
% ------------------------
nx1=40;nx2=40;
a1=0;b1=1;
a2=0;b2=1;
h1=(b1-a1)/(nx1-1);
h2=(b2-a2)/(nx2-1);
for ii=1:nx1,
x01m(ii)=a1+h1*(ii-1);
end;
for ii=1:nx2,
x02m(ii)=a2+h2*(ii-1);
end;
[sur]=surface_ch(x01m,x02m,nx1,nx2);
N=2;
x0=[1 1];
% al - long multiplier
al=1;
% epc - additional value of exactness
epc=0.001;
epc1=0.0001;
% x1,x2 - first points in initial symplex
% del1, del2 - increments of argument
del1=((N+1)^(1/2)+N-1)/(N*2^(1/2))*al;
del2=((N+1)^(1/2)-1)/(N*2^(1/2))*al;
% calculation of x1, x2
x1=x0+[del1 del2];
x2=x0+[del2 del1];
f0=fza(x0)
f1=fza(x1)
f2=fza(x2)
fv=[f0 f1 f2];
% fmin=-100000;
fmin=min(fv);
fn=fmin-epc;
fn
fmin
% ----------------------
kit0=0;
while (al > 0.0015625)
kit0=kit0+1
kit=0;
disp ('new_po');
while (fn < fmin)
kit=kit+1
[x01 x11 x21 fn,fmin,xn,x1n,x2n]=new_po(x0,x1,x2,epc);
fn
fmin
x0=x01;x1=x11;x2=x21;
end;
% ---------------------------
xn0=xn;it=0;
fn=fmin-epc;
disp ('new_po1');
while (fn < fmin)
kit=kit+1
[x00,x10,x20,fn,fmin,xn,x1n,x2n,it1]=new_po1(xn0,x1n,x2n,epc,it);
fn
fmin
x0=x01;x1=x11;x2=x21;it=it1;
end;
%----------------------------
al=al/2;
fn=fmin-epc;
x0=xn;x1=x0+[del1 del2]*al;x2=x0+[del2 del1]*al;
end;
disp ('symplex:');
x2n
fmin
disp ('min_two:');
[fminz,x1z,x2z]=min_two(sur,x01m,x02m,nx1,nx2);
x1z
x2z
fminz
return
function [f]=fza(x);
% Calculation of prescribed function
f=x(1)^2+2*x(1)*x(2)+4*x(2)^2-3*x(1)-6*x(2)+8;
return
function[fmin,x1,x2]=min_two(sur,x01,x02,n1x,n2x);
% ------------------------------------------------
% search of minimum point of two-dimensional array
% ------------------------------------------------
for ij=1:n2x,
jmi1=1;fmin1=sur(1,ij);
jm(ij)=jmi1;fmj(ij)=fmin1;
for ii=2:n1x,
if (sur(ii,ij) < fmin1),
fmin1=sur(ii,ij);jmi1=ii;
end;
end;
jm(ij)=jmi1;fmj(ij)=fmin1;
end;
in1=jm(1);
in2=1;fjmm=fmj(1);
for ij=2:n2x,
if (fmj(ij) < fjmm)
in1=jm(ij);in2=ij;
fjmm=fmj(ij);
end;
end;
% jm
x1=x01(in1);x2=x02(in2);
xv=[x1 x2];
fmin=fza(xv);
% jm
return
function [x00,x10,x20,fn,fmin,xn,x1n,x2n]=new_po(x0,x1,x2,epc)
% search of new point in symplex-method
% fmin - function minimum in points of previous symplex
% fn - function value in new point
f0=fza(x0);
f1=fza(x1);
f2=fza(x2);
fv=[f0 f1 f2];
fm=max(fv);
fmin=min(fv);
% search of two points for determination of xs
% xp - point of function maximum
% xn1, xn2 - points for search xs
if(abs(fm-f0) < epc)
x1n=x1; x2n=x2;xp=x0;
end
if(abs(fm-f1) < epc)
x1n=x0; x2n=x2;xp=x1;
end
if(abs(fm-f2) < epc)
x1n=x0; x2n=x1;xp=x2;
end
xs=(x1n+x2n)/2;
% xn - new point
xn=2*xs-xp;
fn=fza(xn);
% choice of new points
x00=x1n;x10=x2n;x20=xn;
return
function[sur]=surface_ch(x01,x02,n1,n2);
for ii=1:n1,
for ij=1:n2,
xv=[x01(ii) x02(ij)];
sur(ii,ij)=fza(xv);
end
end
[xxx,yyy]=meshgrid(x01,x02);
figure (1); mesh(xxx,yyy,sur);
return