END.
Begin
Begin
Begin
Begin
BEGIN
Begin
Begin
Begin
BEGIN
Var
Begin
BEGIN
Var
Begin
BEGIN
Var
Var
Type
Const
Пример 3.1.
{$N+,E+,F+}
PROGRAM MetNKv;
{Аппроксимация функции по методу наимньших квадрвтов}
{Полиномом заданной степени}
Uses CRT;
N=21; {Количество заданных точек кривой намагничивания}
{NN=4;} {Степень полинома}
NameInt = 'mnk.inp'; {Имя файла с данными}
NameOut = 'mnk4-pu.out';} {Имя выходного файла
RealType = Extended; {базовый вещественный тип}
IntType = Integer; {базовый целый тип}
Vec = Array [1..N] of RealType;
TypeS = Array [1..28] of RealType;
TypeA = Array [1..29,1..29] of RealType;
TypeB = Array [1..29] of RealType;
TypeBool = Boolean;
{Глобальные переменные}
S: TypeS;
h,SS,OS,AS: RealType;
Y,X: Vec;
B,P: TypeB;
A: TypeA;
Flag: TypeBool;
F1, F2: Text;
i, j, k, NN: IntType;
Procedure KoeffA(NN: IntType; Var S: TypeS);
{Вычисление коэффициентов матрицы A}
i, j: IntType;
For j:=1 to 2*NN do
S[j]:=0;
For i:=1 to N do
S[j]:= S[j] + exp(j*ln(X[i]));
end;
END; {KoeffA}
Procedure KoeffB(NN,N: IntType; Y,X: Vec;Var B: TypeB);
{Вычисление правой части системы уравнений B}
|
|
i, j: IntType;
For j:=1 to NN+1 do
B[j]:=0;
For i:=1 to N do
B[j]:= B[j] + Y[i]*exp((j-1)*ln(X[i]));
end;
END;{KoeffB}
Procedure GaussKlass(N: IntType; A: TypeA; B: TypeB; Var X: TypeB);
{Решение системы уравнений классическим методом Гаусса}
{Прямой ход исключения переменных}
i, j, k: IntType;
For i:= 1 to N-1 do
For j:= i+1 to N do
A[j,i]:= -A[j,i]/A[i,i];
For k:= i+1 to N do
A[j,k]:= A[j,k] + A[j,i]*A[i,k];
B[j]:= B[j] + A[j,i]*B[i];
end;
end;
{Обратный ход: последовательное нахождение корней}
X[N]:= B[N]/A[N,N];
For i:= N downto 1 do
h:= B[i];
For j:= i+1 to N do h:= h - A[i,j]*X[j];
X[i]:= h/A[i,i];
end;
END; {GaussKlass}
{Головная программа}
ClrScr;
WriteLn;
Write('Введите степень полинома, NN = ');
ReadLn(NN);
Assign(F1,NameInt);
Reset(F1);
For i:=1 to N do Read(F1,X[i]);
For i:=1 to N do Read(F1,Y[i]);
Assign(F2,NameOut);
Rewrite(F2);
WriteLn(F2);
{Вычисление коэффициентов матрицы A}
KoeffA(NN,S);
WriteLn(F2,'МАТРИЦА СИСТЕМЫ УРАВНЕНИЙ A:');
{Заполнение коэффициентов матрицы}
For i:=1 to NN+1 do
For j:=1 to NN+1 do A[i,j]:=S[i+(j-2)];
A[1,1]:= N;
end;
For i:=1 to NN+1 do
For j:=1 to NN+1 do Write(F2,A[i,j]);
WriteLn(F2);
end;
WriteLn(F2);
WriteLn(F2,'ВЕКТОР-СТОЛБЕЦ ПРАВОЙ ЧАСТИ B:');
{Вычисление правой части системы уравнений B}
KoeffB(NN,N,Y,X,B);
For j:=1 to NN+1 do WriteLn(F2, B[j]);
WriteLn(F2);
GaussKlass(NN+1,A,B,P);
WriteLn(F2);
WriteLn(F2,'КОЭФФИЦИЕНТЫ ПОЛИНОМА ',NN:2,' СТЕПЕНИ:');
j:=0;
For i:=1 to NN+1 do
WriteLn(F2,'P',j,'=',P[i],' ');
j:= j+1;
end;
WriteLn(F2);
WriteLn(F2);
WriteLn(F2,'ТАБЛИЦА ЗНАЧЕНИЙ');
WriteLn(F2,' N ',' ЗНАЧ.АРГ.',' ИСТ.ЗН.ФУНК.', ' АПП.ЗН.ФУНК.',' АБС.ПОГР.', ' ОТН. ПОГР.');
WriteLn(F2,' ',' X ',' Y ', ' Y* ',' (Y-Y*) ', ' (Z) ');
SS:=0;
For i:=1 to N do
{Значения аппроксимированной функции}
h:=0;
For j:=1 to NN+1 do
h:= h + P[j]*exp((j-1)*ln(X[i]));
{Абсолютная погрешность}
AS:= Abs(Y[i] - h);
{Относительная погрешность}
OS:= Abs(AS/Y[i])*100;
SS:= SS + AS*AS;
WriteLn(F2,i:3,' ',X[i]:8:2,' ',Y[i]:9:3,' ',h:11:4,' ',AS:9:5,' ',OS:9:5);
end;
{Среднеквадратическое отклонение}
SS:=Sqrt(SS/(N-1));
WriteLn(F2);
WriteLn(F2,'СРЕДНЕКВАДРАТИЧЕСКОЕ ОТКЛОНЕНИЕ:',SS);
Close(F1);
Close(F2);
ClrScr;{Очищает экран, модуль Crt}
|
|
const nmax=25;
Var x,y:array[1..nmax] of real;
sx,sy,sxy,sx2,a,b:real;
i,n:integer;