Міністерство освіти та науки України
Національний університет
«Львівська політехніка»
РОЗРАХУНКОВА РОБОТА №1
З дисципліни : Алгоритмізація і програмування.
Визначення зміни в часі температури металевої заготовки при нагріванні в печі.
Варіант №1
Львів-2008 р.
Завдання : Залежність, якою описують процес випаровування води із вільної поверхні посудини в акритому приміщенні об’ємом V має вигляд:
mt=m0-V*q*(1-e-k τ/V)
де m0 i mt- відповідно початкова і залишкова маса води в посудині; q- маса водяної пари яку може увібрати 1 м3 повітря приміщення, τ- час. Знйти об’єм приміщення якщо залилося
1а ) 78г. води за час τ =165xв. , m0=80 г. ;q=13.5 г/m3 ; коефіцієнт к=9*10-4 м3/хв
Розв’язання
Зведемо задане рівняння до вигляду :
f(v)=V*q*(1-e-k τ/V)+ mt-m0
підставивши значення q, mt,m0,к, τ, отримаємо:
f(v)= V*14*(1-e-0,286/V)-4
Виділимо корінь (знайдемо інтервал, в якому знаходиться корінь) заданого рівняння шляхом табулювання f(t):
Програма табулювання функції мовою С
#include<stdio.h>
# include<conio.h>
#include<math.h>
float f(float V)
{return V*13.5*(1-exp(-9e-4*165/V))-2;}
main()
{clrscr();
for(float V=25;V<=35;V+=1)
printf("\n V=%4.1f f(V)=%4.5f",V,f(V));
getchar();
}
Результати табулювання функції в середовищі ТС
V=30.0 f(V)=-0.00020
V=30.5 f(V)=-0.00012
V=31.0 f(V)=-0.00004
V=31.5 f(V)=0.00003
V=32.0 f(V)=0.00011
V=32.5 f(V)=0.00018
V=33.0 f(V)=0.00025
V=33.5 f(V)=0.00031
V=34.0 f(V)=0.00038
V=34.5 f(V)=0.00044
V=35.0 f(V)=0.00050
Програма табулювання функцій f(V) в середовищі MATLAB
clear clc;
v=[30:0.5:35];
a=30;b=35;
f=bro_fan4(x);
format long;
z=fzero('bro_fan4(x)',(a+b)/2)disp([v(:) f(:)]);
whitebg;
plot(v,f,'b-');
grid;
xlabel('v');ylabel('y');
legend('y=f(v)')
function y=bro_fan4(V),
y=V.*14.*(1-exp(-2,86./V))-4;
%Перша похідна
bro_fan41
function y=bro_fan41(V),
y=13.5.*(1-exp(-9e-4.*165./V))+V.*13.5.*(-exp(-9e-4.*165./V.
*V)).*
(-165./V.*V);
%Друга похідна
bro_fan42
functfuncion y=bro_fan42(V),
y=-y=exp(-9e-4.*165./V)).*(-165/V))+
13.5.*((-exp(-9e-4.*165./V)).*(-165/V))+
V.*13.5.*((-exp(-9e-4.*165./V))*(-165/V).*(-165/V)+
(-exp(-9e-4.*165./V)).*(-1653.*2.*V/V.*V.*V.*V))
Результати виконання програми середовищі MATLAB
z =
31.287888322744607
V
f(V)
30.0
30.5
31.0
31.5
32.0
32.5
33.0
33.5
34.0
34.5
35.0
-0.000203579473436
-0.000122504940260
-0.000044041540107
0.000031934871269
0.000105540691091
0.000176885164710
0.000246070926317
0.000313194491850
0.000378346708130
0.000441613162991
0.000503074560482
Графік табулювання функції f(t) в середовищі MATLAB
Рис1. Графік функції y=f(V)
Висновок : в результаті табулювання функції і побудови графіка видно, що корінь нелінійного рівняння знаходиться на інтервалі [31;32 ].
Метод половинного ділення
Формула методу: vi=(ai-1+bi-1);
vi=ai-1; bi=bi-1 коли f(a)*f(vi)>0; vi=bi-1; ai=ai-1 коли f(a)*fvi)<0
Умова виходу: │ ai - bi │<ε
Блок-схема алгоритму
Програма мовою С
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float v)
{ return v*13.5*(1-exp(-9e-4*165/v))-2;}
main()
{clrscr();
float a=31,b=32,v0,v1,eps=1e-4;
int i=0;
A: v0=(a+b)/2;
if(fabs(a-b)>eps)
{if(f(a)*f(v0)>0) a=v0; else b=v0;
i++; goto A;
}
printf("\n v0=%.7f f(v0)=%.7f",x0,f(x0));
printf(" i=%d eps=%.7f",і,eps);
getchar();
return 0; }
Результат виконання програми
V
i
ε
31.287872314453125
14
10-4
31.287891387939453
17
10-5
31.287888050079346
20
10-6
Наближення кореня в середовищі MATLAB
clear,clc
a=31;b=32;i=0;
v=(a+b)/2;
format long;
disp('v i eps')
for eps=[1e-4 1e-5 1e-6]
while abs(a-b)>eps
if (bro_fan4(a)*bro_fan4(v)>0)
a=v;
else b=v;
end;
v=(a+b)/2;
i=i+1;
end;
disp([v i eps])
end
Результат виконання програми
V
i
ε
31.287872314453125
14
10-4
31.287891387939453
17
10-5
31.287888050079346
20
10-6
2) Mетод простих ітерацій
У цьому методі рівняння f(t) замінюється еквівалентним йому рівнянням v=φ(v).
φ(v)=v-f(v)/p;
|p|>Q/2; Q=max|f’(v)|.
[a;b]
Умова виходу :
|xn-xn+1|<ε*(1-q)/q; q=max|φ’(v)|.
[a;b]
Умова збіжності:
|φ’(v)|<q<1.
p =58
q = 0.8275862
Блок-схема алгоритму
Програма мовою С
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float v)
{return v*13.5*(1-exp(-9e-4*165/v))-2;}
main()
{clrscr();
float p=58,a=31,b=32,v0,v,eps=1e-4,q=0.827586206896552;
int i;
for(eps=0.000001;eps<=0.0001;eps=eps*10)
{v0=(a+b)/2;
v=v0-f(v0)/p;
A: if(fabs(v0-v)>eps*(1-q)/q)
{v0=v;
v=v0-f(v0)/p;
i=i+1;
goto A;
}
printf(" v0=%.15f\n i=%d eps=%f\n ",v0,i,eps);
}
getchar();
return 0;
}
Результат виконання програми
V
i
ε
31.287872314453125
13
10-4
31.287891387939453
14
10-5
31.287888050079346
16
10-6
Наближення кореня в середовищі MATLAB
%Metod porosti iter
clear,clc
format long ;
p=58
q=0.827586206896552
disp('v i eps') ;
format long ;
for eps=[1e-4 1e-5 1e-6]
a=31;b=32;i=0;
v0=(a+b)/2;
v=v0-(bro_fan4(v0))/p;
while abs(v0-v)>eps*(1-q)/q;
v0=v;
v=v0-(bro_fan4(v0))/p;
i=i+1;
end;
disp( [v i eps])
end;
Результат виконання програми
V
i
ε
31.287872314453125
13
10-4
31.287891387939453
14
10-5
31.287888050079346
16
10-6
3) Метод хорд
Умови застосування методу:
f’(v), f’(v), f’’(v)- неперервні на [a;b]
f’(v)≠0 та f’’(v)≠0 на [a;b]– видно з рис2 та рис3.
Формула методу:
v=v0-f(v0)*((v0-vf)/(f(v0)-f(vf)));
Умова виходу з ітераційного процесу:
|v-v0|<ε*m/(M-m),
де M=max|f’(v)|= 115, m=min|f’(v)|=49,
[a;b] [a;b]
Вибір нульового наближення та фіксованої точки:
v=(b-a)/2;
f(a)*f(v)>0 то v0=a; vf=b;
f(a)*f(v)<0 то v0=b; vf=a;
Блок-схема алгоритму
Програма мовою С
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float v)
{return v*13.5*(1-exp(-9e-4*165/v))-2;}
main()
{clrscr();
float a=31,b=32 ,v,v0,vf,eps=1e-4,M=115,m=49;
int i;
for(eps=0.000001;eps<=0.0001;eps=eps*10)
{i=0;
v=(b-a)/2;
if (f(a)*f(v)>0){v0=a; vf=b;}
else {v0=b; vf=a;}
v=v0-(f(v0)*(v0-vf))/(f(v0)-f(vf));
A: if(fabs(v-v0)>(eps*m/(M-m)))
{v0=v;
v=v0-(f(v0)*(v0-vf))/(f(v0)-f(vf));
i++; goto A;}
printf(" v=%.7f \n i=%d eps=%.6f\n",v,i,eps);
}
getchar();
return 0;
}
Результат виконання програми
V
i
ε
31.2878876
4
10-4
31.2878876
4
10-5
31.2878876
3
10-6
Наближення кореня в середовищі MATLAB
%Metod hord
clear,clc
M=115
m=49
for eps=[1e-4 1e-5 1e-6]
a=31;b=32;i=0;
v=(b+a)/2;
if (bro_fan4(a)*bro_fan4(v)>0)
v0=a; vf=b;
else v0=b; vf=a;
end;
v=v0-(bro_fan4(v0)*(v0-vf))/(bro_fan4(v0)-bro_fan4(vf));
while abs(v-v0)>(eps*m/(M-m))
v0=v;
v=v0-(bro_fan4(v0)*(v0-vf))/(bro_fan4(v0)-bro_fan4(vf)); i=i+1;
end;
format long;
disp( [v i eps]);
end;
Результат виконання програми
V
i
ε
31.2878876
4
10-4
31.2878876
4
10-5
31.2878876
3
10-6
4) Метод дотичних (Метод Ньютона)
Вибираємо початкове наближення так, щоб виконувалась умова f(v0)* f''(v0)>0.
Умови застосування методу:
f’(v), f’(v), f’’(v)- неперервні на [a;b]
f’(v)≠0 та f’’(v)≠0 на [a;b].
Формула методу:
v=v0-f(v0)/f’(v0);
Умова виходу :
|v-v0|< √(2*m* ε /M)
де M=max|f’’(v)|= 565, m=min|f’(v)|=49,
[a;b] [a;b]
Вибір нульового наближення:
f'(a)*f’’(a)<0 v0=a;
f'(a)*f’’(a)<0 v0=b;
Блок-схема алгоритму
Програма мовою С
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float v)
{return v*13.5*(1-exp(-9e-4*165/v))-2;}
float fp1(float v)
{ return 13.5.*(1-exp(-9e-4*165/v))+v*13.5.*(-exp(-9e-4*165/v))*(-165/v*v*v);}
float fp2(float v)
{return exp(-9e-4*165/v))*(-165/v))+13.5*((-exp(-9e-4*165/v))*(-165/v))+v*13.5*((-exp(-9e-4*165/v))*(-165/v).*(-165/v)+(-exp(-9e-4*165/v))*(-1653*2.*v/(v*v*v*v)));}
main()
{clrscr();
float eps=1e-4,a=31,b=32,v,v0,M=565,m=49;
int i;
for(eps=0.000001;eps<=0.0001;eps=eps*10)
{i=0;if (fp1(a)*fp2(a)<0) v0=a;
else v0=b;
v=v0-f(v0)/fp1(v0);
A: if(fabs(f(v0)/fp1(v0))>sqrt(2*m*eps/M))
{v0=v;
v=v0-f(v0)/fp1(v0);
i=i+1; goto A;}
printf("\n v=%.7f \n i=%d eps=%.6f",v,i,eps);
}
}
getchar();
return 0;
}
Результат виконання програми
V
i
ε
31.2878876
4
10-4
31.2878876
3
10-5
31.2878876
2
10-6
Наближення кореня в середовищі MATLAB
%Dotuchni
clear,clc
m=49
M=565
disp(' v i eps');
for eps=[1e-4 1e-5 1e-6]
a=31;b=32;i=0;
if (bro_fan41 (a)* bro_fan42 (a)<0)
v0=a;
else v0=b;
end;
v=v0- bro_fan4 (v0)/ bro_fan41(v0);
while abs(v0-v)>sqrt(2*m*eps/M);
v0=v;
v=v0- bro_fan4 (v0)/ bro_fan41(v0);
i=i+1;
end;
format long;
disp( [v i eps])
Результат виконання програми
V
i
ε
31.2878876
4
10-4
31.2878876
3
10-5
31.2878876
2
10-6
5) Комбінований метод
У комбінованому методі довжину інтервалу скорочують за допомогою формул методів хород і дотичних.
Блок-схема алгоритму
Програма мовою С
#include<stdio.h>
#include<conio.h>
#include<math.h>
float f(float v)
{return v*13.5*(1-exp(-9e-4*165/v))-2;}
float fp1(float v)
{ return 13.5.*(1-exp(-9e-4*165/v))+v*13.5.*(-exp(-9e-4*165/v))*(-165/v*v*v));}
main()
{clrscr();
float a,a0,b,b0,eps=1e-4,v;
int i;
for(eps=0.000001;eps<=0.0001;eps=eps*10)
i=0; a0=31;b0=32;
a=a0-f(a0)/fp1(a0);
b=b0-(f(b0)*(b0-a))/(f(b0)-f(a));
A: if(fabs(a-b)>eps)
{a0=a;
b0=b;
a=a0-f(a0)/fp1(a0);
b=b0-(f(b0)*(b0-a))/(f(b0)-f(a));
i=i+1; goto A;}
v=(a+b)/2 ;
printf(" v=%.7f\n i=%d eps=%.6f\n",v,i,eps);
}
getchar();
return 0;
}
Результат виконання програми
V
i
ε
31.2878876
2
10-4
31.2878876
3
10-5
31.2878876
4
10-6
Наближення кореня в середовищі MATLAB
clear,clc
format long;
disp(' v i eps');
for eps=[1e-4 1e-5 1e-6]
a0=31;b0=32;i=0;
a=a0- bro_fan4 (a0)/ bro_fan41(a0);
b=b0-( bro_fan4 (b0)*(b0-a))/( bro_fan4 (b0)- bro_fan4 (a));
while (abs(a-b)>eps)
a0=a;
b0=b;
a=a0- bro_fan4 (a0)/ bro_fan41(a0);
b=b0-( bro_fan4 (b0)*(b0-a))/( bro_fan4 (b0)- bro_fan4 (a));
i=i+1;
end;
v=(a+b)/2;
disp( [v i eps]);
end
Результат виконання програми
V
i
ε
31.2878876
2
10-4
31.2878876
3
10-5
31.2878876
4
10-6
Таблиця порівняння результатів
Назва методу
С
MATLAB
ε
V
i
V
i
Половинне ділення
31.287
31.28788
31.2878876
14
17
20
31.287
31.28788
31.2878876
14
17
20
10-4
10-5
10-6
Прості ітерації
31.287
31.28788
31.2878876
13
14
16
31.287
31.28788
31.2878876
13
14
16
10-4
10-5
10-6
Метод хорд
31.287
31.28788
31.2878876
4
4
3
31.287
31.28788
31.2878876
4
4
3
10-4
10-5
10-6
Метод дотичних
31.287
31.28788
31.2878876
2
3
4
31.287
31.28788
31.2878876
2
3
4
10-4
10-5
10-6
Комбінований метод
31.287
31.28788
31.2878876
2
3
4
31.287
31.28788
31.2878876
2
3
4
10-4
10-5
10-6
Висновок:для даного рівняння кращу збіжність дають Метод дотичних та Комбінований метод
Об’єм приміщення в якому стояла посудина з водою є близько 31м3 .