Giáo trình C++ - Chương 12: Tính gần đúng đạo hàm và tích phân xác định

Ch¬ng 12 : TÝnh gÇn ®óng ®¹o hµm vµ tÝch ph©n x¸c ®Þnh  
§1. §¹o hµm Romberg  
§¹o hµm theo ph¬ng ph¸p Romberg lµ mét ph¬ng ph¸p ngo¹i suy ®Ó x¸c ®Þnh ®¹o  
hµm víi mét ®é chÝnh x¸c cao . Ta xÐt khai triÓn Taylor cña hµm f(x) t¹i (x+h) vµ (x-h) :  
h2  
h3  
h4  
′′  
′′′  
f(x + h) = f(x) + hf (x) +  
f (x) +  
f (x) +  
f(4) (x) + ⋅⋅  
(1)  
(2)  
2
3!  
4!  
h2  
2
h3  
3!  
h4  
4!  
f(4) (x) ⋅⋅  
′′  
′′′  
f(x h) = f(x) hf (x) +  
f (x) −  
f (x) +  
Trõ (1) cho (2) ta cã :  
2h3  
2h5  
f(5) (x) + ⋅⋅  
(3)  
′′′  
f(x + h) f(x h) = 2hf (x) +  
f (x) +  
3!  
5!  
NhvËy rót ra :  
f(x + h) f(x h) h2  
h4  
′′′  
f (x) −  
f (x) =  
f(5) (x) ⋅⋅  
(4)  
(5)  
2h  
3!  
5!  
hay ta cã thÓ viÕt l¹i :  
1
f (x) =  
[
f(x + h) f(x h)  
+ a2h2 + a4h4 + a6h6 + ⋅⋅  
]
2h  
trong ®ã c¸c hÖ sè ai phô thuéc f vµ x .  
Ta ®Æt :  
(6)  
1
2h  
=
ϕ(h)  
[f(x+h)f(xh)]  
NhvËy tõ (5) vµ (6) ta cã :  
2
4
6
D(1,1) = ϕ(h) = f (x) a2h a4h a6h ⋅⋅  
(7)  
(8)  
h
h2  
h4  
h6  
⎛ ⎞  
D(2,1) = ϕ  
= f (x) a  
a4  
a6  
⋅⋅  
⎜ ⎟  
2
2
4
16  
64  
⎝ ⎠  
vµ tæng qu¸t víi hi = h/2i-1 ta cã :  
2
4
6
D(i,1) = ϕ(hi ) = f (x) a2hi a4hi a6hi ⋅⋅  
(9)  
Ta t¹o ra sai ph©n D(1,1) - 4D(2,1) vµ cã :  
h
3
15  
⎛ ⎞  
4
= −3f (x) a h a6 h6 ⋅⋅⋅  
(10)  
ϕ(h) 4ϕ  
⎜ ⎟  
4
2
⎝ ⎠  
4
16  
Chia hai vÕ cña (10) cho -3 ta nhËn ®îc :  
4D(2,1) D(1,1)  
1
5
4
D(2,2) =  
= f (x) + a4h + a6h6 + ⋅⋅  
(11)  
4
4
16  
Trong khi D(1,1) vµ D(2,1) sai kh¸c f(x) phô thuéc vµo h2 th× D(2,2) sai kh¸c f(x) phô  
thuéc vµo h4 . B©y giê ta l¹i chia ®«i bíc h vµ nhËn ®îc :  
+ 1  
4
5
16  
(12)  
(13)  
(h/2)4  
(h/2)6  
a6  
=
+
+...  
D(2,2) f (x)  
a4  
vµ khö sè h¹ng cã h4 b»ng c¸ch t¹o ra :  
+ + 15  
(h)6  
=
+...  
D(2,2)16D(3,2) 15f (x)  
a6  
64  
Chia hai vÕ cña (13) cho -15 ta cã :  
16D(3,2)D(2,2)  
1
64  
(14)  
a6 h6  
=
=
. ...  
D(3,3)  
f (x)  
15  
204  
Víi lÇn tÝnh nµy sai sè cña ®¹o hµm chØ cßn phô thuéc vµo h6 . L¹i tiÕp tôc chia ®«i bíc h  
vµ tÝnh D(4,4) th× sai sè phô thuéc h8 . S¬ ®å tÝnh ®¹o hµm theo ph¬ng ph¸p Romberg lµ :  
D(1,1)  
D(2,1)  
D(3,1)  
D(4,1)  
D(2,2)  
D(3,2)  
D(4,2)  
D(3,3)  
D(4,3)  
D(4,4)  
. . . . . . . . . . . .  
trong ®ã mçi gi¸ trÞ sau lµ gi¸ trÞ ngo¹i suy cña gi¸ trÞ tríc ®ã ë hµng trªn .  
Víi 2 j i n ta cã :  
j1D(i,j1)D(i1,j1)  
4
=
D(i,j)  
4j11  
vµ gi¸ trÞ khëi ®Çu lµ :  
1
2hi  
=
=
ϕ(h  
D(i,1)  
víi hi = h/2i-1 .  
)
[f(x+hi)f(xhi)]  
i
Chóng ta ngõng l¹i khi hiÖu gi÷a hai lÇn ngo¹i suy ®¹t ®é chÝnh x¸c yªu cÇu.  
VÝ dô : T×m ®¹o hµm cña hµm f(x) = x2 + arctan(x) t¹i x = 2 víi bíc tÝnh h = 0.5 . TrÞ chÝnh  
x¸c cña ®¹o hµm lµ 4.2  
1
D(1,1) =  
D(2,1) =  
[f(2.5) f(1.5)] = 4.207496266  
[f(2.25) f(1.75)] = 4.201843569  
2×0.5  
1
2×0.25  
1
D(3,1) =  
[f(2.125) f(1.875)] = 4.200458976  
2×0.125  
1D(2,1)D(1,1)  
= 4  
= 4.19995935  
= 4.200458976  
= 4.200492284  
D(2,2)  
D(3,2)  
D(3,3)  
411  
1D(3,1)D(2,1)  
= 4  
= 4  
411  
2 D(3,2)D(2,2)  
4211  
Ch¬ng tr×nh tÝnh ®¹o hµm nhdíi ®©y . Dïng ch¬ng tr×nh tÝnh ®¹o hµm cña hµm  
cho trong function víi bíc h = 0.25 t¹i xo = 0 ta nhËn ®îc gi¸ trÞ ®¹o hµm lµ 1.000000001.  
Ch¬ng tr×nh12-.1  
//Daoham_Romberg;  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#define max 11  
float h;  
void main()  
{
float d[max];  
int j,k,n;  
float x,p;  
float y(float),dy(float);  
205  
clrscr();  
printf("Cho diem can tim dao ham x = ");  
scanf("%f",&x);  
printf("Tinh dao ham theo phuong phap Romberg\n");  
printf("cua ham f(x) = th(x) tai x = %4.2f\n",x);  
n=10;  
h=0.2;  
d[0]=dy(x);  
for (k=2;k<=n;k++)  
{
h=h/2;  
d[k]=dy(x);  
p=1.0;  
for (j=k-1;j>=1;j--)  
{
p=4*p;  
d[j]=(p*d[j+1]-d[j])/(p-1);  
}
}
printf("y'= %10.5f\n",d[1]);  
getch();  
}
float y(float x)  
{
float a=(exp(x)-exp(-x))/(exp(x)+exp(-x));  
return(a);  
}
float dy(float x)  
{
float b=(y(x+h)-y(x-h))/(2*h);  
return(b);  
}
§2. Kh¸i niÖm vÒ tÝch ph©n sè  
Môc ®Ých cña tÝnh tÝch ph©n x¸c ®Þnh lµ ®¸nh gi¸ ®Þnh lîng biÓu thøc :  
b
y
J = f(x)dx  
a
trong ®ã f(x) lµ hµm liªn tôc trong kho¶ng [a,b] vµ cã  
thÓ biÓu diÔn bëi ®êng cong y= f(x). NhvËy tÝch  
ph©n x¸c ®Þnh J lµ diÖn tÝch SABba , giíi h¹n bëi ®êng  
cong f(x) , trôc hoµnh , c¸c ®êng th¼ng x = a vµ x = b  
. NÕu ta chia ®o¹n [a,b] thµnh n phÇn bëi c¸c ®iÓm xi  
th× J lµ gíi h¹n cña tæng diÖn tÝch c¸c h×nh ch÷ nhËt  
f(xi).(xi+1 - xi) khi sè ®iÓm chia tiÕn tíi , nghÜa lµ :  
B
A
a
a
x
b
206  
n
=
f(x )(x  
)
xi  
J lim  
i
i+1  
n∞  
i=0  
NÕu c¸c ®iÓm chia xi c¸ch ®Òu , th× ( xi+1- xi ) =  
h . Khi ®Æt f(xo) = fo , f(x1) = f1 ,... ta cã tæng :  
n
Sn = h fi  
i=0  
Khi n rÊt lín , Sn tiÕn tíi J . Tuy nhiªn sai sè lµm trßn l¹i ®îc tÝch luü . Do vËy cÇn  
ph¶i t×m ph¬ng ph¸p tÝnh chÝnh x¸c h¬n . Do ®ã ngêi ta Ýt khi dïng ph¬ng ph¸p h×nh  
ch÷ nhËt nhvõa nªu .  
§3. Ph¬ng ph¸p h×nh thang  
Trong ph¬ng ph¸p h×nh thang , thay v× chia diÖn tÝch SABba thµnh c¸c h×nh ch÷ nhËt ,  
ta l¹i dïng h×nh thang . VÝ dô nÕu chia thµnh 3 ®o¹n nhh×nh vÏ th× :  
S3 = t1 + t2 + t3  
trong ®ã ti lµ c¸c diÖn tÝch nguyªn tè . Mçi diÖn tÝch nµy lµ mét h×nh thang :  
ti = [f(xi) + f(xi-1)]/ (2h)  
= h(fi - fi-1) / 2  
NhvËy :  
S3 = h[(fo+f1)+(f1+f2)+(f2+f3)] / 2  
= h[fo+2f1+2f2+f3] / 2  
Mét c¸ch tæng qu¸t chóng ta cã :  
ba  
n
=
+ 2f1 + ⋅⋅ + 2fn1 + 2fn  
(fo  
)
Sn  
hay :  
n
ba  
n
=
+2  
+f  
{fo  
}
fi  
Sn  
n
i=1  
Mét c¸ch kh¸c ta cã thÓ viÕt :  
a+(k+1)h  
n1  
b
n1  
f(x)dx =  
f(x)dx ≈  
a+kh  
{hf(a + kh) / 2 + f[a + (k +1)h] / 2}  
k=0  
k=1  
a
hay :  
b
f(x)dx = h{f(a) / 2 + f(a + h) + ⋅⋅ + f[a + (n 1)h] + f(b) / 2}  
a
Ch¬ng tr×nh tÝnh tÝch ph©n theo ph¬ng ph¸p h×nh thang nhsau :  
Ch¬ng tr×nh 12-2  
//tinh tich phan bang phuong phap hinh_thang;  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
float f(float x)  
{
float a=exp(-x)*sin(x);  
return(a);  
};  
207  
void main()  
{
int i,n;  
float a,b,x,y,h,s,tp;  
clrscr();  
printf("Tinh tich phan theo phuong phap hinh thang\n");  
printf("Cho can duoi a = ");  
scanf("%f",&a);  
printf("Cho can tren b = ");  
scanf("%f",&b);  
printf("Cho so buoc n = ");  
scanf("%d",&n);  
h=(b-a)/n;  
x=a;  
s=(f(a)+f(b))/2;  
for (i=1;i<=n;i++)  
{
x=x+h;  
s=s+f(x);  
}
tp=s*h;  
printf("Gia tri cua tich phan la : %10.6f\n",tp);  
getch();  
}
Dïng ch¬ng tr×nh nµy tÝnh tÝch ph©n cña hµm cho trong function trong kho¶ng [0 ,  
1] víi 20 ®iÓm chia ta cã J = 0.261084.  
§4. C«ng thøc Simpson  
Kh¸c víi ph¬ng ph¸p h×nh thang , ta chia ®o¹n [a,b] thµnh 2n phÇn ®Òu nhau bëi  
c¸c ®iÓm chia xi :  
a = xo < x1 < x2 < ....< x2n = b  
xi = a+ih ; h = (b - a)/ 2n víi i =0 , . . , 2n  
Do yi = f(xi) nªn ta cã :  
b
x2  
x4  
x2n  
f(x)dx = fdx + fdx +... + fdx  
a
x0  
x2  
x2n2  
§Ó tÝnh tÝch ph©n nµy ta thay hµm f(x) ë vÕ ph¶i b»ng ®a thøc néi suy Newton tiÕn  
bËc 2 :  
+ t(t1)  
=
+
y0 ty0  
2 y  
(x)  
P2  
0
2t  
vµ víi tÝch ph©n thø nhÊt ta cã :  
x2  
x2  
=
f(x)dx  
(x)dx  
P
2
x0  
x0  
§æi biÕn x = x0+th th× dx = hdt , víi x0 th× t =0 vµ víi x2 th× t = 2 nªn :  
208  
x2  
2
+ 1(t1)  
+
= h  
(y ty  
2 y  
0 )dt  
(x)dx  
P
2
0
0
2
0
x0  
+ t2  
2
t3 t2  
h[y  
y0  
2 y  
t=2  
+ 1  
=
(
)]|t=0  
0 t  
0
2 3 2  
2 y  
]
+ 1  
8 4  
=
+
h[2y0 2y0  
(
)∆  
0
2 3 2  
= h  
3
+
+
[y 4y y  
]
0
1
2
§èi víi c¸c tÝch ph©n sau ta còng cã kÕt qu¶ t¬ng tù :  
x2i+2  
= h  
3
+
+
[y2i 4y2i+1 y2i+2  
f(x)dx  
]
x2i  
Céng c¸c tÝch ph©n trªn ta cã :  
b
= h  
3
+
+
+ ⋅⋅ +  
+
+
+ ⋅⋅ +  
+
[yo 4(y1 y3  
y2n1 2(y2 y4  
y2n2 y2n  
)
]
f(x)dx  
)
a
Ch¬ng tr×nh dïng thuËt to¸n Simpson nhsau :  
Ch¬ng tr×nh 12-3  
//Phuong phap Simpson;  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
float y(float x)  
{
float a=4/(1+x*x);  
return(a);  
}
void main()  
{
int i,n;  
float a,b,e,x,h,x2,y2,x4,y4,tp;  
clrscr();  
printf("Tinh tich phan theo phuong phap Simpson\n");  
printf("Cho can duoi a = ");  
scanf("%f",&a);  
printf("Cho can tren b = ");  
scanf("%f",&b);  
printf("Cho so diem tinh n = ");  
scanf("%d",&n);  
h=(b-a)/n;  
x2=a+h;  
x4=a+h/2;  
y4=y(x4);  
y2=y(x2);  
for (i=1;i<=n-2;i++)  
{
209  
x2+=h;  
x4+=h;  
y4+=y(x4);  
y2+=y(x2);  
}
y2=2*y2;  
y4=4*(y4+y(x4+h));  
tp=h*(y4+y2+y(a)+y(b))/6;  
printf("Gia tri cua tich phan la : %10.8f\n",tp);  
getch();  
}
Dïng ch¬ng tr×nh nµy tÝnh tÝch ph©n cña hµm trong function trong ®o¹n [0,1] víi 20  
kho¶ng chia cho ta kÕt qu¶ J = 3.14159265.  
210  
pdf 7 trang Thùy Anh 27/04/2022 3700
Bạn đang xem tài liệu "Giáo trình C++ - Chương 12: Tính gần đúng đạo hàm và tích phân xác định", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_c_chuong_12_tinh_gan_dung_dao_ham_va_tich_phan_xa.pdf