ВУЗ:
Составители:
77
Комментарий по алгоритму. Поскольку алгоритм
метода предусматривает возможность изменения размеров
и формы многогранника за счет растяжения и сжатия, метод
получил название
деформируемого многогранника.
Ниже дана распечатка текста программы, в которой
реализован алгоритм несколько отличающийся от
рассмотренного выше. В частности, для построения
исходного многогранника используется датчик случайных
чисел. Имеются и другие отличия.
program nm;
const
nMax=10;
type dim= array[1..nMax+1,1..nMax] of real;
vect1=array [1..nMax] of real;
vect2=array [1..nMax+1] of real;
var
s: dim;
x,xh,xg,xl,xo,xr,xc,xe:vect1;
f: vect2;
ko,z,k,fl,fh,s1,s2,sig:real;
j,n,jc,i,tev,l,u,u1,h,g:integer;
fg,fr,fc,fe:real;
{Выбор вершины}
procedure choice(fn:real; x:vect1);
var j: integer;
begin
for j:=1 to n do
s[h,j]:=x[j];
f[h]:=fn
end;
{Вычисление целевой функции}
procedure functmin(var z:real; x:vect1);
begin
tev:=tev+1;
z:=100*sqr(x[2]-x[1])+sqr(1-x[1]);
78
end;
begin
randomize;
writeln('симплексный метод');
writeln('введи число пеpеменных');
readln(n);
tev:=0;
ko:=1;
writeln('Начальное пpиближение (x><0)');
for j:=1 to n do
begin
writeln('введите x',j);
read(s[1,j]);
if s[1,j]=0 then
s[1,j]:=0.001
end;
writeln('введите длину шага ( >1 )');
readln(k);
if k=1 then k:=1.1;
u1:=n+trunc(1.2*ln(k));
fl:=1e+20;
l:=1;
for i:=1 to n+1 do
begin
f[i]:=1e+20;
for u:=1 to u1 do
begin
for j:=1 to n do
x[j]:=s[l,j]*exp((1-
2*random)*ln(k));
functmin(z,x);
ko:=0.5*k+0.5;
if f[i]>z then
begin
f[i]:=z;
for j:=1 to n do
s[i,j]:=x[j];
if z<fl then
Комментарий по алгоритму. Поскольку алгоритм end; метода предусматривает возможность изменения размеров begin и формы многогранника за счет растяжения и сжатия, метод randomize; writeln('симплексный метод'); получил название деформируемого многогранника. writeln('введи число пеpеменных'); Ниже дана распечатка текста программы, в которой readln(n); реализован алгоритм несколько отличающийся от tev:=0; рассмотренного выше. В частности, для построения ko:=1; исходного многогранника используется датчик случайных writeln('Начальное пpиближение (x><0)'); чисел. Имеются и другие отличия. for j:=1 to n do program nm; begin const writeln('введите x',j); nMax=10; read(s[1,j]); type dim= array[1..nMax+1,1..nMax] of real; if s[1,j]=0 then vect1=array [1..nMax] of real; s[1,j]:=0.001 vect2=array [1..nMax+1] of real; end; var writeln('введите длину шага ( >1 )'); s: dim; readln(k); x,xh,xg,xl,xo,xr,xc,xe:vect1; if k=1 then k:=1.1; f: vect2; u1:=n+trunc(1.2*ln(k)); ko,z,k,fl,fh,s1,s2,sig:real; fl:=1e+20; j,n,jc,i,tev,l,u,u1,h,g:integer; l:=1; fg,fr,fc,fe:real; for i:=1 to n+1 do begin {Выбор вершины} f[i]:=1e+20; procedure choice(fn:real; x:vect1); for u:=1 to u1 do var j: integer; begin begin for j:=1 to n do for j:=1 to n do x[j]:=s[l,j]*exp((1- s[h,j]:=x[j]; 2*random)*ln(k)); f[h]:=fn functmin(z,x); end; ko:=0.5*k+0.5; if f[i]>z then {Вычисление целевой функции} begin procedure functmin(var z:real; x:vect1); f[i]:=z; begin for j:=1 to n do tev:=tev+1; s[i,j]:=x[j]; z:=100*sqr(x[2]-x[1])+sqr(1-x[1]); if z