Sv:Tơ Văn Ba Tố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: tốn 2-k51.
Hà Nội, tháng 11 năm 2009
1
Sv:Tơ Văn Ba Tốn Tin2_k51
Gv:Nguyễn Hữu Điển
Giới thiệu
Maple là một phần mềm tính tố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 tố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 tố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 tố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 tốn cơ bản trong chương trình
tố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 Tố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 tốn
Trong thực tế có rất nhiều bài tố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 tố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.
b
a
Để 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 Tố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.
Q 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) <
b := c
S
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 Tố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 u cầu tính
tố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 tồn cục có giá trị sử dụng ngay cả bên
ngồ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 Tố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 ngồ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 tồn bộ chương trình, tức là bên ngồ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. Ngồ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. Ngồ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 Tố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 thố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ừ khố 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 Tố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 tốn với độ chính xác theo u cầu
Lệnh evalf
Cú pháp 1:
evalf (bieu_thuc)
Chức năng: tính tố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 tố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 Tố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 tố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 Tố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 Tố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 tố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 Tố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 Tố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 tốn tác giả Nguyễn Hữu Điển)
> f:=x->sin(x)-exp(-x);
f := x → sin( x ) − e
> plot(f,0..7);
13
( −x )
Sv:Tơ Văn Ba Tố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 Tố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 tố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 tốn - Nguyễn Hữu Điển
3. maplevn2008.wordpress.com/
15