Программа «1А-эпидемия»

ОГЛАВЛЕНИЕ

1. Общее
2.   Основные положения
3.  Исходные данные
4.  Этапы
4.  Массивы
5.  Заполнение массивов
6.  Конец расчётов
7. Сценарии эпидемии
8.  Вывод
9. О программе


Приложение 1
Распечатка программы

1. Общее
Наиболее полно моделировать эпидемию на основе следующих исходных положений.
1.1. На основе статистики каждому человеку заданы данные: возраст,
мобильность, данные о здоровье и т.д.
1.2. На основе статистики задана вероятность заражения больным  других людей.
1.3. На основе статистики задана вероятность протекания болезни у отдельных людей.
Однако, соответствующие статистики пока не полные.
Разработана приближенная программа «1А- Эпидемия» для изучения различных вариантов протекания эпидемии.
Замена ранее выставленной программы «А- Эпидемия», в которой обнаружена ошибка.

2.  Основные положения
В программу заложено.
2.1. Задано число людей – b
2.2. Первоначально инфицировано – с.
2.3. При заражении больной m дней больной заражает.
2.4. Через m дней больного госпитализируют.
2.5. На госпитализации больной проводит x дней.
2.6.      Подвержены инфекции все, за исключением больных  и
выздоровевших.
Число зараженных пропорционально доле населения,  подверженного  инфекции.
За один цикл  больной до госпитализации заражает  число людей, равное произведению заданного числа w на долю населения, подверженного инфекции.
2.7. Вакцинация и смертность не учитывается

3. Исходные данные

a=  1000;//число циклов
      b=100000;//общее население
       c =300; //число больных до госпитализации – момент 0
        m=6;// время до госпитализации больных
        x=6;// время на госпитализации
        w=0.2  ;// максимально возможное число  заражённых одним больным
//до госпитализации за цикл
      ta=10 ;//цикл – контрольная точка

4.  Массивы[/b]
Расчёт эпидемии производится путем заполнения массивов:
s1:array [1..a] of Cardinal;// число больных по циклам
           s2:array [1..a] of variant;// число  заболевших за цикл
      s3:array [1..a] of Cardinal;// число число госпитализированных за цикл
              s4:array [1..a] of Cardinal;// число выздоровевших за цикл
         s5 : array [1..a]  of cardinal; // число больных до госпитализации
          s6 : array [1..a]  of Cardinal ; // число больных на госпитализации
s7 : array [1..a]  of Cardinal; // число выздоровевших
         s8  : array [1..a] of variant;  //  число подверженных инфекции
           s9  : array [1..a] of variant; //  доля заболевших
           s10  : array [1..a] of variant; //  доля подверженных инфекции
           s11  : array [1..a] of Cardinal;// проверочная сумма
   sa13:array [1..2,1..11] of variant;//макcимумы и минимумы

5.  Заполнение массивов
На каждом цикле вычисляются:
Число заболевших на цикле и суммарно число больных до госпитализации.
Число госпитализированных на цикле и суммарное число госпитализированных.
Число выздоровевших на цикле и суммарное число выздоровевших
Суммарное число,  подверженных инфекции

6. Конец расчётов
Предусмотрено два варианта окончания расчётов
6.1.  Расчёты закачиваются на заданном числе циклов a.
6.2. Для каждого из массивов  массивов s1 -  s11 в программе задаются условия прекращения расчётов.
Например, число заболевших за цикл равно 0.
6.3. Число пройденных циклов – aa.

7. Сценарии эпидемии
В зависимости от входных данных (m, x, w) два сценария эпидемии.
7.1. Быстрое увеличение числа больных.
Быстрое прекращение счёт. Нет новых больных.
7.2. Число новых больных не увеличивается.
Долгий счёт.

8. Вывод
8.1  Таблица № 2
Массивы s1 -  s11
8.2.  Таблица № 3.
Массив  s13
Максимумы при расчёте массивов  s1 -  s7,   s9 и    s11
Минимумы при расчете массивов   s8 и    s10
5.2.  Edit 1
5.2.1. Исходные данные
5.2.2.  t1 – номер цикла на этапе 3, при котором число заболевших по расчёту превзошло число подверженных инфекции.
t2 – номер цикла на этапе 4, при котором число заболевших по расчёту превзошло число подверженных инфекции.
5.3 . Edit 2
Переменные v1 – v11
Соответствуют номеру цикла прекращения расчётов для массивов s1 – s11.
5.4. Edit 3
Величины массивов s1 – s11 на цикле aa.
5.5. Edit 4
Величины массивов s1 – s11 на цикле tt = aa-1
5.6. Edit 5
Величины массивов s1 – s11 на цикле ta.

