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!  
Nh− vË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(x−h)]  
Nh− vË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ã :  
j−1D(i,j−1)−D(i−1,j−1)  
4
=
D(i,j)  
4j−1−1  
vµ gi¸ trÞ khëi ®Çu lµ :  
1
2hi  
=
=
ϕ(h  
D(i,1)  
víi hi = h/2i-1 .  
)
[f(x+hi)−f(x−hi)]  
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)  
41−1  
1D(3,1)−D(2,1)  
= 4  
= 4  
41−1  
2 D(3,2)−D(2,2)  
421−1  
Ch−¬ng tr×nh tÝnh ®¹o hµm nh− d−í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). Nh− vË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 nh− võ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 nh− h×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  
Nh− vË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ã :  
b−a  
n
=
+ 2f1 + ⋅⋅⋅ + 2fn−1 + 2fn  
(fo  
)
Sn  
hay :  
n
b−a  
n
=
+2  
+f  
{fo  
}
fi  
∑
Sn  
n
i=1  
Mét c¸ch kh¸c ta cã thÓ viÕt :  
a+(k+1)h  
n−1  
b
n−1  
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 nh− sau :  
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  
x2n−2  
§Ó 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(t−1)  
=
+
y0 t∆y0  
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(t−1)  
+
= h  
∆
(y t∆y  
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 2∆y0  
(
)∆  
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  
y2n−1 2(y2 y4  
y2n−2 y2n  
)
]
f(x)dx  
)
∫
a
Ch−¬ng tr×nh dïng thuËt to¸n Simpson nh− sau :  
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 12760 Free
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