Скачиваний:
24
Добавлен:
01.05.2014
Размер:
119.81 Кб
Скачать

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]