Пример программы для выполнения курсового проекта Раздел описания констант Раздел описания переменных Начало тела программы Детальная параметризация модели водосбора 1 порядка Модель формирования стока (водосбора) Оценка прогноза. Графика Модель кинематической волны Оценка прогноза. Графика Program Kurs_1; { Название программы } { Подключение библиотечных модулей: стандартных (Сtr, Printer) и пользовательских Mlb, Mmatem1, MGraph1 } Uses Crt, Mlb, Mmatem1, MGraph1, Printer; Label m1, m2, m3, m4; { Описание меток } Const { Описание констант } pk=1/86.4; { Переходный коэффициент } n=78; { Рассчетный период } dL=135; { км - длина расчетного участка } { В графике для модели кинематической волны используется 1-ый приток * } Lr1=94; { км - расстояние до 1 притока (от верхнего створа) * } Lr2=116.5; { км - расстояние до 2 притока } F1=1560; { км2 - площадь водосбора 1 притока * } F2=742; { км2 - площадь водосбора 2 притока } { Задание имен файлов исходных данных } pt=2; { Число притоков } put1='c:\bp\imp\kursovik\'; put2='c:\bp\exp\kursovik\'; name11='Kap2_69'; { для модели водосбора * } name12='jvo2_69'; { для модели водосбора } namef1='Капша - Ерёмина гора 1969'; { * } namef2='Явосьма - Ушаково 1969'; name2='pash2_69'; { для модели руслового стока } namer='Паша - в/с Паречье, н/с Часовенская 1969'; Var { Описание переменных } q, q2, z : array[1..4, 1..n] of real; { Резервирование } R : array[1..n, 0..70] of real; rp : array[1..11,0..100] of real; { массивов } w, i, j, w1, w2, n2, p, w3, sc, nt : byte; { Резервирование } j1, j2 : byte; a1, a2, a, dx, Pr, nx, f, lu1, lu2 : real; k, tau, SSd, tau2, dt : real; name, namef : string; t : text; { переменных } {---------------------------------------------------------------} Begin m1: ClrScr; for sc:=1 to pt do begin { <--- Учет притоков } if sc=1 then begin name:=name11; namef:=namef1; f:=f1; end; if sc=2 then begin name:=name12; namef:=namef2; f:=f2 end; { Организация системы меню } GotoXY(20,5); Writeln('Исследование параметров ',sc:1,'-го притока'); GotoXY(20,7); Writeln(' Модель водосбора '); VMenu(20,9,3,' Детальная оптимизация параметров ', ' Прогноз с заданием параметров ', ' Использовать фактические данные ','','','','', w); if (w=1) or (w=2) then VMenu(20,14,2,' Модель водосбора I порядка ', ' Модель водосбора II порядка ', '','','','','',w1); { Детальная параметризация модели водосбора 1 порядка} if w=1 then Parametr(put1+name+'.prn', { Процедура выполняющая детальную параметризацию. } put2+name+'.rez', { См. модуль Mmatem1} n, 1, F, k, tau, SSd); { Задание произвольных параметров } { Ввод численных значений параметров модели } if (w=2) and (w1=1) then begin ClrScr; GotoXY(20,3); Write(' Введите коэффициент стока: '); Readln(k); GotoXY(20,5); Write(' Введите время добегания: '); Readln(tau); end; if (w=2) and (w1=2) then begin ClrScr; GotoXY(20,3); Write(' Введите k: '); Readln(k); GotoXY(20,5); Write(' Введите тау 1: '); Readln(tau); GotoXY(20,7); Write(' Введите тау 2: '); Readln(tau2); end; { Модель формирования стока (водосбора) } { Импорт исходных данных } Assign(t, put1+name+'.prn'); Reset(t); for j:=1 to n do for i:=1 to 3 do Read(t, q[i,j]); Close(t); if w=3 then goto m4; VMenu(20,10,2,' Прогноз с корректировкой ', ' Прогноз без корректировки ', '','','','','',w2); if w1=1 then begin { Начальные условия } q[4,1]:=q[2,1]; { Модель } for i:=1 to n-1 do begin if w2=1 then q[4,i+1]:=q[2,i]+(k*q[3,i]*F*pk-q[2,i])/tau; if w2=2 then q[4,i+1]:=q[4,i]+(k*q[3,i]*F*pk-q[4,i])/tau; end; end; if w1=2 then begin { Начальные условия} q[4,1]:=q[2,1]; q[4,2]:=q[2,2]; ClrScr; Cursor(False); { Модель } for i:=2 to n-1 do begin if w2=1 then begin a1:=k*q[3,i]*F*pk+(tau+tau2)*q[2,i]- tau*tau2*(q[2,i-1]-2*q[2,i])-q[2,i]; a2:=tau+tau2+tau*tau2; q[4,i+1]:=a1/a2; end; if w2=2 then begin a1:=k*q[3,i]*F*pk+(tau+tau2)*q[4,i]- tau*tau2*(q[4,i-1]-2*q[4,i])-q[4,i]; a2:=tau+tau2+tau*tau2; q[4,i+1]:=a1/a2; end; end; end; { Экспорт данных } Assign(t, put2+name+'.rez'); Rewrite(t); for j:=1 to n do begin for i:=1 to 4 do Write(t, q[i,j]:9:2); Writeln(t); end; Close(t); { Гидрограф и статистика } OP_SSd(put2+name+'.rez', n, 1, SSd); { Оценка прогноза } Gidrograf(namef, put2+name+'.rez', n, { Гидрограф } w1, F, k, tau, tau2, SSd); m4: if sc=1 then for i:=1 to n do begin q2[1,i]:=q[2,i]; { фактический первый приток } q2[2,i]:=q[4,i]; { прогнозный первый приток } end; if sc=2 then for i:=1 to n do begin q2[3,i]:=q[2,i]; { фактический второй приток } q2[4,i]:=q[4,i]; { прогнозный второй приток } end; end; {---------------------------------------------------------------} VMenu(20,15,2,' Вернуться к модели водосбора ', ' Модель кинематической волны ', '','','','','',w1); if w1=1 then goto m1; { Модель кинематической волны } { Импорт исходных данных } m2: Assign(t, put1+name2+'.prn'); Reset(t); for j:=1 to n do for i:=1 to 3 do Read(t, z[i,j]); Close(t); {---------------------------------------------------------------} m3: ClrScr; GotoXY(20,5); Writeln('Модель кинематической волны '); Writeln; GotoXY(10,7); Write('Введите скорость перемещения волны по руслу (км/сут): '); Readln(a); dx:=dL/10; dt:=0.9*dx/a; nt:=round(1/dt); dt:=1/nt; GotoXY(10,9); Write('Шаг по времени в сутках (с корректировкой): ', dt:5:3); GotoXY(10,11); Writeln('Критерий устойчивости: ', (a*dt/dx):5:3); for i:=1 to 11 do rp[i,0]:=(i-1)*(dL/10); { Поиск узла впадения притоков } a1:=7777777; for i:=1 to 11 do if a1>abs(rp[i,0]-Lr1) then begin a1:=abs(rp[i,0]-Lr1); j1:=i; end; a1:=7777777; for i:=1 to 11 do if a1>abs(rp[i,0]-Lr2) then begin a1:=abs(rp[i,0]-Lr2); j2:=i; end; if j1=1 then j1:=2; if j2=1 then j2:=2; { Начальные и граничные условия} for i:=1 to n2 do R[1,i]:=z[2,1]+i*((z[3,1]-z[2,1])/n2); for i:=1 to n do R[i,0]:=z[2,i];} VMenu(20, 14, 2,' Фактический приток ', ' Прогнозный приток ', '','','','','', w); VMenu(20, 19, 2,' Прогноз с корректировкой ', ' Прогноз без корректировки ', '','','','','', w1); {---------------------------------------------------------------} ClrScr; z[4,1]:=z[3,1]; for sc:=1 to n-1 do begin { <--------------------- * ! } { Граничные условия } for i:=1 to nt+1 do rp[1,i]:=z[2,sc]+(i-1)*(z[2,sc+1]-z[2,sc])/nt; { Начальные условия } if (w1=1) and (sc>1) then for j:=2 to 11 do rp[j,1]:=z[2,sc]+(j-1)*(z[3,sc]-z[2,sc])/10 else for j:=2 to 11 do rp[j,1]:=rp[j,nt+1]; { корректировка } if sc=1 then for j:=2 to 11 do rp[j,1]:=z[2,sc]+(j-1)*(z[3,sc]-z[2,sc])/10; for i:=1 to nt do begin for j:=2 to 11 do begin Pr:=0; if (j=j1) and (w=1) then Pr:=q2[1,sc]; if (j=j2) and (w=1) then Pr:=q2[3,sc]; if (j=j1) and (w=2) then Pr:=q2[2,sc]; if (j=j2) and (w=2) then Pr:=q2[4,sc]; rp[j,i+1]:=rp[j,i]+dt*Pr-(a*dt/dx)*(rp[j,i]-rp[j-1,i]); end; end; if (a<=60) and (sc<3) then begin Writeln(sc:1); for i:=1 to nt+1 do begin for j:=1 to 11 do begin Write(rp[j,i]:6:1); end; if i=nt+1 then Writeln(z[3,sc+1]:7:1) else Writeln; end; end; z[4,sc+1]:=rp[11,nt+1]; if (a<=60) and (sc=2) then Pres; end; { <--------------------- * ! } { Экспорт данных } for i:=1 to n do z[1,i]:=z[2,i]; for i:=1 to n do z[2,i]:=z[3,i]; if w=1 then for i:=1 to n do z[3,i]:=q2[1,i]; if w=2 then for i:=1 to n do z[3,i]:=q2[2,i]; Assign(t, put2+name2+'.rez'); Rewrite(t); for j:=1 to n do begin for i:=1 to 4 do Write(t, z[i,j]:9:2); Writeln(t); end; Close(t); OP_SSd(put2+name2+'.rez', n, 1, SSd); { Оценка прогноза } Gidrograf2(namer, put2+name2+'.rez', n, 1, dL, dx, a, SSd); {---------------------------------------------------------------} VMenu(48,21,3,' Вернуться к модели водосбора ', ' К модели кинематической волны ', ' В Ы Х О Д ', '','','','',w1); if w1=1 then goto m1; if w1=2 then goto m2; { Вывод на печать результатов расчета } for i:=1 to n do begin for j:=1 to 4 do begin Write(Lst, q[j,i]:9:2); end; Writeln(Lst,' '); end; End.
|