You are on page 1of 15

Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI


KHOA TOÁN TIN ỨNG DỤNG
----- -----

TIỂU LUẬN
Đề tài: Giải phương trình một ẩn f(x) = 0
bằng phương pháp chia đôi
Giáo viên hướng dẫn: Nguyễn Hữu Điển

Sinh viên thực hiện : Tô Văn Ba

Lớp: toán 2-k51.

Hà Nội, tháng 11 năm 2009

1
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

Giới thiệu
Maple là một phần mềm tính toán do hang Maple Soft, một bộ phận chủ yếu của
liên hợp công ty Waterloo Maple phát triển. Cho đến nay Maple đã được phát
triển qua nhiều phiên bản khác nhau và ngày càng hoàn thiện. Maple có cách
cài đặt đơn giản, chạy trên tất cả các hệ điều hành, có cấu trúc linh hoạt dễ sử
dụng tối ưu cấu hình máy và đặc biệt có trình trợ giúp ( Help ) rất dễ sử dụng. Từ
phiên bản 7, Maple cung cấp ngày càng nhiều các công cụ trực quan, các gói
lệnh tự học gắn liền với toán phổ thông và đại học. Ưu điểm đó đã làm cho nhiều
nước trên thế giới lựa chọn sử dụng Maple cùng với các phần mềm toán học
khác trong giảng dạy học toán trước đòi hỏi của thực tiễn và sự phát triển của
giáo dục

Các tính năng cơ bản của Maple:

• Là một hệ thống tính toán trên các biểu thức đại số


• Có thể thực hiện được hầu hết các phép toán cơ bản trong chương trình
toán đại học và phổ thông
• Cung cấp các công cụ minh họa hình học thuận tiện gồm: vẽ đồ thị tĩnh và
động của các đường và mặt được cho bởi các hàm tùy ý trong nhiều hệ
tọa độ khác nhau
• Một ngôn ngữ lập trình đơn giản và mạnh mẽ có khả năng tương tác với
nhiều ngôn ngữ lập trình khác
• Cho phép trích xuất ra các định dạng khác nhau như LaTex, Word,
HTML,…
• Một công cụ biên soạn giáo án và bài giảng điện tử, thích hợp với các lớp
học tương tác trực tiếp
• Một trợ giáo hữu ích cho hoc sinh trong việc tự học

2
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

Giải phương trình một ẩn f(x) = 0 bằng phương pháp chia đôi

I.Giới thiệu bài toán

Trong thực tế có rất nhiều bài toán không thể tìm nghiệm bằng cách giải thông
thường., để tìm được nghiệm ta phải sử dụng một số phương pháp lặp để tìm
được nghiệm gần đúng. Phương pháp chia đôi khoảng nghiệm là một trong
những phương pháp tìm nghiệm của phương trình f(x) = 0

Xét phương trình một ẩn:

f(x) = 0 (*)

trong đó f là hàm cho trước với đối số x

Ta đi tìm nghiêm của bài toán trên.

Định lý: Nếu một hàm f(x) đơn điệu ( tăng hoặc giảm ) trên một đoạn [a, b] nào
đó và f(x) có đạo hàm không đổi dấu trên đoạn đó thì chắc chắn phương trình
f(x) = 0 có nghiệm duy nhất c nào đó trong đoạn [a, b].

Đoạn [a, b] được gọi là khoảng phân ly nghiệm của phương trình f(x) = 0.

Để tìm nghiệm gần đúng c, ta thực hiện một số hữu hạn lần quá trình lặp các
bước sau đây:

1. Bước 1: ta chọn c là điểm chính giữa của đoạn [a, b]


C=(a+b)/2
2. Bước 2: nếu f(c) = 0 thì ta khẳng định ngay c là nghiệm cần tìm và
chuyển sang bước 4, ngược lại chuyển sang bước 3.
3. Bước 3:
• nếu f(a)*(c) < 0 thì ta đặt b := c và quay về bước 1.

3
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

• nếu f(a)*(c) > 0 thì ta đặt a := c và quay về bước 1.


4. Bước 4: thông báo nghiệm c tìm được và kết thúc công việc tìm nghiệm
của phương trình f(x) = 0.

Quá trình trên gọi là phương pháp chia đôi bởi vì cứ mỗi một lần lặp lại từ đầu
thì khoảng [a, b] cần xem xét được thu gọn lại còn một nửa so với trước bởi
điểm chính giữa c. Quá trình lặp trên cũng dừng khi đoạn [a, b] quá ngắn (nhỏ
hơn một số dương nào đó gọi là sai số ε ).

