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
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
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:
- giao_trinh_c_chuong_12_tinh_gan_dung_dao_ham_va_tich_phan_xa.pdf