Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы 1-4.doc
Скачиваний:
30
Добавлен:
01.05.2014
Размер:
421 Кб
Скачать

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.