RSS    

   Численное решение модельного уравнения - (реферат)

p>Function Fun_U (Xm, t: real): real; { Функция U (точное решение) } begin

    If SelectFunction=1 then Fun_U: =SQR(Xm)*Xm+SQR(t);

If SelectFunction=2 then Fun_U: =SQR(Xm)*SQR(t)*t+10*Xm*t+SQR(SQR(t))*Xm; If SelectFunction=3 then Fun_U: =Xm*SIN(Xm*t)-4*SQR(Xm)*COS(t); If SelectFunction=4 then Fun_U: =t*EXP(Xm);

    If SelectFunction=5 then Fun_U: =SIN(Xm)+EXP(t);
    end;
    Function Fun_F (Xm, t, a, b, v: real): real; { Функция F }
    begin

if SelectFunction=1 then Fun_F: =2*t-v*6*Xm+a*3*SQR(Xm)-b*(SQR(Xm)*Xm+SQR(t)); if SelectFunction=2 then Fun_F: =3*SQR(Xm)*SQR(t)+10*Xm+4*SQR(t)*t*Xm-v*2*SQR(t)*t+

a*(2*Xm*SQR(t)*t+10*t+SQR(SQR(t)))-b*(SQR(Xm)*SQR(t)*t+10*Xm*t+Xm*SQR(SQR(t))); if SelectFunction=3 then Fun_F: =SQR(Xm)*COS(Xm*t)+4*SQR(Xm)*SIN(t)-v*(2*COS(Xm*t)*t

Xm*SIN(Xm*t)*SQR(t)-8*COS(t))+a*(SIN(Xm*t)+Xm*t*COS(Xm*t)-8*COS(t)*Xm) b*(Xm*SIN(Xm*t)-4*SQR(Xm)*COS(t));

if SelectFunction=4 then Fun_F: =EXP(Xm)-v*(t*EXP(Xm))+a*(t*EXP(Xm))-b*(t*EXP(Xm));

if SelectFunction=5 then Fun_F: =EXP(t)-v*(-SIN(Xm))+a*(COS(Xm))-b*(SIN(Xm)+EXP(t));

    end;

Function Betta_Zero (time: real): real; { Функция Betta[0] для прогонки } begin

If SelectFunction=1 then Betta_Zero: =(h/(Betta_1*h-Alfa_1))*(Alfa_1*3*SQR(x0)+ Betta_1*(SQR(x0)*x0+SQR(time)));

If SelectFunction=2 then Betta_Zero: =(h/(Betta_1*h-Alfa_1))*(Alfa_1*(2*x0*SQR(time)*time+ 10*time+SQR(SQR(time)))+Betta_1*(SQR(x0)*SQR(time)*time+10*x0*time+SQR(SQR(time))*x0)); If SelectFunction=3 then Betta_Zero: =(h/(Betta_1*h-Alfa_1))*(Alfa_1*(SIN(x0*time)+

x0*time*COS(x0*time)-8*x0*COS(time))+Betta_1*(x0*SIN(x0*time)-4*SQR(x0)*COS(time))); If SelectFunction=4 then Betta_Zero: =(h/(Betta_1*h-Alfa_1))*(Alfa_1*(time*EXP(x0))+

    Betta_1*(time*EXP(x0)));

If SelectFunction=5 then Betta_Zero: =(h/(Betta_1*h-Alfa_1))*(Alfa_1*(COS(x0))+ Betta_1*(SIN(x0)+EXP(time)));

    end;

Function U_End (time, Alf, Bet: real): real; { Функция Um для прогонки } begin

If SelectFunction=1 then U_End: =(Alfa_2*h*3*SQR(X)+Betta_2*h*(SQR(X)*X+SQR(time))

    + Bet*Alfa_2)/(Alfa_2-Alf*Alfa_2+h*Betta_2);

If SelectFunction=2 then U_End: =(Alfa_2*h*(2*X*SQR(time)*time+10*time+SQR(SQR(time)))+ Betta_2*h*(SQR(X)*SQR(time)*time+10*X*time+SQR(SQR(time))*X) +Bet*Alfa_2)/(Alfa_2-Alf*Alfa_2+h*Betta_2);

If SelectFunction=3 then U_End: =(Alfa_2*h*(SIN(X*time)+X*time*COS(X*time)-8*X*COS(time))+ Betta_2*h*(X*SIN(X*time)-4*SQR(X)*COS(time))+Bet*Alfa_2)/(Alfa_2-Alf*Alfa_2+h*Betta_2); If SelectFunction=4 then U_End: =(Alfa_2*h*(time*EXP(X))+Betta_2*h*(time*EXP(X))+Bet*Alfa_2)/ (Alfa_2-Alf*Alfa_2+h*Betta_2);

If SelectFunction=5 then U_End: =(Alfa_2*h*(COS(X))+Betta_2*h*(SIN(X)+EXP(time))+Bet*Alfa_2)/ (Alfa_2-Alf*Alfa_2+h*Betta_2);

    end;
    Procedure PrintArray; { Процедура печати массива U }
    begin

