МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
РОЗРАХУНКОВА РОБОТА №1
З дисципліни : Алгоритмізація і програмування.
Визначення зміни в часі температури металевої заготовки при нагріванні в печі.
Варіант №2
Завдання : Зміна в часі температури металевої заготовки при нагріванні в печі описується наступною залежністю
де а – початкова температура печі і заготовки; b – температура печі через годину. При різниці температур Т заготовки і печі метал нагрівається із швидкістю k*T градусів за хвилину, k – коефіцієнт пропорційності.
Визначити : за який час t (за скільки хвилин) температура заготовки досягне 150 °С, коли а=50 °С, b=500 °С, k=0,85 хв.‾ ¹; (14,5098 хв.)
Розв’язання
Зведемо задане рівняння до вигляду :
Виділимо корінь (знайдемо інтервал, в якому знаходиться корінь) заданого рівняння шляхом : табулювання f(t);
Програма табулювання функції мовою С
//Lab_1V
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{float a=50,b=500,T=150,k=0.85;
return a+(b-a)/60*(t-(1-exp(-k*t))/k)-T;}
main()
{clrscr();
float t;
for(t=0;t<=60;t+=4)
printf("\n\nt=%.4f y=%.4f",t,f(t));
getch();
return 0;
}
Результати табулювання функції мовою С
t
y
0.0000
-100.0000
4.0000
-78.5210
8.0000
-48.8137
12.0000
-18.8232
16.0000
11.1765
20.0000
41.1765
24.0000
71.1765
28.0000
101.1765
32.0000
131.1765
36.0000
161.1765
40.0000
191.1765
44.0000
221.1765
48.0000
251.1765
52.0000
281.1765
56.0000
311.1765
60.0000
341.1765
Табулювання функції в середовищі MATLAB
Файл f_bvg1 в якому описана функція f(t)
function y=f_bvg1(t);
a=50;b=500;k=0.85;T=150;
y=a+(b-a)/60*(t-(1-exp(-k*t))/k)-T;
Програма табулювання функції f(t) в середовищі MATLAB
%bvglab
clc;clear;
a=0;b=60;
t=[a:(b-a)/1e2:b];
y=f_bvg1(t);
t_zero=fzero('f_bvg1',(a+b)/2);
plot(t,y,'k-',t_zero,0,'r*');grid;
xlabel('t,XB');
ylabel('T(t),C');
Графік табулювання функції f(t) в середовищі MATLAB
Висновок : в результаті табулювання функції і побудови графіка видно, що корінь нелінійного рівняння знаходиться на інтервалі [12;16 ].
1) Метод половинного ділення
Блок-схема алгоритму
Програма мовою С
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{float a=50,b=500,T=150,k=0.85;
return (a+(b-a)/60*(t-(1-exp(-k*t))/k)-T);
}
main ()
float t0,a=12,b=16,eps=1e-4,k=0;
a:
t0=(a+b)/2;
if(f(a)*f(t0)>0) a=t0;
else b=t0;
if(fabs(a-b)>eps) goto a;
printf ("t0=%f eps=%f k=%f",t0,eps,k);
getch();
return 0;
}
Результат виконання програми
t0
k
ε
14.5098
16
14.50980
19
14.509799
22
Наближення кореня в середовищі MATLAB
%Metod polovunnoho dilennya
a=12;b=16;k=0;eps=1e-4;
t0=(a+b)/2;
while abs(a-b)>eps
if f_bvg1(a)*f_bvg1(t0)>0 a=x0;
else b=x0;
end;
t0=(a+b)/2;
k=k+1;
end;
format long;
disp('a to b k')
disp([a t0 b k])
Результат виконання програми
t0
k
ε
14.5098
16
14.50980
19
14.509799
22
2) Mетод простих ітерацій
У цьому методі рівняння f(t) замінюється еквівалентним йому рівнянням t=φ(t).
Q = 7.4999 → k = 4
q = 0.87499
Блок-схема алгоритму
Програма мовою С
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{float a=50,b=500,T=150,k=0.85;
return (a+(b-a)/60*(t-(1-exp(-k*t))/k)-T);
}
main()
{float t0=14,t,eps=1e-4,q=0.8749; int i=0;
clrscr();
a:
t=t0-f(t0)/4;
if(fabs(t-t0)>eps*(1-q)/q)
{t0=t; i++; goto a;
}
printf(" t=%.4f i=%d",t,i);
getch();
return 0;
}
Результат виконання програми
t
i
ε
14.5098
96
14.50980
108
14.509799
Наближення кореня в середовищі MATLAB
%Metod prostux iteracij
t0=12;q=0.8749;eps=1e-4;i=0;
t=t0-f_bvg1(t0)/4;
while abs(t-t0)>eps*(1-q)/q;
t=t0-f_bvg1(t0)/4;
t0=t;
i=i+1;
end;
format long;
disp(' t t0 i')
disp( [t t0 i])
Результат виконання програми
t
i
ε
14.5098
96
14.50980
108
14.509799
124
3) Метод хорд
Із запису функцій f'(t) та f''(t) видно що обидві ці функції завжди більші за нуль, отже x0=a a xф=b.
Блок-схема алгоритму
Програма мовою С
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t0)
{float a=50,b=500,T=150,k=0.85;
return a+(b-a)/60*(t0-(1-exp(-k*t0))/k)-T;
}
main()
{float t0=12,tf=16,t,eps=1e-5; int i=0;
clrscr();
a:
t=t0-f(t0)*((t0-tf)/(f(t0)-f(tf)));
if(t-t0>eps) {i++; t0=t; goto a;
}
printf(" t=%.4f i=%d",t,i);
getch();
return 0;
}
Результат виконання програми
t
i
ε
14.5098
1
14.50980
2
14.509799
2
Наближення кореня в середовищі MATLAB
%Metod hord
t0=12;tf=16;eps=1e-4;M=7.4999;m=7.4997;
t=t0-f_bvg1(t0)*((t0-tf)/(f_bvg1(t0)-f_bvg1(tf)));
while abs(t-t0)>eps*m/(M-m);
t=t0-f_bvg1(t0)*((t0-tf)/(f_bvg1(t0)-f_bvg1(tf)));
t0=t;
i=i+1;
end;
disp(' t t0 i');
disp( [t t0 i]);
Результат виконання програми
t
i
ε
14.5098
1
14.50980
2
14.509799
2
4) Метод дотичних (Метод Ньютона)
Вибираємо початкове наближення так, щоб виконувалась умова f(t0)* f''(t0)>0.
t0=16;
Блок-схема алгоритму
Програма мовою С
//Lab15_4V
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{float a=50,b=500,T=150,k=0.85;
return a+(b-a)/60*(t-(1-exp(-k*t))/k)-T;
}
float fs(float t)
{float a=50,b=500,k=0.85;
return (b-a)/60*(1-exp(-k*t));
}
main()
{clrscr();
float t0=12,t,M=7.9113*1e-5,m=7.497,eps=1e-4; int i=0;
a:
t=t0-f(t0)/fs(t0);
if(fabs(t-t0)>sqrt(2*m*eps/M)) {i++;
t0=t;
goto a;
}
printf("t=%.4f i=%d",t,i);
getch();
return 0;}
Результат виконання програми
t
i
ε
14.5098
1
14.50980
2
14.509799
2
Наближення кореня в середовищі MATLAB
%Dotuchni
t0=12;M=7.9113*1e-5;m=7.497;eps=1e-4;i=0;
t=t0-f_bvg1(t0)/f_bvgs1(t0);
while abs(t-t0)>sqrt(2*m*eps/M);
t=t0-f_bvg1(t0)/f_bvgs1(t0);
t0=t;
i=i+1;
end;
format long;
disp(' t t0 i')
disp( [t t0 i])
Результат виконання програми
t
i
ε
14.5098
1
14.50980
2
14.509799
2
5) Комбінований метод
Блок-схема алгоритму
Програма мовою С
//Lab15_5V
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{float a=50,b=500,k=0.85,T=150;
return a+(b-a)/60*(t-(1-exp(-k*t))/k)-T;
}
float fs(float t)
{float a=50,b=500,k=0.85;
return (b-a)/60*(1-exp(-k*t));
}
main()
{clrscr();
float r0=12,r,z0=16,z,t,eps=1e-4; int i=0;
a:
z=z0-f(z0)/fs(z0);
r=r0-f(r)*(z-r0)/(f(z)-f(r0));
if(fabs(z-r)>eps)
{z0=z;
r0=r;
i++;
goto a;
}
t=(r+z)/2;
printf(" t=%.4f i=%d",t,i);
getch();
return 0;
}
Результат виконання програми
t
i
ε
14.5098
1
14.50980
1
14.509799
2
Наближення кореня в середовищі MATLAB
%Kombinovanui metod
r0=12;z0=16;eps=1e-6;i=0;
z=z0-f_bvg1(z0)/f_bvgs1(z0);
r=r0-(f_bvg1(r0)*(z-r0))/(f_bvg1(z)-f_bvg1(r0));
while (abs(z-r)>eps)
z=z0-f_bvg1(z0)/f_bvgs1(z0);
r=r0-f_bvg1(r0)*(z-r0)/(f_bvg1(z)-f_bvg1(r0));
z0=z;
r0=r;
i=i+1;
end;
t=(r+z)/2;
format long;
disp(' t i');
disp( [t i]);
Результат виконання програми
t
i
ε
14.5098
1
14.50980
1
14.509799
2
Порівняльна таблиця результатів
Назва методу
С
MATLAB
ε
t
i
t
i
Половинне ділення
14,5098
14,50980
14,509799
16
19
22
14,5098
14,50980
14,509799
16
19
22
Прості ітерації
14,5098
14,50980
14,509799
96
108
124
14,5098
14,50980
14,509799
96
108
124
Метод хорд
14,5098
14,50980
14,509799
1
2
2
14,5098
14,50980
14,509799
1
2
2
Метод дотичних
14,5098
14,50980
14,509799
1
2
2
14,5098
14,50980
14,509799
1
2
2
Комбінований метод
14,5098
14,50980
14,509799
1
1
2
14,5098
14,50980
14,509799
1
1
2