1.2. ВыЧислительный алгоритм, процедуры и формальные параметры
Обращает на себя внимание наличие в формулах дляАиВконструкций типаи. Поэтому для вычисления значений этих сумм следует заранее предусмотреть процедуры-функции:
function sumX (n,k:integer; x: mas1) : real;
var ss : real; i : integer;
begin
ss := 0.0;
for i := 1 to n do
case k of
1: ss := ss+x[i];
2: ss := ss + sqr(x[i]);
end;
sumX := ss;
end.
Формальные параметры процедуры. Входные:N(типinteger) - общее число точек, которые суммируем;К(типinteger) - параметр, определяющий тип суммирования: К= 1 - суммируем первые степенихi;К= 2 - суммируем квадраты чиселхi.Выходной:процедура возвращает число (типreal), равное искомой сумме.
function sumXY (n,k:integer; x,y: mas1) : real;
var ss : real; i : integer;
begin
ss := 0.0;
for i := 1 to n do
ss := ss+x[i]*y[i];
sumXY := ss;
end.
Формальные параметры процедуры. Входные:N(типinteger) - общее число точек, которые суммируем;К(типinteger) - параметр, определяющий тип суммирования:К= 1 - суммируем произведение первых степенейхiнауi.Выходной:процедура возвращает число (типreal), равное искомой сумме.
В параграфах этой главы предложенные процедуры будут модифицироваться за счет включения в оператор САSЕ новых вариантов конструкций сумм.
Теперь, используя предложенные процедуры-функции, можно определить процедуры, выполняющие вычисления неизвестных параметров АиВ. Заметим, что все вычисления можно было бы свести к одной процедуре, но для ясности изложения было решено составить для каждого варианта вычисления свою.
Метод выбранных точек приВ = 0 настолько прост, что вычислительная процедура не составляется.
Метод средних и метод наименьших квадратов. Pаботой функции управляет параметрК,который приК = 1 вызывает определениеАметодом средних, а приК = 2 - методом наименьших квадратов.
function a (n : integer; x,y : mas1; k : integer) : real;
var s : real;
begin
case k of
1: s := sumX (N,1,Y) / sumX (N,1,X);
2: s := sumXY(N,1,X,Y) / sumX (N,2,X);
end;
a := s;
end.
{ **** Метод выбранных точек для А ¹ 0; В ¹ 0*** }
pocedure ab1 (x1,y1,x2,y2 : real; var a,b : real;
var k : integer);
begin
if abs(x2-x1)<1.0e-10 then
begin
k := 1;
exit;
end;
a := (y2-y1) / (x2-x1);
b := -a*x1 + y1; k := 0;
end.
{ **** Метод средних для А № 0; В № 0 **** }
procedure ab2 (n:integer; x,y:mas1;
var a,b : real);
var x1,y1:mas1; l,i : integer; s1, s2, s3, s4 : real;
begin l := n div 2;
for i := l+1 to n do
begin x1[i-l] := x[i]; y1[i-l] := y[i];
end;
s1 := sumX (l,1,y);
s2 := sumX (n-l,1,y1);
s3 := sumX (l,1,x);
s4 := sumX (n-l,1,x1);
a := (l*s2 - (n-l)*s1) / (l*s4 + (n-l)*s3);
b := s1/l - a*s3 /l;
end.
{****Метод наименьших квадратов для А № 0; В № 0 ****}
procedure ab3 (n:integer; x,y:mas1;
var a,b:real);
var s1, s2,s3, s4 : real;
begin
s1 := sumX(n,1,x);
s2 := sumX (n,1,y);
s3 := sumXY(n,1,x,y);
s4 := sumX(n,2,x);
a := (n*s3 - s1*s2) / (n*s4- s1*s1);
b := (s2 - a*s1) / n;
end.