6. О  программе
6.1  Программа на Дельфи 7
6.2  Ввод исходных в программе
6.3 Распечатка программы – Приложение 1
6.4 Результаты счёта в файле  exe программы
6.3  Скачать программу
https://disk.yandex.ru/d/mV5R9iKZhYNfow

Приложение 1
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)

    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button5: TButton;
    Label1: TLabel;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    StringGrid4: TStringGrid;
    Button4: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label4: TLabel;
    Edit3: TEdit;
    Label7: TLabel;
    Edit4: TEdit;
    Edit5: TEdit;
    Label2: TLabel;
    Label5: TLabel;
    Label6: TLabel;

    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end; 
var
  Form1: TForm1;
implementation
{$R *.dfm}
          const
       a=  1000;//число циклов
      b=100000;//общее население
       c =300; //число больных до госпитализации - момент 0
        m=6;// время до госпитализации больных
        x=6;// время на госпитализации
        w=0.3 ;// максимально возможное число  заражённых одним больным
  //о гопитализации за цикл
    ta = 10 ; // цикл - контрольная точка

      var
            Tick: Cardinal;
       s1:array [1..a] of Cardinal;// число больных по циклам
           s2:array [1..a] of variant;// число  заболевших за цикл
      s3:array [1..a] of Cardinal;// число число госпитализированных за цикл
              s4:array [1..a] of Cardinal;// число выыздоровевших за цикл
         s5 : array [1..a]  of cardinal; // число больных до госпитализации
          s6 : array [1..a]  of Cardinal ; // число больных на госпитализации
s7 : array [1..a]  of Cardinal; // число выздоровевших
         s8  : array [1..a] of variant;  //  число подверженных инфекции
           s9  : array [1..a] of variant; //  доля заболеших
           s10  : array [1..a] of variant; //  доля подверженных инфекции
           s11  : array [1..a] of Cardinal;// проверочная сумма
   sa13:array [1..2,1..11] of variant;//макcимумы и минимумы
        //массивов s1 - s11
aa, v, q,  a1, b1,i, i0, j  : integer;//
tt, t, r: integer;//
vv, v1, v2, V3, V4, V5, V6, V7, V8, V9, V10,v11  :  integer;//
     t1,t2: integer;//
procedure TForm1.Button1Click(Sender: TObject);
// окантовка
begin
     for q:=1 to a //нумерация по горизонтали в табл №1 ,
         do StringGrid1.Cells[q,0]:=IntToStr(q);
       for q:=1 to 5   // нумерация по вертикали  в табл №1 ,
     do   StringGrid1.Cells[0,q]:=IntToStr(q);

  for q:=1 to a //нумерация по горизонтали в табл №2,
     do StringGrid2.Cells[q,0]:=IntToStr(q);
       for q:=1 to 15   // нумерация по вертикали  в табл №2 ,
     do   StringGrid2.Cells[0,q]:=IntToStr(q);

                // резерв
       for q:=1 to a //нумерация по горизонтали в табл №4,
     do StringGrid3.Cells[q,0]:=IntToStr(q);
       for q:=1 to 5   // нумерация по вертикали  в табл №4 ,
     do   StringGrid3.Cells[0,q]:=IntToStr(q);
                end;

procedure TForm1.Button2Click(Sender: TObject);
            begin
for i:=1 to a do   begin
//остановка
//v1
     if i>1 then
   begin
  if s1[i] =0 then
begin v1:=i;  aa:=i  end;
   if s1[i-1] =0 then
begin  break end;
end;
// v2
        if i>1 then
   begin
  if s2[i] >=b then
begin v2:=i;aa:=i  end;
   if((s2[i-1] =0) or ( s2[i-1] >=b))then
begin  break end;
  end;
  // v3
      if i>m+1 then
begin  if((s3[i] =0) or ( s3[i] >=b))then
begin v3:=i;aa:=i end;
   if((s3[i-1] =0) or ( s3[i-1] >=b))then
begin  break end;
       end;
       // v4
   if i>m+x+1 then
  begin
if((s4[i] =0) or ( s4[i] >=b))then
begin v4:=i;aa:=i end;
   if((s4[i-1] =0) or ( s4[i-1] >=b))then
