Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Контрольна робота
З курсу
«Алгоритмізація і програмування»
на тему:
«Залежність температури металевого предмету при нагріванні в печі»
Львів-2008
Завдання: Температура t металевого предмету при нагріванні в печі описується залежністю:
f(t)=50+450*(t-(1-exp(-0.25*t))/0.25)/60-130
Виділення кореня
f(t)=50+450*(t-(1-exp(-0.25*t))/0.25)/60-130
t([-10;-4].
f(-10)=180.4748 f(-4)=-58.4515
Блок-схема алгоритму
Програма мовою С
//vudilennja_korenja
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{return 50+450*(t-(1-exp(-0.25*t))/0.25)/60-130;}
main()
{clrscr();
for(float t=-10;t<=-4;t+=0.5)
printf("\n t=%.f f=%6.4f",t,f(t));
getchar();
}
Результат виконання
t=-10.0 f=180.4748
t=-9.5 f=141.2804
t=-9.0 f=107.1321
t=-8.5 f=77.4369
t=-8.0 f=51.6717
t=-7.5 f=29.3746
t=-7.0 f=10.1381
t=-6.5 f=-6.3974
t=-6.0 f=-20.5493
t=-5.5 f=-32.5977
t=-5.0 f=-42.7897
t=-4.5 f=-51.3435
t=-4.0 f=-58.4515
Програма в середовищі MATLAB
Функція-процедура
%fun_t
function y=fun_t(t)
y=50+450*(t-(1-exp(-0.25*t))/0.25)/60-130;
%vud_korin
clear,clc
t=[-10:0.5:-4];
f=fun_t(t);
disp([t(:) f(:)]);
format long;
z=fzero('fun_t',0)
figure(1);
plot(t,f,'k');
xlabel('t');ylabel('f(t)');
grid;
Результат виконання програми
-10.0000 180.4748
-9.5000 141.2804
-9.0000 107.1321
-8.5000 77.4369
-8.0000 51.6717
-7.5000 29.3746
-7.0000 10.1381
-6.5000 -6.3974
-6.0000 -20.5493
-5.5000 -32.5977
-5.0000 -42.7897
-4.5000 -51.3435
-4.0000 -58.4515
z =
-6.70264621763789
Метод половинного ділення
Блок-схема алгоритму
Програма мовою С
//pol_dilennja
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{return 50+450*(t-(1-exp(-0.25*t))/0.25)/60-130;}
main()
{clrscr();
float a=-10,b=-4,t0,eps=1e-4;
int k=0;
A:t0=(a+b)/2;
if(fabs(a-b)>eps)
{if(f(a)*f(t0)>0) a=t0; else b=t0;
k++; goto A;
}
printf("\n t0=%.7f f(x0)=%.7f",t0,f(t0));
printf(" k=%d eps=%.7f a-b=%.7f",k,eps,fabs(a-b));
getchar();
}
Програма в середовищі MATLAB
%pol_dil
clear;clc
a=-10; b=-4;
k=0; eps=1e-4;
t0=(a+b)/2;
while abs(a-b)>eps
if fun_t(a)*fun_t(t0)>0 a=t0;
else b=t0;
end;
t0=(a+b)/2;
k=k+1;
end;
disp(' t0 ')
disp([ t0 ])
disp(' k ')
disp([ k ])
Метод простих ітерацій
f(t)= 50+450*(t-(1-exp(-0.25*t))/0.25)/60-130
f´(t)=450/60∙[1-(1-e-0.25t ∙(-0.25))/0.25]
φ(t)=t-f(t)∕k , де |k|≥Q∕2
Q=max|f´(t)|
[-10;-4]
|f´(-10)|=387.9748=Q
|f´(-4)|=104.0485
f´(t)<0 => k<0
k=-200
φ(t)=t-50+450*(t-(1-exp(-0.25*t))/0.25)/60-130 ∕ 200
q=max|φ´(t)|
[-10;-4]
φ´(t)=1-450/60∙[1-(1-e-0.25t ∙(-0.25))/0.25] ⁄ (-200)
φ´(-10)=-0.9399; φ´(-4)=0.4798 => q=0.9399 <1
Умова виходу:|t1-t|<∆(1-q)∕q; ε=∆∙(1-q)∕q
Блок-схема алгоритму
Програма мовою С
//prostux_iteracij
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{return 50+450*(t-(1-exp(-0.25*t))/0.25)/60-130;}
main()
{clrscr();
float a=-10,b=-4,t,t1,det=1e-4,eps=det*(1-0.9399)/0.9399;
int k=0;
t=(a+b)/2;
A:t1=t-450/60*(1-(1-e-0.25t *(-0.25))/0.25) ⁄ (-200);
if(fabs(t1-t)>eps)
{t=t1; k++; goto A;}
else
{printf("\n t1=%.4f f(t1)=%.7f",t1,f(t1));
printf(" k=%d eps=%.7f ",k,eps);}
getchar();
}
Програма в середовищі MATLAB
%pros_iter
clear;clc
a=-10; b=-4;
k=0; det=1e-4;
t=(a+b)/2;
t1=t-450/60*(1-(1-e-0.25*t*(-0.25))/0.25) ⁄ (-200);
eps=det*(1-0.9399)/0.9399;
while abs(t1-t)>eps
t=t1;
t1 t1=t-450/60*(1-(1-e-0.25*t*(-0.25))/0.25) ⁄ (-200);
k=k+1;
end;
disp(' t1 ')
disp([ t1 ])
disp(' k ')
disp([ k ])
Метод хорд
f(a)>0 f(b)<0 f´(t)<0 f´´(t)>0
t=b-f(b)∙(b-a)/(f(b)-f(a)) ; γ=f(t0)∙(t0-tf)/(f(t0)-f(tf)) ;
t=t0-γ;
Умова виходу: |γ|≤ε; ε=∆∙m/(M-m)
m=min |f´(t)|=104.0485; M=max |f´(t)|=387.9748;
Блок-схема алгоритму
Програма мовою С
//metod_xord
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{return 50+450*(t-(1-exp(-0.25*t))/0.25)/60-130;}
main()
{clrscr();
float a=-10,b=-4,t0,t,tf,ha,det=1e-4,
m=104.0485,M=387.9748,eps=m/(M-m)*det;
int k=0;
t=b-f(b)/(f(b)-f(a))*(b-a);
if(f(a)*f(t)<0) {t0=b;tf=a;} else {t0=a;tf=b;}
A:ha=f(t0)*(t0-tf)/(f(t0)-f(tf));
t=t0-ha;
if(fabs(ha)>eps)
{t0=t; k++; goto A;}
else
{printf("\n t=%.7f f(t)=%.7f",t,f(t));
printf(" k=%d eps=%.7f fabs(ha)=%.7f",k,eps,fabs(ha));}
getchar();
}
Програма в середовищі MATLAB
%Metod hord
clear;clc
k=0;t0=-4;tf=-10;det=1e-4;M=387.9748;m=104.0485;
eps=det*m/(M-m);
ha=fun_t(t0)*(t0-tf)/(fun_t(t0)-fun_t(tf));
t=t0-ha;
while abs(ha)>eps;
t0=t;
ha=fun_t(t0)*(t0-tf)/(fun_t(t0)-fun_t(tf));
t=t0-ha;
k=k+1;
end;
disp(' t ');
disp([ t ]);
disp(' k ');
disp([ k ]);
format long;
Метод дотичних
f´(t)=450/60*(1-(1-exp(-0.25*t)*(-0.25))/0.25)
t=a-f(a)/ f´(a)
γ=f(t0)/ f´(t0)
t=t0-γ;
ε=√2∙m1∙∆/M2
Умова виходу: γ≤√2∙m1∙∆/M2
m1=min|f´(t)| => m1=f´(-4)=104.0485
M2=max|f´´(t)|
f´´(t)=25e-0.25t
f´´(-10)=304.5623
f´´(-4)=67.9570
M2=304.5623
Блок-схема алгоритму
Програма мовою С
//metog_dotu4nux
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{return 50+450*(t-(1-exp(-0.25*t))/0.25)/60-130;}
main()
{clrscr();
float a=-10,b=-4,t0,t,tf,ha,det=1e-4,m1=104.0485,
M2=304.5623,eps=sqrt(2*m1*det/M2);
int k=0;
t=a-f(a)/(450/60*(1-(1-exp(-0.25*a))/0.25));
if(f(b)*f(t)>0) {t0=a;tf=b;} else {t0=b;tf=a;}
A:ha=f(t0)/(450/60*(1-(1-exp(-0.25*t0))/0.25));
t=t0-ha;
if(fabs(ha)>eps)
{t0=t; k++; goto A;}
else
{printf("\n t=%.7f f(t)=%.7f",t,f(t));
printf(" k=%d eps=%.7f ha=%.7f ",k,eps,ha);}
getchar();
}
Програма в середовищі MATLAB
Функція-процедура
%poxidna
function y=poxidna(t)
y=450/60*(1-(1-exp(-0.25*t)*(-0.25))/0.25);
%metod_dotuchnux
clear;clc
k=0;tf=+-4;t0=-10;M2=304.5623; m1=104.0485;
det=1e-4;eps=sqrt(2*m1*det/M2);
ha=fun_t(t0)/poxidna(t0);
t=t0-ha;
while abs(ha)>eps;
t0=t;
k=k+1;
ha=fun_t(t0)/poxidna(t0);
t=t0-ha;
end;
format long;
disp(' t ');
disp([ t ]);
disp(' k ');
disp([ k ]);
Комбінований метод
Наближення зліва (метод хорд):
γ=f(a)∙(a-b)/(f(a)-f(b)) ; t1=a-γ.
Наближення справа (метод дотичних):
γ=f(b)/ f´(b) ; t2=b-γ.
Блок-схема алгоритму
Програма мовою С
//kombinovanuj_metod
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float t)
{return 50+450*(t-(1-exp(-0.25*t))/0.25)/60-130;}
main()
{clrscr();
float a=-10,b=-4,t2,t1,t,ha,det=1e-4;
int k=0;
A:ha=f(b)*(b-a)/(f(b)-f(a));
t1=b-ha;
ha=f(b)/(50+450*(t-(1-exp(-0.25*t))/0.25)/60-130);
t2=a-ha;
if(fabs(b-a)>det)
{b=t1;a=t2; k++; goto A;}
else
{t=(t1+t2)/2;
printf("\n t=%.7f",t);
printf(" k=%d eps=%.7f ",k,fabs(b-a));}
getchar();
}
Програма в середовищі MATLAB
%Kombinovanui metod
clear;clc;
a=-10;b=-4;eps=1e-4;k=0;
ha=fun_t(b)*(b-a)/(fun_t(b)-fun_t(a));
t1=b-ha;
ha=fun_t(b)/poxidna(b);
t2=a-ha;
while (abs(b-a)>eps)
b=t2;
a=t1;
k=k+1;
ha=fun_t(b)*(b-a)/(fun_t(b)-fun_t(a));
t1=b-ha;
ha=fun_t(b)/poxidna(b);
t2=a-ha;
end;
t=(t1+t2)/2;
format long;
disp(' t ');
disp([ t ]);
disp(' k ');
disp([ k ]);
Порівняльна таблиця результатів обчислень
Метод уточнення корення
Задана похибка
Значення корення
Кількість ітерацій
Половинного ділення
10-4
-6.7027
16
Простих ітерацій
10-4
-6.7027
50
хорд
10-4
-6.7027
13
дотичних
10-4
-6.7027
8
комбінований
10-4
-6.7027
3