- •Содержание
- •3.1. Аппроксимация данных методом наименьших квадратов 11
- •1. Решение систем линейных алгебраических уравнений
- •1.1. Классический метод Гаусса
- •1.2. Метод Гаусса с выбором главного элемента
- •2. Метод Ньютона для снау
- •2.1. Вариант 1
- •2.2. Вариант 2
- •I, n : IntType;
- •X,y,x0,y0 : RealType;
- •3. Аппроксимация данных методом наименьших квадратов
- •3.1. Аппроксимация данных методом наименьших квадратов
- •3.2. Аппроксимация данных с другими нормами
- •3.3. Аппроксимация данных многочленом заданной степени
- •Var X,y:array[1..Nmax] of real;
- •I,n:integer;
- •4. Решение систем дифференциальных уравнений
- •4.1. Метод Эйлера
- •4.2. Методы Рунге-Кутта
- •Проверка выполнения программы
- •X, h: RealType;
- •I, j : IntType;
- •X : RealType;
- •I, j, k : IntType;
Проверка выполнения программы
Как видно из проверки, результаты таблицы совпадают с результатами вычислений. Следовательно, программа выполнена правильно.
Пример 4.1.
{Решение диф. уравнения методом Рунге-Кутта 4-го порядка}
Program Runge;
Const Y1 = 0.0; (* начальное значение функции *)
Y2 = 1./9.; (* начальное значение производной *)
Xbgn = 0.0; (* начало отрезка интегрирования *)
Xend = 3.0; (* конец отрезка интегрирования *)
shag = 0.1; (* шаг интегрирования *)
eps = 0.0001;(* погрешность*)
Type
IntType = Integer; {базовый целый тип}
RealType = Real; {базовый вещественный тип}
Vec = Array [1..2] of RealType; {векторный тип}
Var
X, h: RealType;
Y : Vec;
Out : Text;
Procedure Proizvod (x : RealType ; Var Y,F : Vec) ;
{Подпрограмма вычисления производных}
Begin
F[1]:= Y[2];
F[2]:= - 0.08*Exp(-2.5*x);
End ; {Proisvod}
Procedure Roonge_Koott (N : IntType; x, h: RealType ; Var Y : Vec ) ;
{Реализация метода Рунге-Кутта 4-го порядка}
{N - порядок системы уравнений}
Var
I, j : IntType;
H1, H2, Q : RealType;
Y0, Y1, F : Vec;
Begin
H1:= 0.0;
H2:= h/2.0;
For i:= 1 to N do
begin
Y0[i]:= Y[i];
Y1[i]:= Y[i];
end;
For j:= 1 to 4 do
begin
Proizvod(x+H1,Y,F);
If j = 3 Then H1:= h
else H1:= H2;
For i:= 1 to N do
begin
Q:= H1 * F[i];
Y[i]:= Y0[i] + Q;
If j = 2 Then Q:= 2 * Q;
Y1[i]:= Y1[i] + Q/3.0;
end;
end;
For i:= 1 to N do Y[i]:= Y1[i];
End ;
Begin
Assign(Out,'D:\FORTRAN\PRAC_F77\СИДНЕНКО\runge-4p.rez'); Rewrite(Out);
WriteLn(Out,'┌───────────┬───────────┬───────────┐');
WriteLn(Out,'│ * X * │* Y1-fun * │* Y2-pro * │');
WriteLn(Out,'├───────────┼───────────┼───────────┤');
Y[1]:= Y1;
Y[2]:= Y2;
x:= Xbgn;
h:= shag;
While (x <= Xend) and (h > 0.0) do
begin
WriteLn(Out,'│ ',x:7:4,' │ ',Y[1]:7:4,' │ ',Y[2]:7:4,' │');
Roonge_Koott (2, x, h, Y) ;
x:= x + h;
end;
WriteLn(Out,'└───────────┴───────────┴───────────┘');
Close(Out);
end.
Пример 4.2.
{$N+}
{Решение диф. уравнения методом Рунге-Кутта 4-го порядка}
Program Run_pas;
Const
A = 0.16;
Xbgn = 0.0; { начало отрезка интегрирования }
Xend = 3.0; { конец отрезка интегрирования }
eps = 0.1E-6; { погрешность }
N = 2; { порядок системы диф. уравнений }
h = 0.1; { шаг интегрирования }
Y10 = 0.0; { начальное значение функции }
Y20 = 1./17; { начальное значение производной }
Constant: Array[1..4] of Real=(0, 0.5, 0.5, 1.0);
{NameOut = 'run-p.out';}
NameOut = 'D:\FORTRAN\PRAC_F77\Var_Tkal\Runge\run-p.out';
Type
IntType = LongInt; {базовый целый тип}
RealType = Extended; {базовый вещественный тип}
Vec = Array [1..2] of RealType; {векторный тип}
TypeKoeff= Array [0..4,1..2] of RealType;
Var
M : IntType;