Компьютерное моделирование. Лабораторный практикум. Алтаев А.А - 39 стр.

UptoLike

Составители: 

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