WriteLn; For m: =0 to Kol_voX do begin Write(U_m[m]: 15: 4); Write(U, U_m[m]: 15: 4); end;

    WriteLn; WriteLn(U);
    end;
    { Основная программа }
    Begin
    Assign(U, 'u'); { Файл для записи значений функции }
    Rewrite(U); { Открытие файла для записи }
    TextBackGround(0); { Выбор функции для работы }

ClrScr; TextColor(10); GoToXY(20, 8); Write('Введите номер выбранной функции (1-5): ');

    Metka1: ch: =ReadKey;
    If ch='1' then SelectFunction: =1
    else If ch='2' then SelectFunction: =2
    else If ch='3' then SelectFunction: =3
    else If ch='4' then SelectFunction: =4
    else If ch='5' then SelectFunction: =5
    else
    begin
    Sound(400); Delay(100); NoSound; GoTo Metka1;
    end;

GoToXY(59, 8); TextColor(12); WriteLn(SelectFunction); TextColor(11); GoToXY(11, 12);

Write('Вы будете работать со стандартными параметрами (цифра ~1~)'); GoToXY(22, 13); Write('или введете свои данные (цифра ~2~) ? '); Metka2: ch: =ReadKey;

    If ch='1' then Data: =1
    else If ch='2' then Data: =2
    else
    begin
    Sound(400); Delay(100); NoSound; GoTo Metka2;
    end;
    TextBackGround(9); TextColor(10); ClrScr;
    { Ввод начальных данных }

WriteLn; WriteLn('-------------------------------- Ввод данных ---------------------------------¬');

    For k: =1 do 21 do WriteLn('¦ ¦');

WriteLn('L------------------------------------------------------------------------------'); TextColor(15); Window(3, 3, 77, 23); Write(' Введите область рассчета по X от: ');

    If Data=1 then
    begin
    x0: =0; Write(x0: 1: 0); WriteLn;
    end
    else ReadLn(x0);
    Write(' до: ');
    If Data=1 then
    begin
    X: =1; Write(X: 1: 0); WriteLn;
    end
    else ReadLn(X);

WriteLn; Write(' Введите количество разбиений по направлению X: '); If Data=1 then begin Kol_voX: =30; Write(Kol_voX: 2); WriteLn; end else ReadLn(Kol_voX);

WriteLn; WriteLn; Write(' Введите область рассчета по времени от: '); If Data=1 then begin t0: =0; Write(t0: 1: 0); WriteLn; end else ReadLn(t0); Write(' до: ');

If Data=1 then begin T: =1; Write(T: 1: 0); WriteLn; end else ReadLn(T); WriteLn; Write(' Введите количество разбиений по времени: '); If Data=1 then begin Kol_voT: =30; Write(Kol_voT: 2); WriteLn; end else ReadLn(Kol_voT);

WriteLn; WriteLn; WriteLn(' Введите коэффициенты'); Write(' a='); If Data=1 then begin a: =1; Write(a: 1: 0); WriteLn; end else ReadLn(a); Write(' b=');

If Data=1 then begin b: =1; Write(b: 1: 0); WriteLn; end else ReadLn(b); Write(' v=');

If Data=1 then begin v: =0. 001; Write(v: 1: 3); WriteLn; end else ReadLn(v); Write(' Alfa-1=');

If Data=1 then begin Alfa_1: =1; Write(Alfa_1: 1: 0); WriteLn; end else ReadLn(Alfa_1);

    Write(' Betta-1=');

If Data=1 then begin Betta_1: =1; Write(Betta_1: 1: 0); WriteLn; end else ReadLn(Betta_1);

    Write(' Alfa-2=');

If Data=1 then begin Alfa_2: =1; Write(Alfa_2: 1: 0); WriteLn; end else ReadLn(Alfa_2);

    Write(' Betta-2=');

If Data=1 then begin Betta_2: =1; Write(Betta_2: 1: 0); WriteLn; TextColor(14); Write(' Нажмите любую клавишу'); ReadKey; end else ReadLn(Betta_2); { Интерфейс экрана при выдаче результата }

TextBackGround(3); TextColor(1); Window(1, 1, 80, 25); ClrScr; WriteLn; WriteLn('г===================== Результат ==========================¬'); For k: =1 to 21 do

    WriteLn('¦ ¦');

WriteLn('===================================================================-'); TextColor(0); TextBackGround(7); GoToXY(2, 23);

WriteLn(' Для продолжения нажмите любую клавишу'); TextBackGround(3); Window(3, 4, 77, 22);

    TextColor(15); ClrScr;
    { Вычесление шага сетки }
    tau: =(T-t0)/Kol_voT; h: =(X-x0)/Kol_voX;
    { Ввод данных при time=t0 }
    For m: =0 to Kol_voX do
    begin
    Xm: =x0+h*m; U_m[m]: =Fun_U(Xm, t0);
    end;