Ta có sơ đồ

Tính c = ( a + b )/2 ,

Đ f(c)*f(a) < S

b := c a := c

Tính e := b - a

e<ε
S

Đ
Kết quả : α a |α-a|< ε

α b |α-b|< ε

II. Các hàm và các lệnh sử dụng trong chương trình

Maple là một ngôn ngữ lập trình hướng thủ tục (procedure). Chúng ta có thể làm
việc với Maple bằng hai chế độ khác nhau: Chế độ tương tác trực tiếp thông qua
việc nhập từng lệnh đơn lẻ ngay tại dấu nhắc lệnh của Maple và nhận được
ngay kết quả của lệnh đó. Chế độ thủ tục được thực hiện bằng cách đóng gói
một dãy các lệnh xử lí cùng một công việc vào trong một thủ tục (procedure) duy

4
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

nhất, sau đó ta chỉ cần gọi thủ tục này và Maple tự động thực hiện các lệnh có
trong thủ tục đó một cách tuần tự và sau đó trả lại kết quả cuối cùng.
Maple chứa một lượng rất lớn các hàm tạo sẵn đáp ứng cho những yêu cầu tính
toán khác nhau trong nhiều lĩnh vực. Các hàm này được lưu trữ trong các gói
thủ tục (package) và người sử dụng có thể dễ dàng gọi đến mỗi khi cần thiết.
Tuy nhiên, người dùng Maple có thể tự tạo cho riêng mình những gói thủ tục
cũng như có thể trao đổi dùng chung những gói thủ tục nào đấy, phục vụ cho
công việc mang tính đặc thù riêng của mình.
Các khái niệm cơ bản cần phải nắm vững để tạo ra một thủ tục (procedure) là:
Cấu trúc proc()..end; cùng với các khai báo trong cấu trúc này (global, local,
option,...).
1.Khai báo một thủ tục
Lời gọi khai báo một thủ tục:
Procedure_name:=proc(parameter_sequence)
[local local_sequence]
[global global_sequence]
[options options_sequence];
Statements_sequences;
End;
Giải thích các khai báo:
• parameter_name: Là một dãy các kí hiệu, ngăn cách nhau bởi các dấu
phẩy, chứa tên các tham biến truyền cho thủ tục.
• local_sequence: Là một dãy các tên được khai báo là biến cục bộ trong
thủ tục, nó chỉ có giá trị sử dụng trong phạm vi thủ tục đang xét (local
được sử dụng để khai báo cho các biến chỉ sử dụng bên trong một thủ
tục).
• global_sequen: Dãy các tên biến toàn cục có giá trị sử dụng ngay cả bên
ngoài thủ tục.
• options_sequence: Dãy các tuỳ chọn cho một thủ tục.
• statements_sequence: Dãy các câu lệnh do người lập trình đưa vào.

5
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

2.Tham biến
Tham biến (parameter) là các biến được đặt giữa hai dấu ngoặc trong biểu thức
proc(...). Tham biến được dùng để nhận dữ liệu truyền cho thủ tục khi gọi thủ tục
đó. Ví dụ ta có thể khai báo thủ tục tính tổng của 2 số [tong:=proc(x,y) x+y; end.]
thì khi gọi thủ tục này để tính tổng của hai số 10 và 5 ta phải truyền các dữ liệu
này cho các tham biến (cho x nhận giá trị là 10, y nhận giá trị là 5), tức là tại dấu
nhắc lệnh ta phải viết tong(10, 5); và sau khi thực hiện thủ tục trả lại kết quả là
15.
Tham biến có tính cục bộ: chúng chỉ được sử dụng bên trong thủ tục đã được
khai báo, bên ngoài thủ tục này chúng không mang ý nghĩa gì.
Kiểu của tham biến có thể được khai báo trực tiếp.
3.Phạm vi các biến
Biến toàn cục:
Biến toàn cục được khai báo sau từ khoá global trong khai báo thủ tục.
Biến toàn cục được khai báo bên trong một thủ tục, nhưng có phạm vi giá
trị trong toàn bộ chương trình, tức là bên ngoài phạm vi của thủ tục mà nó
được khai báo trong đó.
Biến cục bộ:
Biến cục bộ được khai báo sau từ khoá local trong khai báo thủ tục.
Biến cục bộ chỉ có giá trị bên trong thủ tục mà nó được khai báo. Ngoài
thủ tục này nó không mang ý nghĩa gì.
Tham biến
Cũng giống như biến cục bộ, các tham biến chỉ có giá trị bên trong phạm
vi của thủ tục mà nó được khai báo. Sau khi thủ tục kết thúc, chúng không
còn giá trị.
Tham biến còn được sử dụng để trả lại kết quả, như các ngôn ngữ lập
trình truyền thống. Ngoài ra, do Maple có những hàm có khả năng trả lại
nhiều hơn một giá trị. Ta có thể gộp các giá trị này vào một danh sách để
trả lại như một phần tử.

