TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH
Trang 1DANH SÁCH THÀNH VIÊN: Phạm Văn Vũ
Phan Long Việt Đoàn Ngọc Thuận Trương Hoàng Nhu
ĐỀ TÀI 9: TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH
I ĐẶT VẤN ĐỀ
-Xét tích phân xác định của một hàm số f(x) trong khoảng [a,b] : I =
b a
f(x)dx
-Nếu hàm f(x) liên tục trên [a,b] và có nguyên hàm F(x), thì I có thể tính một cách đơn giản thông qua
công thức Newton-Leibniz: I =
b a
f(x)dx = F(b) - F(a) -Thực tế thì chúng ta thường khó khăn khi tìm nguyên hàm hoặc nguyên hàm quá phức tạp không thể xác
định được
-Trong những trường hợp này người ta phải tính gần đúng Có nhiều cách để tính gần đúng tích phân, ví
dụ có thể dùng ngay định nghĩa của tích phân : I =
1
i i 0
f (x ) x lim
n
n i
-Tuy nhiên tổng Darboux hội tụ rất chậm, do đó để đạt được độ chính xác cao đòi hỏi một khối lượng tính
toán rất lớn
-Sau đây là một số phương pháp tính gần đúng tích phân hay được dùng Ý tưởng cơ bản của phương pháp này
là chia nhỏ khoảng [a,b] cần lấy tích phân, sau đó trên mỗi khoảng nhỏ này ta xấp xỉ hàm số bằng một đa thức
Với các đa thức ta có thể dùng nguyên hàm của chúng để tính tích phân, sau đó ta cộng các tích phân thành
phần để được xấp xỉ của tích phân toàn thể
Công Thức hình thang
Công thức parabol
II.GIẢI QUYẾT VẤN ĐỀ:
CƠ SỞ LÝ LUẬN
SƠ ĐỒ TỔNG QUÁT CHO PHƯƠNG PHÁP :
SỐ ĐOẠN CHIA SAI SỐ
H,M 2 ,M 4
Bảng giá trị f(x)
Tích Phân Gần Đúng
Trang 2Page 2
1 Công thức hình thang
a.Công thức hình thang và sai số
Để tính gần đúng
b
a f(x)dx
ta thay hàm số dưới dấu tích phân f(x) bằng đa thức nội suy đi qua hai điểm A(a,f(a)) và B(b,f(b)).và ta có:
b
1 a
f(x)dx (x)dx
b a P
Để Tính tích phân xác định ở vế phải ta đổi biến số: dx=(b-a)dt,t biến thiên từ 0 đến 1
1
t f(x)dx (x)= ( )(b-a)dt=(b-a)(y t+ y )
2
b
t t a
Trong đó : y0 =f(a); y0=y1-y0=f(b)-f(a)
b-a f(x)dx (f(a)+f(b)) (I)
2
b
a
Vậy (I) gọi là công thức hình thang:
Xác định sai số:
2
b
a
b a
giả thiết y=f(x) có đạo hàm cấp hai liên tục trên[a,b].M là hàm số h=b-a
R=R(h)= ( ) [ ( ) ( )]
2
a h a
h
Đạo hàm theo h 2 lần ta có:
R h f a h f a f b f ah f a h f a f ah
R h f a h f a h f ah f ah
Mà: R(0)=0;R’(0)=0
Áp dụng định lý trung bình thứ hai của tích phân xác định:
2
h
R h R R t dt tf at dt f c tdt f c c a ah
Và
3
h
R h R R t dt t f c dt f c t dt f c c a ah Vậy y=f(x) có đạo hàm cấp hai liên tục trên[a,b]
Vây Ta có công thức hình thang sau và sai số:
3 '' ( ) [ ( ) ( )] ( )( )
b
a
f x dx f a f b f c II
Với h=b-a và c thuộc(a,b)
Trang 3b.công thức hình thang tổng quát và sai số:
- Ta chia đoạn [a,b] thành n đoạn con bằng nhau:
Chia [a, b] n đoạn bằng nhau, độ dài h = (b– a)/n
(n+1) điểm chia: x0 = a < x1 = a + h < x2 = a + 2h < … < xn = b
- Xét bảng số liệu sau:
- Xấp xỉ hàm f(x) trên đoạn [x0,x1] bởi đa thức nội suy bậc nhất trên hai mốc nội suy [x0,x1]
P(x) = y0L0(x) + y1L1(x) = y0
0 1
1
y
f(x) P(x)
x
0 1 x
y +y f(x)dx ( )dx =h[ ]
2
x x
P x
- Mặt khác chúng ta làm nhƣ vậy nhiều đoạn sau đó cộng lại ta đƣợc:
b
a
y +y f(x)dx h( y y )
2
b a
I (III)
Vậy (III) đƣợc gọi là công thức hình thang tổng quát:
Xác định sai số:
3
"
h
i
(IV)
Với ci(xi-1,xi)
Xét trung bình cộng: "
1
1
( )
n i i
f c n
Và gồm gía trị nhỏ nhất m2 và giá trị lớn nhất M2 của đạo hàm cấp hai f”(x) trên [a,b],( m2, M2 giá trị trung gian): m2 M2
Do đó tìm đƣợc điểm c [a,b] sao cho =f”(c) hay: " "
1
n
i i
f c n nf c
Thay vào (IV) ta đƣợc:
Trang 4Page 4
R(h)=
Vậy công thức tổng quát hình thang tổng quát và sai số:
2
"
0 n
b
a
b a h
c Ví dụ: Dùng công thức hình thang tổng quát và tính gần đúng :
1
1 0
dx x
I
Giải
Ta có : h = 1 0
10
=0,1 Kết quả tính toán trong bảng sau
Theo công thức hình thang tổng quát ta có :
I 0.1 (1.00000 0.50000
2
+ 0.90909 + 0.83333 + 0.76923 + 0.71429 + 0.66667 + 0.62500 + 0.58824 +0.55556 + 0.52623) 0.69377
Sai số đƣợc xác định là :
( )
f x = 1
1 x
(1+x)
-1
'( )
f x - (1+x)-2
7 0.7 0.58824
9 0.9 0.52623
Trang 5''( ) ( 1)( 2)
f x (1+x)-3 = 2 3
(1x) 2
2
12 2.(0,1)
(1 0) 0, 00167 0, 002 12
b a h
R
Vậy I = 0.694 0.002
d Chương trình minh họa
Thuật toán được thực hiện trong chương trình có khác chút ít so với thuật toán đã trình bày ở trên Xuất phát từ n=1, h=b-a, ta sẽ tăng n lên gấp đôi tại mỗi bước tính toán Quá trình tính toán sẽ dừng lại nếu sự khác biệt của tích phân xấp xỉ ở bước hiện tại so với bước trước đó nhỏ hơn một số epsilon cho trước Ta sẽ phân tổng tích phân thành 3 tổng s0,s1 và s2 Tổng s0 = (f(a)+f(b))/2; mỗi lần tăng n lên gấp đôi thì ta chỉ cần tính lại tổng s2 ở các vị trí 1,3,5, ,n-1 Tổng s1 là tổng của các giá trị hàm tại các điểm không phải là đầu mút Sau khi tính lại s2, ta tính lại s1 bằng phép gán
s1=s1+s2
Và tổng xấp xỉ của tích phân là
I
n = h(s0+s1) Sau đây là đoạn chính của chương trình thể hiện ( mô tả) thuật toán
/*Phương pháp tính xấp xỉ tích phân bằng phương pháp hình thang
trên khỏang [a,b]*/
/*Phương pháp hình thang tính tích phân xác định trong khỏang [a,b]
Biến gttp là giá trị xấp xỉ của tích phân tính được
Trả về giá trị true nếu đã đạt được độ chính xác*/
int hinhthang(double (*f)(double),double a,double b,double >tp,
Double&err,int &khoangchia)
{clrscr();
Double s0,s1,s2,h,tp,tp1;int k, nkc,i;
Kvecto x;
Nkc=1;
h=b-a
s0=(f(a)+f(b))/2
s1=0;
tp=(s0+s1)*h;
do
{tp1=tp;
nkc=nkc*2;
h=h/2;
s2=0;//bat dau tinh tong tai cac diem moi
for(i=1; i<nkc;i+=2)s2+=f(a+i*h);
s1=s1+s2;
tp=h*(s0+s1);
Trang 6Page 6
if(nkc>nmax)
{cout<<endl<< “tich phan chua hoi tu voi “<<nmax<<” khoang chia”;
delay(1000);return false;
}
}
While(fabs(tp-tp1)>epsi );
Err=fabs(tp-tp1);khoangchia=nkc;gttp=tp;
Return(true);
}
2.Công thức parabol (Simsơn)
a công thức simsơn và sai số
Ta chia đoạn [a;b] thành 2n đoạn con bằng nhau
a = x0 < x1 <…< x2n = b
xi = a + ih,
2
b a h
n
yi = f(xi)
i = 0; 1; 2; …; 2n
Để tính tích phân coi khoảng nối 3 điểm liên tiếp nhau là 1 đoạn (như vậy qua 2n + 1 điểm ta có n đoạn), đoạn thứ i( i = 0, 1, 2,…,n) gồm các điểm x2i, x2i+1, x2i+2, và trong mỗi đoạn con ta dùng đa thức nội suy bậc 2 p2(x)
Giả sử các điểm của một đoạn con là x0, x1, x2 và các giá trị f(x) tương ứng là y0, y1, y2, ta có:
2
f x dx p x dx
Trong đó:
o
x x
h
ta có: dx = hdt,
Nếu x = xo thì t =0, x = x2 thì t = 2
Như vậy
2
0
2
2
2
0
1
x
x
t
t t
t h
Vậy (I) được gọi là công thức Simpson:
Xác định sai số
3
b
a
h
R f x dx y y y
Trang 7Ta giả thiết rằng hàm số y = f(x) có đạo hàm cấp bốn liên tục trên [a, b] cố định điểm giữa x1 và xem R là hàm
số của h h0
1
3
x h
x h
h
Đạo hàm 3 lần theo h đẳng thức trên, ta có:
1
1
h
h
h
h
''
3
h
h
Áp dụng công thức số gia hữu hạn (công thức Lagrăng) đối với f’’’(x) ta có
3
h
R h f C C x h x h
Mà: R(0) = 0; R’(0) = 0; R’’(0) = 0
Từ đó áp dụng định lý trung bình thứ hai của tích phân xác định Ta nhận đƣợc:
1
(0) '
Tóm lại, với giả thiết hàm số y = f(x) có đạo hàm cấp bốn liên tục trên [a, b]
Trang 8Page 8
Vậy Ta có công thức Simsơn và sai số:
4
b
a
2
b a
h c a b
b.Công thức Simsơn tổng quát và sai số
Để tính gần đúng b
a
f x dx
ta chia [a,b] thành n = 2m đoạn bằng nhau (nghĩa là n là số nguyên, dương và chẵn):[ , ],[ ,x x0 1 x x1 2], ,[x2m2, x2m1],[x2m1,x2m]
Có độ dài là :
2
h
bởi các điểm chia:
0
2
a, a ih
(i 1, 2 1),
i
n m
Ký hiệu: y i f x i ,i0,n khi đó:
m
x
b
Đối với mỗi tích phân xác định ở vế phải của (II) ta tính gần đúng bằng công thức Simsơn (I), ta nhận được:
( 0 4 1 2) ( 2 4 3 4 ( 2 2 4 2 1 2 )
b
a
f x dx y y y y y y y y y
3
a
Hay:
( 0 2 ) 4( 1 3 2 1) 2( 2 4 2 2) (III)
3
b
a
h
f x dx y y y y y y y y
Công thức (III) được gọi là công thức SimSon tổng quát
Trang 9Nếu hàm số y = f(x) có đạo hàm cấp bốn liên tục trên [a;b] thì do (IV),
sai số của công thức SimSon tổng quát là:
5 4
( ) 4 ) ( ) 4 ( )
k
Với
2 2 2
c x x
Lập luận tương tự trường hợp công thức hình thang tổng quát, vì f(4)( )x , theo giả thiết, liên tục trên [a;b] nên tìm được điểm c[ ; ]a b sao cho:
1
1
m
k k
m
Thay vào công thức ta được:
R f c f c c a b
Tóm lại, với giả thiết hàm số y = f(x) có đạo hàm cấp bốn liên tục trên [a;b] và chia đoạn lấy tích phân [a;b] thành n = 2m đoạn bằng nhau, có độ dài
2
h
Vậy Ta có công thức SimSon tổng quát và sai số:
b
a
f x dx y y y y y y y y f c c a b
c.Ví dụ :
1
1 0
dx x
I
Giải
Ta có : h = 1 0
10
=0,1 Kết quả tính toán trong bảng sau
Trang 10Page 10
Nếu dung công thức Simson tổng quát, ta có :
I 0.3
1 ( 1.00000 + 0.50000 + 4.3,45955 + 2.2,72818) = 0,69315
Sai số đƣợc xác định là :
( )
f x = 1
1 x
(1+x)
-1
'( )
f x - (1+x)-2
''( ) ( 1)( 2)
f x (1+x)-3 = 2 3
(1x) '''( ) ( 1)( 2)( 3)
f x (1 + x )-4
( )( 1)( 2)( 3)( 4)(1 )
(1x) 4
4
5
180 24(0,1)
(1 0) 1,3.10 0, 00002 180
b a h
R
Vậy I=0,69315 0,00002
7 0.7 0.58824
9 0.9 0.52623
Trang 11d.Chương trình minh họa
Sau đây là đoạn chương trình thể hiện (mô tả) thuật toán:
//SIMSON.CPP
/*Phuong phap tinh xap xi tich phan bang phuong phap Simson
(pp cau phuong) tren khoang [a;b]
Bien gttp la gia tri xap xi cua tich phan tinh duoc
Tra ve gia tri true neu da dat duoc do chinh xac*/
int simson(double(*f)(double),double a, double b, double >tp,
double & err,int & khoang chia)
{clrscr();
double s0,s1,s2,h,tp,tp1;int k,nkc,i;
kvecto x;
nkc=1;
h=b-a;
h=b-a;
s0=f(a)+f(b);
s1=0;
s2=0;
tp=(s0+2*s1+4+s2)*h/3;
do
{tp1=tp;
s1=s1+s2
nkc=nkc*2;
h=h/2
s2=0;//bat dau tinh tong tai cac diem moi
for(i=1;i<nkc;i+=2)s2=s2+f(a+i*h);
tp=(s0+2*s1+4*s2)*h/3;
if(nkc>nmax)
{cout<<end<< “tich phan chua hoi tu voi “<<nmax<< “khoang chia”;
delay(1000);return false;
}
}
while(fabs(tp-tp1)>epsi);
err=fabs(tp-tp1);khoangchia = nkc;gttp=tp;
return true;
}
III:Tài Liệu Tham khảo
Thư viện trường đại học sư phạm kỉ thuật
Thư viện trường đại học bách khoa
CHƯƠNG TRÌNH Tính gần đúng tích phân xác định
# include <stdio.h>
Trang 12Page 12
# include "conio.h"
# include "math.h"
# define PI 3.14159
float d[10];int n;
double g(double x)
{
return 1/(1+x*x);
}
double tp(double (*f)(double),float a,float b)
{
int n=100,i;
float s,h=(b-a)/n;
s=(f(a)+f(b))/2;
for (i=1; i<n;i++) s+=f(a+i*h);
return s*h;
}
void nhap(float *a, int *n)
{ int i;
printf("\n Nhap bac da thuc: ");scanf("%d",n);
printf("\n Nhap he so cua ham da thuc:\n");
for (i=0;i<=*n; ++i) {
printf(" a[%d]=",i);
scanf("%f",a+i);
}
}
double f(double x)
{
float p=d[0]; int i;
for(i=1;i<=n;i++) p=p*x+d[i];
return p;
}
main()
{ float a,b; char tt;
while (1) {
printf("\n Nhap can de tinh tich phan: "); scanf("%f%f",&a,&b);
/*printf("a= "); scanf("%f",&a);
printf("b= "); scanf("%f",&b);*/
printf("\nS1=%.3f",tp(sin,0,PI));
printf("\nS2=%.3f",tp(cos,0,PI/2));
printf("\nS3=%.3f",tp(g,a,b));
Trang 13nhap(d,&n);
printf("\nS4=%.3f",tp(f,a,b));
printf("\n\n Ban tiep tuc ko(c/k)?");
tt=getch();
if (tt!='c') break;
}
}