- •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.
