Giải phương trình một ẩn f(x) = 0 bằng phương pháp chia đôi
Trang 1TRƯỜ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
Trang 2Giớ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
Trang 3Giả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
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
Trang 4• 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 ,
Tính e := b - a
f(c)*f(a) <
e < ε
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
Trang 5nhấ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
Trang 62.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ử
Trang 74.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
Trang 8then đượ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;
Trang 9ví 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
Trang 10-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
Trang 11ví 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
Trang 12-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
Trang 130.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);
:=
f x → sin x( ) − e(−x)
> plot(f,0 7);
Trang 14
> 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
Trang 15Kế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