begin  break end;
       end;
       //   v5
        if (i>1 ) and (i<=m) then
   begin
  if((s5[i] =0) or ( s5[i] >=b))then
begin v5:=i;aa:=i        ; end;
   if((s5[i-1] =0) or ( s5[i-1] >=b))then
begin  break end;
end;
            //   v6
          if i>m+1 then
  begin
if((s6[i] =0) or ( s6[i] >=b))then
begin v6:=i;aa:=i end;
   if((s6[i-1] =0) or ( s6[i-1] >=b))then
  begin  break end;
       end;
            //  v7
         if i>m+x+1 then
  begin
if((s7[i] =0) or ( s7[i] >b))then
begin v7:=i;aa:=i end;
   if((s7[i-1] =0) or ( s7[i-1] >b))then
begin  break end;
       end;
      // v8
if i>1 then
  begin
if(s8[i] <=0) or ( s8[i] >b)then
begin v8:=i;aa:=i end;
   if (s8[i-1] =0) or ( s8[i-1] >b)then
begin  break end;
       end;
      // v11
    if i>1 then
  begin
if(s11[i] <>b) then
begin v11:=i;aa:=i end;
   if s11[i-1]<>b then
  begin  break end;
       end;
//   конец остановки
       begin //1
      //////////
       ////////////////
            Form1.Caption:=IntToStr(GetTickCount-Tick);
           //цикл расчётов

         //Этап № 1
       if i=1 then begin
            s1[i] :=c;//  Число больных
            s2[i]:=c; //число больных до госпитализации
            s3[i] :=0;
            s4[i] :=0;
            s5[i] :=c;
            s6[i] := 0;
            s7[i] := 0;
            s8[i] := b-c;
            s9[i] := c/b;
              s10[i]:= b/b;
                    // s11[i] := b;
                                    end;

                   /////////////////////////
          //  Этап № 2
          if (i>1) and (i <=m) then
                begin
s2[i]:= (( s5[i-1] * w)*( s8[i-1])/b)div 1 ;
    s1[i] := s2[i] +s1[i-1];
           s3[i] :=   0;
            s4[i] :=0;
           s5[i]:= s1[i];
           s6[i]:= 0;
            s7[i] := 0;
            s8[i] :=  b-s5[i];
            s9[i] := s1[i]/b;
             s10[i] := (b - s1[i])/b;
              s11[i] :=  s1[i]+  s8[i];
                  end;
            ////////////////////
                   /////////////////////
                    //  Этап № 3
   if (i>m) and (i<=m+x ) then
                begin
     s2[i]:= (( s5[i-1] * w)*( s8[i-1]/b))div 1 ;  // число  заболевших за цикл
     if s2[i] > s8[i-1] then
     begin s2[i] := s8[i-1]; t1:=i;  end;
   s3[i] :=   s2[i-m];  // число госпитализированных за цикл
    s4[i] :=0;  // число выыздоровевших за цикл
              s7[i] := 0;  // число выздоровевших
               s1[i] := s1[i-1] +s2[i]; //Число больныъ
           s5[i]:= s5[i-1] + s2[i]-s3[i];;//число больных до госпитализации
           s6[i]:= s6[i-1] + s3[i]; // // число больных на госпитализации
            s8[i] :=b -s5[i] - s6[i] ; //  число подверженных инфекции
            s9[i] := s1[i]/b;    //доля   больных
             s10[i] := s8[i]/b; // доля подвнрженых иныекции
              s11[i] :=  s1[i]+  s8[i];  //контрольная сумма
     end;
     /////////////////////////////////////
     /////////////////////////////////////               
                    //  Этап № 4
   if i>(m+x) then
       begin
   s2[i] :=  (( s5[i-1] * w)*( s8[i-1]/b)) div 1 ;
