1. Trang chủ
  2. » Công Nghệ Thông Tin

Đạo hàm và tích phân c nâng cao và c++ chap 12

7 6,9K 42

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 101,86 KB

Nội dung

Chương 12 : Tính gần đúng đạo hàm và tích phân xác định Đạ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... Với lần tính này sai

Trang 1

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

Đạ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) :

⋅⋅

⋅ + +

′′′

+

′′

+

′ +

=

! 4

h ) x ( f

! 3

h ) x ( f 2

h ) x ( f h ) x ( ) h

x

4 3

2

⋅⋅

ư +

′′′

ư

′′

+

ư

=

! 4

h ) x ( f

! 3

h ) x ( f 2

h ) x ( f h ) x ( ) h

x

4 3

2

Trừ (1) cho (2) ta có :

⋅ + +

′′′

+

=

ư

ư

! 5

h ) x ( f

! 3

h 2 ) x ( f h 2 ) h x ( ) h

x

5 3

Như vậy rút ra :

ư

ư

′′′

ư

ư

ư +

=

! 5

h ) x ( f

! 3

h h

) h x ( ) h x ( )

x

(

4 2

hay ta có thể viết lại :

=

6

4 4

2

2h a h a h a

) h x ( ) h x ( h

1 )

x

(

trong đó các hệ số ai phụ thuộc f và x

Ta đặt :

)]

h x ( ) h x ( [ h

1 ) h

Như vậy từ (5) và (6) ta có :

⋅⋅

ư

ư

ư

ư

= ϕ

6

4 4

2

2h a h a h a

) x ( f ) h ( ) 1 , 1 (

⋅⋅

ư

ư

ư

ư

=

⎛ ϕ

=

64

h a 16

h a 4

h a ) x ( f 2

h ) 1 , 2 ( D

6 6

4 4

2

và tổng quát với hi = h/2i-1 ta có :

⋅⋅

ư

ư

ư

ư

= ϕ

i 6

4 i 4

2 i 2

i) f (x) a h a h a h h

( ) 1 , (

Ta tạo ra sai phân D(1,1) - 4D(2,1) và có :

⋅⋅

ư

ư

ư

ư

=

⎛ ϕ

ư

6

4

4 a h 16

15 h a 4

3 ) x ( f 3 2

h 4 ) h

Chia hai vế của (10) cho -3 ta nhận được :

⋅⋅

⋅ + +

+

=

ư

6

4

4 a h 16

5 h a 4

1 ) x ( f 4

) 1 , 1 ( D ) 1 , 2 ( D 4 ) 2 , 2 (

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 :

D(2, )2 f x( ) 1 a h( / ) a h( / )

5

4 4 6 6

và khử số hạng có h4 bằng cách tạo ra :

D(2, )2 16D( , )3 2 15f x( ) 15 a h( )

64 6

6

Chia hai vế của (13) cho -15 ta có :

D(3, )3 16D(3, )2 D(2, )2 f x( ) a h .

15

1

64 6 6

Trang 2

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)

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

j

(i, ) = (i, ) (i , )

ư

ư

ư

1

1

và giá trị khởi đầu là :

h f x h f x h

i

(i, )1 ( ) 1 [ ( ) ( )]

2

với hi = h/2i-1

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

xác của đạo hàm là 4.2

201843569

4 )]

75 1 ( ) 25 2 ( [ 25 0 2

1 )

1 , 2 ( D

207496266

4 )]

5 1 ( ) 5 2 ( [ 5 0 2

1 ) 1 , 1 ( D

=

ư

ì

=

=

ư

ì

=

200458976

4 )]

875 1 ( ) 125 2 ( [ 125 0 2

1 )

1 , 3 (

ì

=

200492284

4 1

4

) 2 , 2 ( D ) 2 , 3 ( D 4 ) 3 , 3 ( D

200458976

4 1

4

) 1 , 2 ( D ) 1 , 3 ( D 4 ) 2 , 3 ( D

19995935

4 1

4

) 1 , 1 ( D ) 1 , 2 ( D 4 ) 2 , 2 ( D

21 2 1 1 1 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()

{

Trang 3

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);

{

h=h/2;

d[k]=dy(x);

p=1.0;

{

p=4*p;

d[j]=(p*d[j+1]-d[j])/(p-1);

} }

getch();

}

float y(float x)

{

return(a);

}

float dy(float x)

{

return(b);

}

Mục đích của tính tích phân xác định là đánh giá định lượng biểu thức :

a

b

=∫ ( )dx

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

B y

x

Trang 4

J f x x x

lim ( )( )

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 :

i

n

S =h f

=

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

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ó :

) f 2 f 2 f 2 f n

a b

S n = ư o+ 1 + ⋅ + ư1 + n

hay :

} f 2 f f { n

a b

S

n

1 i i o

=

=

Một cách khác ta có thể viết :

a

b

a kh

k

n

k

n

+

+ +

=

ư

=

ư 1

1

1

0

1

hay :

a

b

( )dx = { ( ) / + ( + ) + ⋅⋅⋅ + [ + ( ư ) ] + ( ) / }

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)

{

return(a);

};

Trang 5

void main()

{

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;

{

x=x+h;

s=s+f(x);

}

tp=s*h;

printf("Gia tri cua tich phan la : %10.6f\n",tp);

getch();

}

1] với 20 điểm chia ta có J = 0.261084

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ó :

ư

+ + +

x

fdx

x x fdx b

a

x x

fdx dx

) x (

n

2 n 4

2 2

0

Để 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 :

y t 2

) 1 t ( t y t y ) x (

2 0

0

2 = + ∆ + ư ∆

và với tích phân thứ nhất ta có :

dx ) x ( P dx ) x (

x x

x x

2 0 2

0

2

Đổi biến x = x0+th thì dx = hdt , với x0 thì t =0 và với x2 thì t = 2 nên :

Trang 6

| ] y ) 2

t 3

t ( 2

1 y 2

t t y [ h

dt ) y 2

) 1 t ( 1 y t y ( h dx ) x ( P

2 t 0 t 0 2 2 3

0 2

0

0 2 0

2

0 0 2

x x

2 0

=

=

− +

+

=

+ +

=

] y y y [ 3 h

] y ) 2

4 3

8 ( 2

1 y 2 y [ h

2 1 0

0 2 0

0

+ +

=

− +

+

§èi víi c¸c tÝch ph©n sau ta còng cã kÕt qu¶ t−¬ng tù :

] y y 4 y [ 3

h dx ) x ( 2i 2i1 2i 2 x

x

2 i 2 i 2

+ + + +

=

∫+

Céng c¸c tÝch ph©n trªn ta cã :

] y ) y y y ( 2 ) y y y ( 4 y [ 3

h dx ) x

b 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)

{

return(a);

}

void main()

{

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);

{

Trang 7

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();

}

kho¶ng chia cho ta kÕt qu¶ J = 3.14159265

Ngày đăng: 27/03/2014, 11:32

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w