6
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

4.Vòng lặp while


While <điều kiện> do
<dãy lệnh>;
od;
Chức năng:
Vòng lặp while cho phép lặp chuỗi các câu lệnh giữa do và od khi mà điều kiện
condition vẫn còn đúng (tức là biểu thức điều kiện cho giá trị true). Điều kiện
condition được kiểm tra ngay tại đầu mỗi vòng lặp, nếu nó thỏa mãn (giá trị của
nó là đúng) thì các câu lệnh bên trong được thực hiện, sau đó lại tiếp tục kiểm
tra điều kiện condition cho đến khi điều kiện không còn thỏa mãn nữa. Vòng lặp
while thường được sử dụng khi số lần lặp một hay một chuỗi biểu thức là không
xác định rõ, đồng thời ta muốn các biểu thức đó cần được lặp trong khi một điều
kiện nào đó còn được thỏa mãn.
Điều kiện condition trong vòng lặp phải là một biểu thức boolean, tức là giá trị
của nó chỉ có thể là đúng hoặc sai, nếu không thì sẽ sinh ra lỗi.
Trong trường hợp muốn thoát ra khỏi vòng lặp ngay từ trong giữa vòng lặp, ta có
thể thực hiện bằng cách dùng câu lệnh RETURN, break hoặc quit.
Vòng lặp While cho phép lặp chuỗi các câu lệnh nằm giữa do và od khi mà điều
kiện vẫn còn đúng.
5.Câu lệnh if
if <condition> then
<statement sequence>
else <statement sequence>;
fi;

Chức năng:
Nếu bạn muốn một dãy biểu thức được thực hiện khi điều kiện nào đó được
thoả mãn và một dãy biểu thức khác được thực hiện nếu trái lại thì có thể dùng
câu lệnh if- then- else- fi. Trong câu lệnh trên, nếu điều kiện condition là đúng thì
chuỗi biểu thức đứng sau then được thực hiện, nếu trái lại thì điều kiện condition
sau từ khoá elif sẽ được kiểm tra, nếu nó đúng thì chuỗi lệnh tương ứng sau

7
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

then được thực hiện, cứ tiếp tục cho đến khi các điều kiện condition đều không
thỏa mãn, thì các biểu thức sau lệnh else được thực hiện.
6.tính toán với độ chính xác theo yêu cầu
Lệnh evalf
Cú pháp 1:
evalf (bieu_thuc)

Chức năng: tính toán chính xác giá trị của biểu thức và biểu diễn kết quả với
mặc định là 10 chữ số.
Cú pháp 2:
evalf (bieu_thuc, k)

Chức năng: tính toán chính xác giá trị của biểu thức và biểu diễn kết quả với k
chữ số.
7. Hàm vẽ đồ thị trong mặt phẳng
Trong Maple hàm plot() được cung cấp để vẽ đồ thị của một hay nhiều biểu thức
có chứa những thủ tục, hàm với tham số, hoặc các điểm trong không gian hai
chiều
Cu pháp:
plot(<Biểu thức>,<Biến>=<Khoảng biến thiên>,<Dẫy tùy chọn>);
III. Chương trình

> chiadoi:=proc(f,a,b,delta)
local alpha,beta,m;
alpha:=a;
beta:=b;
m:=(alpha+beta)/2;
while abs(beta-alpha)>=delta do
if evalf(f(alpha)*f(m)<0) then
beta:=m;
m:=(alpha+beta)/2;
else
alpha:=m;
m:=(alpha+beta)/2;
fi;
print(0.5*(alpha+beta));
od;

end;
8
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

ví dụ 1: tìm nghiệm của phương trình f(x) = x-sin(Pi*x)

(bài tập 2.2 trang 54 - bài giảng lập trình tính toán tác giả Nguyễn Hữu Điển)

> f:=x->x-sin(Pi*x);
f := x → x − sin( π x )
> plot(f,-2..2);

> chiadoi(f,-1,-0.5,0.00000001);

