Program Vibration;
uses crt,gra1;
Const
time_end=6.0;
{Задание числа отрезков разбиения области решения}
N=200;
{Расчет шага интегрирования по пространству}
h=1/N;
{Задание числа Куранта}
C=1.0;
{Расчет шага по времени из условия устойчивости}
tau=C*h;
Var
i,nt:integer;
U1,U,U0,X:array [0..N] of real;
time:real;
FirstStep:Boolean;
Begin
{Расчет координат узлов по пространству разностной сетки}
for i:=0 to N do X[i]:=h*i;
{Задание начального смещения}
for i:=0 to N do U[i]:=sin(Pi*X[i]);
time:=0; nt:=1;
{Построение координатных осей}
CoordOs(0,time_end,10,-1,1,10,'Time','U');
{Установление графического курсора в начальную точку}
FirstRis; Ris(time,U[N div 2],13);
FirstStep:=true;
while time<=time_end do begin
{Вычисление смещения в граничных точках на верхнем временном слое}
U1[0]:=0.0;
If FirstStep Then
U1[N]:=C*C*U[N-1]+(1.0-C*C)*U[N]
Else
U1[N]:=-U0[N]+2*C*C*U[N-1]+2*(1.0-C*C)*U[N];
{Вычисление смещений во внутренних точках на верхнем временном слое}
for i:=1 to N-1 do
If FirstStep Then
U1[i]:=0.5*C*C*U[i-1]+(1.0-C*C)*U[i]+0.5*C*C*U[i+1]
Else
U1[i]:=-U0[i]+C*C*U[i-1]+2*(1.0-C*C)*U[i]+C*C*U[i+1];
{Присвоение переменным U, хранящим значения функции
на старом временном слое, значений функции на новом временном слое}
for i:=0 to N do begin U0[i]:=U[i];U[i]:=U1[i] end;
time:=time+tau;
{Графический вывод смещений в середине струны}
Ris(time,U[N div 2],13);
FirstStep:=false;
end;
repeat
until keypressed;
end.
Результат решения приведен на рис.7.
Рис.7.