TextColor(14); WriteLn('Время равно ', time: 3: 3); TextColor(15); WriteLn(U, 'Время равно ', time: 3: 3);

    PrintArray;
    { Начало рассчета }
    time: =t0;
    Repeat
    time: =time+tau;

WriteLn; TextColor(14); WriteLn('Время равно ', time: 3: 3); TextColor(15); WriteLn(U, 'Время равно ', time: 3: 3);

    { 1 этап. Решается методом скалярной прогонки }
    a_progonka: =(-2*v-a*h)/(2*SQR(h));
    b_progonka: =(SQR(h)+2*v*tau-b*tau*SQR(h))/(SQR(h)*tau);
    c_progonka: =(a*h-2*v)/(2*SQR(h));

Alfa[0]: =Alfa_1/(Alfa_1-Betta_1*h); Betta[0]: =Betta_Zero(time); For m: =1 to Kol_voX-1 do

    begin
    Alfa[m]: =-c_progonka/(a_progonka*Alfa[m-1]+b_progonka);

Betta[m]: =(Fun_F(x0+m*h, time+tau, a, b, v)+U_m[m]/tau-a_progonka*Betta[m-1])/ (a_progonka*Alfa[m-1]+b_progonka);

    end;

U_[Kol_voX]: =U_End(time, Alfa[Kol_voX-1], Betta[Kol_voX-1]);

For m: =Kol_voX-1 downto 1 do U_[m]: =Alfa[m]*U_[m+1]+Betta[m]; U_[0]: =Alfa[0]*U_[1]+Betta[0]; { 2 этап, часть первая. Решается методом скалярной прогонки } a_progonka: =(-2*v-a*h)/(2*SQR(h));

    b_progonka: =(2*SQR(h)+2*v*tau-b*tau*SQR(h))/(SQR(h)*tau);
    c_progonka: =(a*h-2*v)/(2*SQR(h));

Alfa[0]: =Alfa_1/(Alfa_1-Betta_1*h); Betta[0]: =Betta_Zero(time); For m: =1 to Kol_voX-1 do

    begin
    Alfa[m]: =-c_progonka/(a_progonka*Alfa[m-1]+b_progonka);

Betta[m]: =(Fun_F(x0+m*h, time+tau/2, a, b, v)+2*U_m[m]/tau-a_progonka*Betta[m-1])/ (a_progonka*Alfa[m-1]+b_progonka);

    end;

_U_1_2[Kol_voX]: =U_End(time, Alfa[Kol_voX-1], Betta[Kol_voX-1]); For m: =Kol_voX-1 downto 1 do _U_1_2[m]: =Alfa[m]*_U_1_2[m+1]+Betta[m]; _U_1_2[0]: =Alfa[0]*_U_1_2[1]+Betta[0];

{ 2 этап, часть вторая. Решается методом скалярной прогонки } a_progonka: =(-2*v-a*h)/(2*SQR(h));

    b_progonka: =(2*SQR(h)+2*v*tau-b*tau*SQR(h))/(SQR(h)*tau);
    c_progonka: =(a*h-2*v)/(2*SQR(h));

Alfa[0]: =Alfa_1/(Alfa_1-Betta_1*h); Betta[0]: =Betta_Zero(time); For m: =1 to Kol_voX-1 do

    begin
    Alfa[m]: =-c_progonka/(a_progonka*Alfa[m-1]+b_progonka);

Betta[m]: =(Fun_F(x0+m*h, time+tau, a, b, v)+2*_U_1_2[m]/tau-a_progonka*Betta[m-1])/ (a_progonka*Alfa[m-1]+b_progonka);

    end;

_U_1[Kol_voX]: =U_End(time, Alfa[Kol_voX-1], Betta[Kol_voX-1]); For m: =Kol_voX-1 downto 1 do _U_1[m]: =Alfa[m]*_U_1[m+1]+Betta[m]; _U_1[0]: =Alfa[0]*_U_1[1]+Betta[0];

    { 3 этап. Окончательное значение }
    For m: =0 to Kol_voX do
    U_m[m]: =2*_U_1[m]-U_[m];

PrintArray; { Вывод результата на экран и его запись в файл } For m: =0 to Kol_voX do { Рассчет точного значения функции } begin z[m]: =Fun_U(x0+m*h, time); end;

    { Вывод ошибки расчета на экран и в файл }
    Error: =0;
    For m: =0 to Kol_voX do
    begin
    a: =Abs(U_m[m]-z[m]); If Error    end;

WriteLn; TextColor(4); WriteLn('Максимальная ошибка для этого времени равна ', Error: 10: 7);

TextColor(15); WriteLn(U, 'Максимальная ошибка для этого времени равна ', Error: 15: 13);

    WriteLn(U); ReadKey;
    Until time>T;
    Close(U); { Закрытие файла с результатами }
    End.

Страницы: 1, 2


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.