Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Теоретична частина роботи
1.1 Загальні відомості Лінійна апроксімація (многочленами) має вигляд: Метод найменших квадратів (МНК) для функцій заданих таблицею значень
Матричне зображення:
;
; ; ;
1.2 Розрахункові формули: , де ; ; невідомих коефіцієнтів 2 Практична частина роботи:
2.1 Схема розрахунку:
2.2 Текст програми
Лістинг 1 – файл dannie.PAS
UNIT dannie;
INTERFACE uses matr_and_vekt_operations;
procedure Trancp_matrici(mas: massiv; var mas_result: massiv; m, n: integer); procedure Readvektors_s_faila(fpath: string; var vect: vector; var t: integer); procedure Vivod_vektors(vect: vector; t: integer); procedure Vivod_matrici(mas: massiv; m, n: integer); procedure Umnoj_dvuh_matric(mas, masb: massiv; var mas_result: massiv; m, n: integer); procedure Umjen_vektora_na_matricu(mas: massiv; vect: vector; var vect_result: vector; m, n: integer);
IMPLEMENTATION
procedure Readvektors_s_faila(fpath: string; var vect: vector; var t: integer); var f: text; g: integer; begin assign(f, fpath); reset(f); readln(f, t); for g: =1 to t do read(f, vect[g]); close(f); end;
procedure Vivod_vektors(vect: vector; t: integer); var g: integer; begin for g: =1 to t do write(vect[g]: 7: 4, ' '); writeln; end;
procedure Vivod_matrici(mas: massiv; m, n: integer); var i, j: integer; begin for i: =1 to n do begin for j: =1 to m do write(mas[i, j]: 7: 4, ' '); writeln;
end; end;
procedure Umnoj_dvuh_matric(mas, masb: massiv; var mas_result: massiv; m, n: integer); var i, j, k: integer; sum: real; begin for i: =1 to n do for k: =1 to n do begin sum: =0; for j: =1 to m do sum: =sum+(mas[k, j]*masb[j, i]); mas_result[i, k]: =sum; end; end;
procedure Trancp_matrici(mas: massiv; var mas_result: massiv; m, n: integer); var i, j: integer; begin for i: =1 to m do for j: =1 to n do mas_result[j, i]: =mas[i, j]; end;
procedure Umjen_vektora_na_matricu(mas: massiv; vect: vector; var vect_result: vector; m, n: integer); var i, j: integer; begin for i: =1 to n do begin vect_result[i]: =0; for j: =1 to m do vect_result[i]: =vect_result[i]+(mas[i, j]*vect[j]); end; end;
END.
Лістинг 2 – файл zapisX.PAS
UNIT zapisX;
INTERFACE uses matr_and_vekt_operations, dannie; procedure fun(var mas: massiv; vect: vector; t, n: integer);
IMPLEMENTATION
procedure fun(var mas: massiv; vect: vector; t, n: integer); var i, j: integer; begin for i: =1 to t do begin mas[i, 1]: =1; for j: =2 to n+1 do mas[i, j]: =mas[i, j-1]*vect[i]; end; end;
END.
Лістинг 3 – файл Gaus.PAS
Unit Gaus; interface uses matr_and_vekt_operations, dannie; const ebs = 0.05; procedure doGaus(d: integer; mas: massiv; b: vector; var x: vector);
implementation
procedure doGaus(d: integer; mas: massiv; b: vector; var x: vector); var i, j, k, kmax: integer; amax, c: real; error: boolean; xk: vector; begin for k: =1 to d do begin error: =true; amax: =abs(mas[k, k]); kmax: =k; for i: =k+1 to d do if (abs(mas[i, k])) > amax then begin amax: =abs(mas[i, k]); kmax: =i; end; if (amax< ebs) then error: =false else begin if kmax < > k then begin for i: =k to d do begin c: =mas[kmax, i]; mas[kmax, i]: =mas[k, i]; mas[k, i]: =c; end; c: =b[kmax]; b[kmax]: =b[k]; b[k]: =c; end; amax: =mas[k, k]; for j: =k to d do mas[k, j]: =mas[k, j]/amax; b[k]: =b[k]/amax; for i: =k+1 to d do begin amax: =mas[i, k];
for j: =k+1 to d do mas[i, j]: =mas[i, j]-mas[k, j]*amax; mas[i, k]: =0; b[i]: =b[i]-b[k]*amax; end; end; end; if error=true then begin for k: =d downto 1 do begin xk[k]: =b[k]; for i: =k+1 to d do xk[k]: =xk[k]-mas[k, i]*x[i]; x[k]: =xk[k]; end; end else writeln('!!! OshibkA!!! '); end; end.
Лістинг 4 – файл lab1_5S.PAS
Program lab1; uses crt, dannie, matr_and_vekt_operations, zapisX, gaus; const n=7; {stepen polinoma, na4inaya s 0} var x, y, b, a, f, r: vector; t, i, j: integer; masx, masxtr, masa: massiv; s, yapr, eps: real;
Begin clrscr; Readvektors_s_faila('xi.txt', x, t); Readvektors_s_faila('yi.txt', y, t); fun(masx, x, t, n); Trancp_matrici(masx, masxtr, t, n+1); Umnoj_dvuh_matric(masxtr, masx, masa, t, n+1); Umjen_vektora_na_matricu(masxtr, y, b, t, n+1); doGaus(n+1, masa, b, a); for i: =1 to t do begin f[i]: =a[1]; for j: =2 to n+1 do f[i]: =f[i]+(a[j]*exp((j-1)*ln(x[i]))); r[i]: =abs((y[i]-f[i])*100/y[i]); end; writeln('|-------------------------------------------------------|'); writeln('| num | xi | yi | ai | yAPR | OTNeps % |'); writeln('|-------------------------------------------------------|'); for i: =1 to t do writeln('| ', i: 2, ' ', x[i]: 7: 4, ' ', y[i]: 7: 4, ' ', a[i]: 7: 4, ' ', f[i]: 7: 4, ' ', r[i]: 7: 4, ' |'); writeln('|-------------------------------------------------------|'); s: =0; for i: =1 to t do s: =s+sqr(abs(y[i]-f[i])); eps: =sqrt(s/t)*100; writeln; writeln('Srednyaya kvadrati4eskaya pogreshnosT = ', eps: 7: 4, ' %'); readln; End.
2.3 Результати виконання програми:
В результаті виконання програми отримані наступні результати:
При цьому функція має вигляд:
|