-0.6250000000
-0.6875000000
-0.7187500000
-0.7343750000
-0.7421875000
-0.7382812500
-0.7363281250
-0.7373046875
-0.7368164060
-0.7365722655
-0.7364501955
-0.7365112305
-0.7364807130
-0.7364959715

9
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

-0.7364883420
-0.7364845275
-0.7364826200
-0.7364835740
-0.7364840505
-0.7364842890
-0.7364844085
-0.7364844680
-0.7364844380
-0.7364844530
-0.7364844455
-0.7364844495
> chiadoi(f,0.5,1,0.00000001);

0.6250000000
0.6875000000
0.7187500000
0.7343750000
0.7421875000
0.7382812500
0.7363281250
0.7373046875
0.7368164060
0.7365722655
0.7364501955
0.7365112305
0.7364807130
0.7364959715
0.7364883420
0.7364845275
0.7364826200
0.7364835740
0.7364840505
0.7364842890
0.7364844085
0.7364844680
0.7364844380
0.7364844530
0.7364844455
0.7364844495

10
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

ví dụ 1: tìm nghiệm của phương trình f(x) = x-cos(Pi*x)

(bài tập 2.3 trang 55 - bài giảng lập trình tính toán tác giả Nguyễn Hữu Điển)

> f:=x->x-cos(Pi*x);
f := x → x − cos( π x )
> plot(f,-2..2);

> chiadoi(f,-0.9,-0.7,0.00000001);

-0.7500000000
-0.7750000000
-0.7875000000
-0.7937500000

11
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

-0.7906250000
-0.7890625000
-0.7898437500
-0.7894531250
-0.7896484375
-0.7897460940
-0.7897949220
-0.7898193360
-0.7898315430
-0.7898376465
-0.7898345950
-0.7898330690
-0.7898323060
-0.7898326875
-0.7898324965
-0.7898325920
-0.7898326400
-0.7898326160
-0.7898326280
-0.7898326335
-0.7898326305
> chiadoi(f,0,1,0.00000001);

0.2500000000
0.3750000000
0.4375000000
0.4062500000
0.3906250000
0.3828125000
0.3789062500
0.3769531250
0.3779296875
0.3774414062
0.3771972656
0.3770751953
0.3770141602
0.3769836426
0.3769683838
0.3769607544
0.3769645691
0.3769664764
0.3769674301
0.3769669533

12
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

0.3769671917
0.3769670725
0.3769670129
0.3769669831
0.3769669980
0.3769670054
0.3769670092

ví dụ 1: tìm nghiệm của phương trình f(x) = sin(x) - exp(-x)

(bài tập 2.4 trang 56 - bài giảng lập trình tính toán tác giả Nguyễn Hữu Điển)

> f:=x->sin(x)-exp(-x);
( −x )
f := x → sin( x ) − e
> plot(f,0..7);

13
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

> chiadoi(f,0.5,1,0.0001);

0.6250000000
0.5625000000
0.5937500000
0.5781250000
0.5859375000
0.5898437500
0.5878906250
0.5888671875
0.5883789060
0.5886230470
0.5885009765
0.5885620120
0.5885314945
> chiadoi(f,6,6.5,0.0001);

6.375000000
6.312500000
6.281250000
6.296875000
6.289062500
6.285156250
6.283203125
6.284179690
6.284667970
6.284912110
6.285034180
6.285095215
6.285064695

14
Sv:Tô Văn Ba Toán Tin2_k51 Gv:Nguyễn Hữu Điển

Kết luận
Như vậy, qua bài báo cáo này chúng ta đã tìm hiểu được phần nào về cú pháp,
hàm được sử dụng trong Maple.Đồng thời chúng ta cũng thấy được sự hỗ trợ
mạnh mẽ trong Maple. Thông thường để giải quyết bài toán trên chúng ta phải đi
tìm khoảng phân ly nghiệm [a, b], điều này thật không đơn giản. Tuy nhiên với
sự hỗ trợ mạnh mẽ về đồ thị trong Maple bài toán trở lên đơn giàn khi ta có thể
nhìn ngay khoảng phân ly trên đồ thị và có thể kiểm tra kết quả thông qua đồ thị.

Tuy vậy, do những hạn chế về mặt cá nhân em lên trong bài báo cáo còn nhiều
sai sót, em mong được sự nhận xét đóng góp ý kiến của thầy

Em xin chân thành cảm ơn

Tài liệu tham khảo


1. Hướng dẫn sử dụng Maple – Nguyễn Hữu Điển
2. Bài giảng lập trình tính toán - Nguyễn Hữu Điển
3. maplevn2008.wordpress.com/

15

You might also like