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

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.