if  s2[i] > s8[i-1] then
begin s2[i] := s8[i-1] ;t2:=i; end;// число  заболевших за цикл
   s3[i] :=   s2[i-m];  // число госпитализированных за цикл
    s4[i] := s3[i-x];  // число выыздоровевших за цикл
              s7[i] :=s7[i-1] + s4[i];  // число выздорвевших
           s5[i]:= s5[i-1] + s2[i]-s3[i];//число больных до госпитализации
           s6[i]:= s6[i-1] + s3[i]-s4[i]; // // число больных на госпитализации
            s1[i] := s5[i] +s6[i] ; //Число больных
            s8[i] :=b -s7[i]- s5[i] - s6[i] ; //  число подверженных инфекции
                       s9[i] := s1[i]/b;
             s10[i] := s8[i]/b;
              s11[i] :=  s1[i]+  s8[i]+s7[i];
                                   end;
                        // нахождение максимума - минимума
  if s1[i] > s1[i-1] then begin sa13[1,1]:= i; sa13[2,1]:= s1[i];  end;
       if s2[i] > s2[i-1] then begin sa13[1,2]:= i; sa13[2,2]:= s2[i];  end;
      if s3[i] > s3[i-1] then begin sa13[1,3]:= i; sa13[2,3]:= s3[i];  end;
       if s4[i] > s4[i-1] then begin sa13[1,4]:= i; sa13[2,4]:= s4[i];  end;
       if s5[i] > s5[i-1] then begin sa13[1,5]:= i; sa13[2,5]:= s5[i];  end;
       if s6[i] > s6[i-1] then begin sa13[1,6]:= i; sa13[2,6]:= s6[i];  end;
        if s7[i] > s7[i-1] then begin sa13[1,7]:= i; sa13[2,7]:= s7[i];  end;
         if s8[i] < s8[i-1] then begin sa13[1,8]:= i; sa13[2,8]:= s8[i];  end;
           if s9[i] > s9[i-1] then begin sa13[1,9]:= i; sa13[2,9]:= s9[i];  end;
      if s10[i] < s10[i-1] then begin sa13[1,10]:= i; sa13[2,10]:= s10[i];  end;
     if s11[i] >= s11[i-1] then begin sa13[1,11]:= i; sa13[2,11]:= s11[i];  end;
                             end;

            Edit1.Text :=  'a='+'---' +IntToStr(a)   +'   '  +
                'b='+'---' +IntToStr(b)   +'   '  +
                 'c='+'---' +  IntToStr(c)  +'   '  +
                   'm='+'---' + IntToStr(m)  +'   '  +
                    'x='+'---' +IntToStr(x) +'   '  +
            'w='+'---'+FormatFloat('0.00',w)   +'  '  +
                    'ta='+'---' +IntToStr(ta)  +'  '  +
                   't1='+'---' + IntToStr(t1)  +'   '  +
                    't2'+'---' +IntToStr(t2);

           Edit2.Text :=
                 'V1='+'--'+IntToStr(v1)    +'   '  +
               'V2='+'--'+IntToStr(V2)   +'   '  +
                 'V3='+'--'+IntToStr(V3) +'   '  +
                     'V4='+'---'+IntToStr(V4) +'   '  +
               'V5='+'--'+IntToStr(V5)+'   '  +
                 'V6='+'--'+IntToStr(V6) +'   '  +
                      'V7='+'--'+IntToStr(V7)  +'   '  +
                'V8='+'--'+IntToStr (V8)   +'   '  +
            'V9='+'--'+   IntToStr (v9)  +'   '  +
             'V10='+'--'+IntToStr(V10) +'   '  +
              'V11='+'--'+IntToStr(V11)
             +'   '  + 'aa='+'---'+IntToStr(aa)
             +'   '  + 'vv='+'---'+IntToStr(vv);

           if aa >0 then
              Edit3.Text :=
                  's1[aa]='+' '+IntToStr(s1[aa])  +' '  +
                     's2[aa]='+' '+IntToStr(s2[aa])    +' '  +
                       's3[aa]=' +' '+IntToStr(s3[aa])    +' '  +
                   's4[aa]='+' '+IntToStr(s4[aa])    +' '  +
                       's5[aa]='+' '+IntToStr(s5[aa])    +' '  +
                     's6[aa]='+' '+IntToStr(s6[aa])    +' '  +
                     's7[aa]='+' '+IntToStr(s7[aa])    +' '  +
              's8[a]='+' '+IntToStr(s8[aa])   +'  '  +
              's9[aa]='+' '+FormatFloat('0.0000',s9[aa] ) +' '  +
           's10[aa]=' +' '+FormatFloat('0.0000 ',s10[aa])+' '  +
                     's11[aa]=' +' '+IntToStr(s11[aa])  ;

                                tt:=aa-1;
                                Edit4.Text :=
                     's1[tt]='+' '+IntToStr(s1[tt])    +'  '  +
                     's2[tt]='+' '+IntToStr(s2[tt])    +'  '  +
                       's3[tt]=' +' '+IntToStr(s3[tt])    +'  '  +
                     's4[tt]='+' '+IntToStr(s4[tt])    +'  '  +
                       's5[tt]='+' '+IntToStr(s5[tt])    +'  '  +
                     's6[tt]='+' '+IntToStr(s6[tt])    +'  '  +
                       's7[tt]='+' '+IntToStr(s7[tt])    +'  '  +
              's8[tt]='+' '+IntToStr(s8[tt])    +'   '  +
              's9[tt]='+' '+FormatFloat('0.0000',s9[tt])    +'  '  +
                     's10[tt]=' +' '+FormatFloat('0.0000',s10[tt]) +' '  +
                     's11[tt]=' +' '+IntToStr(s11[tt]) ;

       Edit5.Text :=
             ' s1[ta]='+' '+IntToStr(s1[ta])    +'   '  +
                     's2[ta]='+' '+IntToStr(s2[ta])    +'   '  +
                       's3[ta]=' +' '+IntToStr(s3[ta])    +'   '  +
                     's4[ta]='+' '+IntToStr(s4[ta])    +'   '  +
                       's5[ta]='+' '+IntToStr(s5[ta])    +'   '  +
                     's6[ta]='+' '+IntToStr(s6[ta])    +'   '  +
                       's7[ta]='+' '+IntToStr(s7[ta])    +'   '  +
              's8[ta]='+' '+IntToStr(s8[ta])    +'   '  +
              's9[ta]='+' '+FormatFloat('0.0000',s9[ta])    +'   '  +
                     's10[ta]=' +' '+FormatFloat('0.0000',s10[ta])   +'   '  +
                     's11[ta]=' +' '+IntToStr(s11[ta]) ;

               for i0:=1 to a do   begin
            StringGrid2.Cells[i0,1]:=  IntToStr(s1[i0]) ;
           StringGrid2.Cells[i0,2]:=  IntToStr(s2[i0]) ;
                StringGrid2.Cells[i0,3]:=  IntToStr(s3[i0]) ;
                  StringGrid2.Cells[i0,4]:=  IntToStr(s4[i0]) ;
                      StringGrid2.Cells[i0,5]:=  IntToStr(s5[i0]) ;
                      StringGrid2.Cells[i0,6]:=  IntToStr(s6[i0]) ;
                         StringGrid2.Cells[i0,7]:=  IntToStr(s7[i0]) ;
                         StringGrid2.Cells[i0,8]:= FormatFloat('0.0',s8[i0]);
                      StringGrid2.Cells[i0,9]:= FormatFloat('0.000',s9[i0]);
                StringGrid2.Cells[i0,10]:= FormatFloat('0.000',s10[i0]); ;
                StringGrid2.Cells[i0,11]:=  IntToStr(s11[i0]) ;
                              end;

                    StringGrid2.Cells[m,13]:=  'm='+IntToStr(m) ;
                       StringGrid2.Cells[(m+x),13]:= 'm+x='+IntToStr(m+x)  ;

                 for i0:=1 to 8 do   begin
            StringGrid3.Cells[i0,1]:=  IntToStr(sa13[1,i0]) ;
           StringGrid3.Cells[i0,2]:=  IntToStr(sa13[2,i0]) ;
                               end;
                      for i0:=9 to 10 do   begin
            StringGrid3.Cells[i0,1]:=   IntToStr(sa13[1,i0]) ;
           StringGrid3.Cells[i0,2]:=  FormatFloat('0.0000',sa13[2,i0]);
                               end;
          StringGrid3.Cells[11,1]:=  IntToStr(sa13[1,11]) ;
           StringGrid3.Cells[11,2]:=  IntToStr(sa13[2,11]) ;
                            end;

                   for i0:=1 to 7 do   begin
            StringGrid3.Cells[i0,3]:=  'max';
                               end;

            StringGrid3.Cells[8,3]:=  ' min';
           StringGrid3.Cells[9,3]:=  'max';
          StringGrid3.Cells[10,3]:=  'min'; ;
           StringGrid3.Cells[11,3]:=  'max' ;

                            StringGrid2.Cells[a,13]:= 'a='+IntToStr(a) ;
                             StringGrid1.Cells[a,13]:= 'a='+IntToStr(a) ;

                                  end;
procedure TForm1.Button4Click(Sender: TObject);
begin
end;
  /////////  ///////////////////////////////////////////////////////
        procedure TForm1.Button5Click(Sender: TObject);
begin
      close
end;
end.

Отредактировано ABC (2021-08-14 23:22:22)