- •2007 Г.
- •1. Формулировка задания
- •2. Разработка вычислительного алгоритма
- •3. Реализация вычислительного алгоритма
- •3.1 Язык Паскаль
- •Преобразованная программа:
- •3.2 Язык c
- •Преобразованная программа:
- •3.3 Язык Assembler
- •Преобразованная программа:
- •4. Расчёт метрических характеристик
- •4.1 Язык Паскаль
- •4.2 Язык c
- •4.3 Язык Assembler
- •4. Выводы
2. Разработка вычислительного алгоритма
Программа 15. Приближенная линеаризация опытных данных.
Линеаризация (от лат. linearis — линейный), один из методов приближённого представления замкнутых нелинейных систем, при котором исследование нелинейной системы заменяется анализом линейной системы, в некотором смысле эквивалентной исходной. Методы Л. имеют ограниченный характер, т. е. эквивалентность исходной нелинейной системы и её линейного приближения сохраняется лишь при определённом «режиме» работы системы, а если система переходит с одного режима работы на другой, то следует изменить и её линеаризированную модель. Применяя линеаризацию, можно выяснить многие качественные и особенно количественные свойства нелинейной системы.
Алгоритм:
Даны множества XиY, состоящие соответственно из элементовxiиyi.
Требуется линеаризовать функциюX->Y.
После линеаризации должна получиться новая функцияX->Y1.
n m
1) Найдём ∑xiи ∑yi, гдеnиm– размерности множествXиYсоответственно (n=m)
i=0 i=0
n n n
2) Вычислим ∑(xi*yi), ∑(xi*xi) и ∑(yi*yi)
i=0 i=0 i=0
3) Рассчитаем коэффициенты: sxx= ∑(xi*xi) – (∑xi)2/n
sxy= ∑(xi*yi) – (∑xi* ∑yi) /n
syy= ∑(yi*yi) – (∑yi)2/n
4) И теперь получим окончательные коэффициенты линеаризации:
a:=(( ∑(xi*xi) * ∑yi - ∑xi * ∑(xi*yi)) / n) / sxx;
b = sxy / sxx;
5) На заключительном этапе вычислим значения линеаризованого y1:y1 =a+b*x.
3. Реализация вычислительного алгоритма
3.1 Язык Паскаль
Для оценки качества программы, исключим комментарии и операторы ввода / вывода.
Кроме того, исключим неиспользуемые переменные. Модифицируем программу и закончим то, что не было закончено в начальной версии программы. Операторы ввода заменим константами и генерацией случайных чисел. На данном этапе другие улучшения программы производиться не будут.
Преобразованная программа:
program pLinear;
const n = 8;
type ary = array[1..n]of real;
var x,y,y_calc : ary;
i : integer;
a,b : real;
procedure linfit1(x,y: ary;
var y_calc: ary;
var a,b: real;
n: integer);
var i : integer;
sum_x,sum_y,sum_xy,sum_x2,
sum_y2,xi,yi,sxy,sxx,
syy : real;
begin
sum_x:=0.0;
sum_y:=0.0;
sum_xy:=0.0;
sum_x2:=0.0;
sum_y2:=0.0;
for i:=1 to n do
begin
xi:=x[i];
yi:=y[i];
sum_x:=sum_x+xi;
sum_y:=sum_y+yi;
sum_xy:=sum_xy+xi*yi;
sum_x2:=sum_x2+xi*xi;
sum_y2:=sum_y2+yi*yi
end;
sxx:=sum_x2-sum_x*sum_x/n;
sxy:=sum_xy-sum_x*sum_y/n;
syy:=sum_y2-sum_y*sum_y/n;
b:=sxy/sxx;
a:=((sum_x2*sum_y-sum_x*sum_xy)/n)/sxx;
for i:=1 to n do
y_calc[i]:=a+b*x[i]
end;
begin
for i:=1 to n do
begin
x[i]:= random(2000)/100;
y[i]:= random(2000)/100
end;
linfit1(x,y,y_calc,a,b,n);
writeln;
write('x: ');
for i:=1 to n do
write(x[i]:5:2,' ; ');
writeln;
write('y: ');
for i:=1 to n do
write(y[i]:5:2,' ; ');
writeln;
write('y_calc: ');
for i:=1 to n do
write(y_calc[i]:5:2,' ; ')
end.