– максимальний крутний момент двигуна
, Н·м;– питома витрата палива
, г/кВт·год;– кількість обертів двигуна при максимальній потужності
;– кількість обертів двигуна при максимальному моменті
;– табличні дані з графіків зовнішньої швидкісної характеристики.
3.3 Формалізація задачі
Для вирішення даної задачі необхідно за даними графіків зовнішньої швидкісної характеристики двигуна J6R створити математичні моделі його механічних характеристик.
Апроксимування функцій будемо виконувати за допомогою методу найменших квадратів.
Функція
на відрізку [а, в] задана системою N точок , , … , .Потрібно так підібрати коефіцієнти
поліномащоб сума квадратів відхилення полінома від заданих значень функції
була мінімальною.
Використовуючи умову екстремуму функції кількох змінних:
можна скласти систему лінійних алгебраїчних рівнянь, відносно коефіцієнтів
.Якщо в якості апроксимуючого полінома вибрати степеневий поліном виду
та
то система рівнянь буде мати вигляд (3.15).
Ця система рівнянь лінійна відносно
коефіцієнта полінома і розв'язується будь-яким відомим методом (методом Гаусса з послідовним включенням, методом Гаусса за схемою Халецького і т.п.).Таким чином, алгоритм МНК включає три етапи:
1. Формування системи рівнянь.
2. Розв"язання системи лінійних алгебраїчних рівнянь та знаходження коефіцієнтів апроксимуючого полінома
3. Вибір "оптимального" (найкращого) степеня
апроксимуючого полінома, за заданою припущеною похибкою метода .При розробці алгоритма і програми формування системи рівнянь необхідно скористатись тим, що в матриці коефіцієнтів знаходяться суми
від
до ;від
до :3.4Розробка алгоритмів розв’язання задачі
Рис.10 – схема алгоритму метода найменших квадратів для знаходження коефіцієнтів степеневого апроксимуючого полінома
3.5 Вибір типу та структури оброблюваних даних
В процесі розв’язку поставленої задачі оброблюються дані наступного типу:
Таблиця 3.1
Тип | Область значень | Фізичний формат |
Integer | від –2147483648 до 2147483647 | 32 розряди, зі знаком |
Real | від 2,910-39 до 1,71038 | Точність 11-12 розрядів, розмір в байтах – 6 |
З метою збереження і обробки в пам’яті ЕОМ прийнята така система ідентифікаторів:
Таблиця 3.2
Назва параметра | Позначення | |
у формулі | у програмі | |
Масив даних крутного момента | с[i] | |
Масив даних питомої витрати паливаа | b[i] | |
Масив даних кількості обертів колінчастого валу | n[i] | |
Масив коефіцієнтів полінома | a[i] | |
Кількість коефіцієнтів | m | |
Інші | – | n1, e1, t, h, a1, b1, b2, eps, s, s0, i, j, k, k2, n2, i1, i3, i2, j1, j3, j2, m1, z1, f, e |
3.6 Програмування задачі на мові програмування pascal 7.0
Program Aproksimatsia;
Uses CRT;
Type mas= array[1..25,1..25] of real;
mas1= array[1..25] of real;
Var
a: mas;
c,b,x,x1,y1: mas1;
n,n1,i1,i3,i2,j1,j3,j2,m1: integer;
e1: real;
t,h,a1,b1,b2,eps,s,s0:real;
i,j,k,n2:integer;
Procedure MNK(n1:integer;x1,y1:mas1;var a:mas);
Var
k2:integer; z1,f,e : real;
BEGIN
for k2:=1 to n1 do
begin
z1:=x1[k2]; f:=y1[k2]; e:=1;
for i2:=1 to 2*m1+1 do
begin
c[i2]:=c[i2]+e;
if i2<=m1+1 then b[i2]:=b[i2]+e*f;
e:=e*z1
end;
end;
for i2:=1 to m1+1 do
begin
for j2:=1 to m1+1 do
a[i2,j2]:=c[i2+j2-1];
end;
END;
Procedure Gaus(n:integer;a:mas; b:mas1; var x:mas1);
Var
i,j,k,l:integer; max,z,s,m : real;
BEGIN
writeln('**** Vixidna sistema rivnyan ****');
for i:=1 to n do
begin
for j:=1 to n do write(' ',a[i,j]:5:2); write(' ',b[i]:5:2);
WRITELN;
end;
WRITELN;
for k:=1 to n-1 do
begin
max:=abs(a[k,k]); l:=k;
for i:=k+1 to n do
begin
if abs(a[i,k])>max then
begin l:=i; max:=abs(a[i,k]); end;
end;
if l<>k then begin
for j:=k to n do
begin
z:=a[l,j]; a[l,j]:=a[k,j]; a[k,j]:=z;
end;
z:=b[l]; b[l]:=b[k]; b[k]:=z;
end;
for i:=k+1 to n do
begin
m:=a[i,k]/a[k,k];
for j:=k to n do a[i,j]:=a[i,j]-m*a[k,j];
b[i]:=b[i]-m*b[k];
a[i,k]:=0;
end;
end;
Writeln('*** trikytna sistema rivnayn ***');
for i:=1 to n do
begin
for j:=1 to n do write(' ',a[i,j]:5:2); write(' ',b[i]:5:2);
WRITELN;
end;
writeln;
(*** xod nazad ***)
x[n]:=b[n]/a[n,n];
for i:=n-1 downto 1 do
begin
s:=0;
for j:=i+1 to n do s:=s+x[j]*a[i,j];
x[i]:=(b[i]-s)/a[i,i];
end;
END;
Function q(t:real):real;
BEGIN
q:=x[1]+x[2]*t+x[3]*t*t+x[4]*t*t*t;
END;
procedure simpson(a1,b1:real;n2:integer;var s:real);
var
hs:real;e,i:integer;
begin
hs:=(b1-a1)/(2*n2);
s:=q(a1)+q(b1);
e:=1;
for i:=1 to 2*n2-1 do
begin
s:=s+(3+e)*q(a1+i*hs);
e:=-e;
end;
s:=s*hs/3;
end;
BEGIN
Clrscr;
write('vedit kilkistto4ok tabli4noi fynksi N=');readln(n1);
{ctepin polimena} m1:=3;
writeln('vedit vixidni to4ki');
for i3:=1 to n1 do begin
read(x1[i3]); read(y1[i3]);
WRITELN;
end;
writeln('_________________________');
writeln('vihidni dani');
for i3:=1 to n1 do
begin
write(' ',x1[i3]:5:2); write(' ',y1[i3]:5:2);
WRITELN;
end;
c[1]:=0; b[1]:=0;
MNK (n1,x1,y1,a);
for i2:=1 to m1+1 do n:=n+1;
Gaus(n,a,b,x);
writeln('*** vektor rozvyazky ***');
writeln;
for i1:=1 to n do writeln('x[',i1,']=',x[i1]:7:3);
{kofisienti zapicyutsya a0+a1*x+a2*x^2+a3*x^3+...=const}
write(' q(t)'); write(' y');
writeln;
for i3:=1 to n1 do
begin
e1:=e1+Sqr(q(x1[i3])-y1[i3]);
write(' ',q(x1[i3]):7:3); write(' ',y1[i3]:7:3);
writeln;
end;
writeln('poxibka aproksimasyi',e1:7:5);
write('введіть b2=');read(b2);
a1:=0; b1:=b2/10;
eps:=0.001;
repeat
k:=2;
simpson(a1,b1,k,s);
repeat
s0:=s; k:=k*2;
simpson(a1,b1,k,s);
writeln('b1=',b1:5:2,' s=',s:5:2);
until (abs(s-s0)<=eps)or(k>500);
b1:=b1+b2/10;
until b1>b2;
END.
3.7 Відлагодження програми
Виправлення синтаксичних помилок на підставі повідомлень транслятора. Після написання програми транслятор знайшов ні помилку у 149-му рядку з повідомленням “Error 26: type mismatsh
I, j, k, n2: integer;
Після заміни real на integer, програма була запущена транслятором на виконання.
Таблиця 3.3 – Результати контролю правильності розв’язання задачі
Вихідні дані | Результати розрахунків | ||||||
ППП MathCad 2000 | Програма на мові Turbo Pascal | ||||||
400800120016002000240028003200360040004400480052005600 | 36,345,554,656,152,566,667,971,365,566,463,355,952,651,3 | 3533423541332328325 319314324330331346353360 | 34.47-0.123x+0.028x2-0.0012x3 | 421.53-2.37x+0.452x2+0.072x3 | 31.71-0.12x+0.027x2-0.001x3 | 417.32-2.41x+0.457x2+0.07x3 |
ВИСНОВОК