1. Формулировка задания
Для заданного варианта программы обработки данных, представленной на языке Паскаль, разработать вычислительный алгоритм и варианты программ его реализации на языках программирования Си и Ассемблер. Добиться, чтобы программы на Паскале и Си были работоспособны и давали корректные результаты. Для каждой из разработанных программ (включая исходную программу на Паскале) определить метрические характеристики по Холстеду.
2. Разработка вычислительного алгоритма
Метод наименьших квадратов заключается в том, что функция, заданная набором точек (xi,yi)i=1..n, интерполируется многочленом степениm<nтак, что сумма квадратов расстояний от многочлена до узлов интерполяции была бы наименьшей. Положим, интерполирующий многочлен имеет степень 1, т.е. имеет видf(x) =ax+b.
Сумма квадратов расстояний имеет вид:
Критерий достижения экстремума:
где:
Из (2) получаем:
Проведя подстановку (3) в (1) получим:
Таким образом, мы имеем выражения для расчёта коэффициентов a(4) иb(3) по данным узлов интерполяции.
3. Реализация вычислительного алгоритма
На языке Паскаль алгоритм может быть записан следующим образом:
program cfit1A;
begin
sumx := 0; sumy := 0; sumxy := 0; sumx2 := 0;
for k:=1 to n do begin
sumx := sumx + x[k];
sumy := sumy + y[k];
sumxy := sumxy + x[k] * y[k];
sumx2 := sumx2 + x[k] * x[k];
end;
resa := (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb := (sumy - resa * sumx) / n;
writeln('Approximated with y=ax+b where a = ',resa, ', b=',resb);
end;
На языке Си алгоритм может быть записан аналогичным образом:
main () {
sumx = 0; sumy = 0; sumxy = 0; sumx2 = 0;
for (k=1; k<=n; k++) {
sumx += x[k];
sumy += y[k];
sumxy += x[k] * y[k];
sumx2 += x[k] * x[k];
}
resa = (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb = (sumy - resa * sumx) / n;
cout << "Approximated with y=ax+b where a = " << resa << ", b=" << resb;
}
Запись алгоритма на языке Ассемблера менее тривиальна:
mov word ptr [bp-4],0
mov word ptr [bp-6],0
mov word ptr [bp-8],0
mov word ptr [bp-10],0
mov word ptr [bp-12],0
mov word ptr [bp-14],0
mov word ptr [bp-16],0
mov word ptr [bp-18],0
mov si,1
jmp @4@170
@4@114:mov bx,si
mov cl,2
shl bx,cl
lea ax,word ptr [bp-108]
add bx,ax
fld dword ptr [bx]
fadd dword ptr [bp-6]
fstp dword ptr [bp-6]
mov bx,si
mov cl,2
shl bx,cl
fwait
lea ax,word ptr [bp-188]
add bx,ax
fld dword ptr [bx]
fadd dword ptr [bp-10]
fstp dword ptr [bp-10]
mov bx,si
mov cl,2
shl bx,cl
fwait
lea ax,word ptr [bp-108]
add bx,ax
fld dword ptr [bx]
mov bx,si
mov cl,2
shl bx,cl
lea ax,word ptr [bp-188]
add bx,ax
fmul dword ptr [bx]
fadd dword ptr [bp-14]
fstp dword ptr [bp-14]
mov bx,si
mov cl,2
shl bx,cl
fwait
lea ax,word ptr [bp-108]
add bx,ax
fld dword ptr [bx]
mov bx,si
mov cl,2
shl bx,cl
lea ax,word ptr [bp-108]
add bx,ax
fmul dword ptr [bx]
fadd dword ptr [bp-18]
fstp dword ptr [bp-18]
fwait
inc si
@4@170:cmp si,word ptr [bp-2]
jg @@6
jmp @4@114
@@6: mov ax,word ptr [bp-2]
mov word ptr [bp-28],ax
fild word ptr [bp-28]
fld dword ptr [bp-6]
fmul dword ptr [bp-10]
fdivr
fsubr dword ptr [bp-14]
mov ax,word ptr [bp-2]
mov word ptr [bp-28],ax
fild word ptr [bp-28]
fld dword ptr [bp-6]
fmul dword ptr [bp-6]
fdivr
fsubr dword ptr [bp-18]
fdiv
fstp dword ptr [bp-22]
fwait
mov ax,word ptr [bp-2]
mov word ptr [bp-28],ax
fild word ptr [bp-28]
fld dword ptr [bp-22]
fmul dword ptr [bp-6]
fsubr dword ptr [bp-10]
fdivr
fstp dword ptr [bp-26]