procedure Create_BC(n,m:integer; var x,y:vect1; var c:matr; var b:vect);
var i,j:integer;
r:vect;
begin
for i:=1 to n do
r[i]:=1;
for j:=1 to m+1 do begin
c[1,j]:=0;
b[j]:=0;
for i:=1 to n do begin
c[1,j]:=c[1,j]+r[i];
b[j]:=b[j]+r[i]*y[i];
end;
for i:=1 to n do
r[i]:=r[i]*x[i];
end;
for i:=1 to m do begin
for j:=1 to m do
c[i+1,j]:=c[1,j+1];
c[i+1,m+1]:=0;
for j:=1 to n do
c[i+1,m+1]:=c[i+1,m+1]+r[j];
for j:=1 to n do
r[j]:=r[j]*x[j];
end;end;
begin
assign(f1,'jan.dat');reset(f1);
assign(f2,'jan.res');rewrite(f2);
readln(f1,n);writeln(f2,'Число узлов аппроксимации n=',n:3);
readln(f1,m);writeln(f2,'Степень многочлена m=',m:2);
writeln(f2,'Вектор узлов аппроксимации x[i]');
for i:=1 to n do begin
read(f1,x[i]);
write(f2,x[i]:4:2,' ');
end;
writeln(f2);
writeln(f2,'Вектор значений аппроксимируемой функции y[i]');
for i:=1 to n do begin
read(f1,y[i]);
write(f2,y[i]:4:2,' ');
end;
Create_BC(n,m,x,y,c,b);
writeln(f2);
writeln(f2,'Матрица системы линейных уравнений для аппроксимации и вектор правых частей);
for i:=1 to m+1 do begin
for j:=1 to m+1 do
write(f2,c[i,j]:8:1);writeln(f2,b[i]:8:1);end;
gauss(m+1,c,b,a);
for i:=1 to n do begin
z[i]:=0;
for j:=m+1 downto 1 do
z[i]:=z[i]*x[i]+a[j];
z[i]:=z[i]-y[i];end;
writeln(f2);
writeln(f2,'Вектор коэфициентов аппроксимирующего многочлена по возрастанию);
writeln(f2,'степени (m+1 элементов)');
for i:=1 to m+1 do
writeln(f2,'a[',i:1,']=',a[i]:6:2);
writeln(f2,'Вектор погрешности аппроксимации в узлах X);
for i:=1 to n do
writeln(f2,'z[',i:1,']=',z[i]:5:3);
close(f1);close(f2);
end.
Исходный файл jan.dat:
10
2
1 6 0 3 8 2 12 9 2 5
9 4 13 7 3 9 3 1 4 2
Файл результатов jan.res:
Число узлов аппроксимации n=10
Степень многочлена m=2
Вектор узлов аппроксимации x[i]
1.00 6.00 0.00 3.00 8.00 2.00 12.00 9.00 2.00 5.00
Вектор значений аппроксимируемой функции y[i]
9.00 4.00 13.00 7.00 3.00 9.00 3.00 1.00 4.00 2.00
Матрица системы линейных уравнений для аппроксимации и вектор правых частей
10.0 48.0 368.0 55.0
48.0 368.0 3354.0 159.0
368.0 3354.0 33428.0 1023.0
Вектор коэфициентов аппроксимирующего многочлена по возрастанию степени (m+1 элементов)
a[1]= 11.66
a[2]= -2.31
a[3]= 0.13
Вектор погрешности аппроксимации в узлах X
z[1]=0.479
z[2]=-1.381
z[3]=-1.343
z[4]=-1.070
z[5]=-1.247
z[6]=-1.430
z[7]=-0.244
z[8]=0.723
z[9]=3.570
z[10]=1.454
5.1 Список переменных основной программы.
В основной программе используются раздел констант и типов:
const nm=20;
type vect1=array[1..nm] of real;
Следующие переменные так же используются в программе, которые описываются в разделе var:
Переменная | Тип переменной | Описание переменной |
С | matr | Матрица системы линейных уравнений для аппроксимации |
А | vect | Вектор коэфициентов аппроксимирующего многочлена по возрастанию степени (m+1 элементов) |
Х | vect1 | Вектор узлов аппроксимации |
B | vect | Вектор правых частей |
Y | vect1 | Вектор значений аппроксимирующей функции |
Z | vect | Вектор погрешности аппроксимации в узлах Х |
n | integer | Число узлов аппроксимации |
m | integer | Степень многочлена |
i | integer | Необходима для нумерации элементов массивов. |
j | integer | Необходима для нумерации элементов массивов. |
f1 | text | Файловая переменная для файла исходных значений |
f2 | text | Файловая переменная резуртирующего файла |
6.1 Заголовки процедур и функций. Список их переменных.
В своей программе я использовал следующие модули, которые описываются в операторе uses и процедуры:
Crt - стандартный модуль подключения экрана и клавиатуры для работы с программой.
Gauss - процедура решения системы линейных уравнений методом Гаусса. Она берется из модуля Gausstpu, где интерфейсная часть имеет вид:
Interface
Const nmax=20
Type
Поэтому при объявлении матрицы С ссылаться надо на matr, а векторов A и B на vect.
Create_BC - процедура расчета матрицы С (С - матрица системы линейных уравнений для аппроксимации). Заголовок этой процедуры выглядит так:
procedure Create_BC(n,m:integer; var x,y:vect1; var c:matr; var b:vect);
var i,j:integer;
r:vect;
А вот такие переменные используются только в этой процедуре, остальные засылаются из основной программы:
Переменная | Тип переменной | Описание переменной |
i | integer | Используются в циклах для перебора численных значений |
j | integer | Используются в циклах для перебора численных значений |
R | vect | Рабочий вектор |
7.1 Ручной счет.
Составляем матрицу системы уравнений по следующему принципу:
n | Sxi | Sxi2 | Syi |
Sxi | Sxi2 | Sxi3 | Sxiyi |
Sxi2 | Sxi3 | Sxi4 | Sxi2yi |
Для этого вычисляем необходимые значения:
n=10;
Sxi=1+6+0+3+8+2+12+9+2+5=48;
Sxi2=12+62+02+32+82+22+122+92+22+52=368;
Syi=9+4+13+7+3+9+3+1+4+2=55;
Sxi3=13+63+03+33+83+23+123+93+23+53=3354;
Sxiyi=1*9+6*4+0*13+3*7+8*3+2*9+12*3+9*1+2*4+5*2=159;
Sxi3=14+64+04+34+84+24+124+94+24+54=33428;
Sxi2yi=12*9+62*4+02*13+32*7+82*3+22*9+122*3+92*1+22*4+52*2=1023.
Получается следующая матрица:
10 | 48 | 368 | 55 |
48 | 368 | 3354 | 159 |
368 | 3354 | 33428 | 1023 |
Которая эквивалентна такой системе уравнений:
10 | 48 | 368 | 55 |
0 | 137,6 | 1587,6 | -105 |
0 | 1587,6 | 19885,6 | -1001 |
10 | 48 | 368 | 55 |
0 | 137,6 | 1587,6 | -105 |
0 | 0 | 1568,203488 | 210.4680233 |
Получаемупрощенную систему уравнений:
a11x1 + a12x2 + … + a1nxn£ b1 |
…………………………….……………………. |
am1x1 + am2x2 + … + amnxn£ bm |
xj³ 0, (j=1,…,n). |