Tính tích phân xác định bằng phương pháp chuỗi hàm
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: Tính tích phân xác định bằng phương pháp chuỗi hàm
Giáo viên hướng dẫn: Nguyễn Hữu Điển Sinh viên thực hiện : Nguyễn Mạnh Lưu và Nguyễn Nhân Quý
Lớp: Toán – Tin 2- K51
Hà Nội, tháng 11 năm 2009
Trang 2Phần I: Giới thiệu
1 Giới thiệu chung về phần mềm Maple
- Maple là một phần mềm tính toán do hãng 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
- Từ năm 1980 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 Phiên bản hiện tại là Maple 13 được phát hành vào tháng 5 năm 2009
- Với phần mềm Maple, chúng ta có thể:
+ Thực hiện các tính toán với khối lượng lớn, với thời gian nhanh và độ chính xác cao + Sử dụng các gói chuyên dụng của Maple để giải quyết các bài toán cụ thể như: vẽ đồ thị
(gói plot), hình học giải tích (gói geometry), đại số tuyến tính (gói linalg),
+ Thiết kế các đối tượng 3 chiều
+ v.v
Chức năng cốt lõi:
-Người dùng có thể nhập biểu thức toán học theo các ký hiệu toán học truyền thống Có thể dễ dàng tạo ra những giao diện người dùng tùy chọn Maple hỗ trợ cho cả tính toán
số và tính toán hình thức, cũng như hiển thị Nhiều phép tính số học được thực hiện dựa trên thư viện số học NAG; trong Maple, các chương trình con NAG đã được mở rộng để cho phép độ chính xác ngẫu nhiên lớn Các ví dụ về tính toán hình thức sẽ được trình bày trong phần sau
-Maple cũng có một ngôn ngữ lập trình cấp cao đầy đủ Cũng có giao diện cho những ngôn ngữ khác (C, Fortran, Java, MatLab, và Visual Basic) Cũng có một giao diện dành cho Excel
Kiến trúc:
-Phần lớn chức năng toán học của Maple được viết bằng ngôn ngữ Maple, và được thông dịch bởi nhân Maple Nhân Maple được viết bằng C Maple chạy trên tất cả các hệ điều hành chính
-Ngôn ngữ lập trình Maple là một ngôn ngữ kiểu động Cũng giống như các hệ thống đại
số máy tính, các biểu thức hình thức được lưu trữ trong bộ nhớ theo đồ thị không chu trình có hướng (DAG) Ngôn ngữ cho phép các biến có phạm vi nhất định (lexical
Trang 3scoping) Ngôn ngữ có hình thức lập trình hàm, nhưng cũng có hỗ trợ đầy đủ cho lập trình truyền thống, theo kiểu mệnh lệnh
-Một điều lạ đối với chương trình thương mại, đa số mã nguồn đều có thể xem tự do
Nguồn gốc tên gọi:
-Tên "Maple" không phải là tên viết tắt hoặc từ cấu tạo bằng chữ đầu, mà chỉ đơn giản là
để chỉ hình tượng Lá phong (tiếng Anh: maple) trên Quốc kỳ Canada
Lịch sử:
Khái niệm đầu tiên về Maple xuất phát từ một cuộc họp vào tháng 11 năm 1980 tại Đại học Waterloo Những nhà nghiên cứu tại đại học muốn mua một máy tính đủ mạnh để chạy Macsyma Thay vào đó, người ta quyết định họ sẽ phát triển hệ thống đại số máy tính riêng để có thể chạy được những máy tính có giá thành hợp lý hơn Do đó, dự án bắt đầu với mục tiêu là tạo ra một hệ thống đại số hình thức mà các nhà nghiên cứu và sinh viên có thể truy cập được
Sự phát triển đầu tiên của Maple được tiến hành rất nhanh, với phiên bản hạn chế đầu tiên xuất hiện vào tháng 12 năm 1980 Những nhà nghiên cứu đã thử nghiệm và loại bỏ nhiều ý tưởng khác nhau để tạo ra một hệ thống liên tục cải tiến Maple được trình diễn đầu tiên tại những hội nghị bắt đầu vào năm 1982
Đến cuối năm 1983, trên 50 trường đại học đã cài Maple trên máy của họ Do số lượng
hỗ trợ và yêu cầu giấy phép lớn, vào năm 1984, nhóm nghiên cứu đã sắp xếp với WATCOM Products Inc để cấp phép và phân phối Maple
Vào năm 1988, do số lượng hỗ trợ ngày càng tăng, Waterloo Maple Inc được thành lập Mục tiêu đầu tiên của công ty là quản lý những bản phân phối phần mềm Cuối cùng, công ty cũng phải mở ra phòng R&D ở đó khá nhiều sự phát triển cho Maple được thực hiện đến ngày nay Sự phát triển đáng kể của Maple tiếp tục diễn rại những phòng thí nghiệm trường đại học, bao gồm: Phòng thí nghiệm Tính toán hình thức tại Đại học Waterloo; Trung tâm nghiên cứu Tính toán hình thức Ontario tại Đại học Tây Ontario;
và những phòng thí nghiệm khắp nơi trên thế giới
Vào năm 1989, giao diện đồ họa người dùng đầu tiên của Maple được phát triển và bao gồm trong bản 4.3 dành cho Macintosh Những phiên bản trước của Maple chỉ gồm giao diện dòng lệnh với ngõ ra hai chiều Bản X11 và Windows với giao diện mới tiếp bước vào năm 1980 với Maple V
Vào năm 1999, với việc phát hành Maple 6, Maple đã đưa vào một số Thư viện Số học NAG, được mở rộng độ chính xác ngẫu nhiên
Trang 4Vào năm 2003, giao diện "chuẩn" hiện nay được giới thiệu trong Maple 9 Giao diện này được viết chủ yếu bằng Java (mặc dù có nhiều phần, nhưng luật cho việc gõ công thức toán học, được viết bằng ngôn ngữ Maple) Giao diện Java bị phê phán là chậm[3]; những sự phát triển được thực hiện trong các bản sau, mặc dù tài liệu Maple 11 documentation[4] khuyến cáo giao diện (“cổ điển”) trước đây dành cho người với bộ nhớ vật lý ít hơn 500 MB Giao diện cổ điển này không còn được bảo trì
Giữa 1995 và 2005 Maple đã mất khá nhiều thị phần vào tay đối thủ do có giao diện người dùng yếu hơn[5] Nhưng vào năm 2005, Maple 10 giới thiệu một “chế độ văn bản” mới, như một phần của giao diện chuẩn Tính năng chính của chế độ này là phép toán được đưa vào bằng ngõ nhập hai chiều, do đó nó xuất hiện tương tự như công thức trong sách Vào năm 2008, Maple 12 đã thêm những tính năn giao diện người dùng giống như Mathematica, gồm có những kiểu trình bày theo mục đích đặc biệt, quản lý phần đầu và cuối trang, so trùng mở đóng ngoặc, vùng thực hiện tự động, mẫu hoàn thành lệnh, kiểm tra cú pháp và vùng tự động khởi tạo Những tính năng khác được thêm
để làm cho Maple dễ dùng hơn như một hộp công cụ Maple
2.Ví dụ cơ bản
i.Tính toán số học thông dụng
.Các phép toán số học: +, -, *, /
Lũy thừa: ^, giai thừa: x!
Logarit: ln(x), log[a](b), exp(x)
Các hàm lượng giác: sin(x), cos(x), tan(x), cot(x),
Một số hàm khác: abs(x) := |x|, sqrt(x) := căn bậc 2 của x
> (-10+5^2)*(4-sqrt(36));
> 99!;
> cot(Pi/4);
> 6!;
ii.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) - 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ố
>22/7: evalf(%);
Trang 5Cú pháp 2: evalf(bieu_thuc, k) - 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ố
> evalf(Pi,500);
iii Giải phương trình nghiệm nguyên
.Lệnh isolve:
Cú pháp 1: isolve(phuong_trinh/he_phuong_trinh);
> isolve({x+y=36,2*x+4*y=100});
Cú pháp 2: isolve(phuong_trinh/he_phuong_trinh, <danh_sach_tham_so>);
> isolve(x+y=5,{a,b,c});
iv.Khái niệm biến số, hằng số
.Trong Maple, biến số được sử dụng thoải mái mà không cần khai báo, định nghĩa trước Biến số, hằng số được đặt tên thỏa mãn một số quy tắc sau:
+ Không bắt đầu bằng chữ số
+ Không chứa khoảng trắng và một số ký tự đặc biệt như: %,^,&,*,$,#,
+ Không được trùng với tên một số hàm và lệnh của Maple: sin, cos, ln, min, max,
.Một biến số sẽ trở thành hằng số ngay khi nó được gán cho một giá trị nào đó
.Nếu muốn biến một hằng số trở lại biến số, ta dùng phép gán: ten_bien:='ten_bien'; > x:=2;
> x:='x';
v Định nghĩa hàm số
.Cách 1: sử dụng toán tử ->
Cú pháp: ten_ham := bien -> bieu_thuc_ham_so;
> f := x->x^2+x;
.Cách 2: sử dụng lệnh unapply
Trang 6Cú pháp: ten_ham := unapply(bieu_thuc, bien);
> g:=unapply(x^3+2,x);
g(4);
.Định nghĩa hàm từng khúc
Cú pháp: ten_ham := bien -> piecewise(đk_1, bt_1, đk_2, bt_2, , đk_n, bt_n);
Ý nghĩa: nếu đk_i đúng thì hàm nhận giá trị là bt_i
> f:=x->piecewise(x<=-1,x^2-1,x<=1,-abs(x)+1,sin(x-1)/x);
f(1);
vi.Vẽ đồ thị và các vấn đề liên quan
.Khởi tạo các hàm vẽ đồ thị
> with(plots);
> with(plottools);
.Vẽ đồ thị trong không gian 2 chiều Oxy
+Vẽ đồ thị hàm thông thường:
Cú pháp: plot(ham_can_ve, x=gt_dau gt_cuoi, y=gt_dau gt_cuoi, cac_tuy_chon); Một số tùy chọn thông dụng:
- Đặt màu cho đồ thị: color = <màu>
- Đặt độ dày k cho đồ thị: thickness = k
- Đặt số điểm vẽ cho đồ thị: numpoints = k;
> plot(x^3-3*x^2+1,x=-5 5,y=-5 5);
> f:=x->abs(x^3-x^2-2*x)/3-abs(x+1);
plot(f(x),x=-5 5,y=-5 5);
+Vẽ nhiều đồ thị trên cùng một hệ trục
Cú pháp: plot([ham_1, ham_2, ], x=gt_dau gt_cuoi, y=gt_dau gt_cuoi,
cac_tuy_chon);
> plot([x^2,sin(x)],x=-2 2,color=[red,green]);
.Vẽ đồ thị trong không gian 3 chiều Oxyz
Trang 7Cú pháp: plot3d(ham_can_ve,x=gt_dau gt_cuoi,y=gt_dau gt_cuoi,z=gt_dau gt_cuoi, cac_tuy_chon);
> plot3d(x*exp(x^2),x=-2 2,y=-2 2,title="Do thi trong khong gian 3 chieu");
> plot3d(-exp(-abs(x*y)/10)*sin(x+y)-cos(x*y),x=-Pi Pi,y=-Pi Pi,grid=[51,51]);
.Sự vận động của đồ thị
Cú pháp:
animate(ham_co_tham_so,x=gt_dau gt_cuoi, tham_so = gt_dau gt_cuoi);
> animate(t*x^2,x=-3 3,t=-5 5)
animate3d(ham_co_tham_so,x=gt_dau gt_cuoi, y=gt_dau gt_cuoi, tham_so =
gt_dau gt_cuoi);
> animate3d(cos(t*x)*sin(t*y),x=-Pi Pi,y=-Pi Pi,t=1 5);
Ý nghĩa: hiển thị sự biến đổi, vận động của đồ thị khi tham số thay đổi trong khoảng cho trước
vii.Tính giới hạn, đạo hàm, tích phân
.Tính giới hạn
Cú pháp: limit(ham_so,x=a);
Limit(ham_so,x=a);
Ý nghĩa: tính giới hạn của ham_so khi x tiến đến a Kết quả được thể hiện dưới dạng công thức (lệnh Limit) hoặc kết quả cụ thể (lệnh limit)
> f:=x->((sin(2*x))^2-sin(x)*sin(4*x))/x^4;
Limit(f(x),x=0);
value(%);
limit(f(x),x=0);
Chú ý: muốn tính giới hạn của hàm số khi x tiến đến vô cực, ta chỉ việc thay a bằng từ khóa infinity
> g := x->(2*x+3)/(7*x+5);
Trang 8Limit(g(x),x=infinity);
value(%);
limit(g(x),x=infinity);
Chú ý: muốn tính giới hạn của hàm số khi x tiến đến a từ bên trái hay bên phải, ta thêm vào một trong hai tùy chọn left hoặc right
> h := x->tan(x+Pi/2);
Limit(h(x),x=0,left);
value(%);
limit(h(x),x=0,right);
.Tính đạo hàm
+Tính đạo hàm cấp 1
Cú pháp: diff(ham_so, bien);
Diff(ham_so, bien);
Ý nghĩa: tính đạo hàm cấp 1 của ham_so theo bien Kết quả được thể hiện dưới dạng công thức (lệnh Diff) hoặc kết quả cụ thể (lệnh diff)
> f := x->x^2*sqrt(x^2+1);
Diff(f(x),x);
value(%);
diff(f(x),x);
simplify(%);
+Tính đạo hàm cấp cao
Cú pháp: diff(ham_so, bien, bien, bien, );
Diff(ham_so, bien, bien, bien, );
diff(ham_so, bien$k);
Diff(ham_so, bien$k);
Ý nghĩa: tính đạo hàm cấp k của ham_so theo bien Kết quả được thể hiện dưới dạng công thức (lệnh Diff) hoặc kết quả cụ thể (lệnh diff)
> g := x->5*x^3-3*x^2-2*x^(-3);
Trang 9Diff(g(x),x,x);
h := x -> x^4 + x*sin(x);
diff(h(x),x$2);
simplify(%);
.Tính tích phân
+Tính tích phân xác định
Cú pháp: int(ham_so, bien=a b);
Int(ham_so, bien=a b);
Ý nghĩa: tính tích phân của ham_so với bien đi từ a đến b Kết quả được thể hiện dưới dạng công thức (lệnh Diff) hoặc kết quả cụ thể (lệnh diff)
> f := x->1/(exp(x)+5);
Int(f(x),x=0 ln(2));
value(%);
evalf(%);
g := x->cos(x)^2*cos(4*x);
int(g(x),x=0 Pi/2);
Chú ý: ta có thể tính tích phân mở rộng khi a hay b có thể là vô cực (infinity)
> t := x->x/(x^4+1);
int(t(x),x=0 infinity);
+Tính tích phân bất định
Cú pháp: int(ham_so, bien);
Int(ham_so, bien);
Ý nghĩa: tính tích phân của ham_so theo biến Kết quả được thể hiện dưới dạng công thức (lệnh Diff) hoặc kết quả cụ thể (lệnh diff)
> h := x->(3*x^2+3*x+3)/(x^3-3*x+2);
t:=x->int(h(x),x);
t(x);
viii Ứng Dụng
Trang 10.Bài toán khảo sát hàm số
Khảo sát và vẽ đồ thị hàm số f(x)=(-x^2+3*x-3)/(2*x-2);
>with(plots);
f:=x->(-x^2+3*x-3)/(2*(x-1)):
f1:=x->diff(f(x),x):
f1(x):
simplify(f1(x)):
a:=solve(f1(x)=0,x):
ct1:=a[1]:
ct2:=a[2]:
f(ct1):
f(ct2):
f2:=x->diff(f(x),x$2):
f2(x):
simplify(f2(x)):
f(x):
convert(f(x),parfrac,x):
g1:=plot([-0.5*x+1,f(x)],x=-3 5,y=-2 4,color=[blue,red],discont=true): g2:=implicitplot(x=1,x=-3 5,y=-2 4,color=green):
display({g1,g2});
Trang 11Phần II: Bài toán
1 Giới thiêu bài toán
Bài toán: Tính gần đúng tích phân xác định nhờ chuỗi hàm:
Xét tích phân:
Giả sử f(x) có thể khai triển được thành chuỗi lũy thừa, hội tụ đều trên [p,q], thì ta có thể tính tích phân từng số hạng của chuỗi lũy thừa để được chuỗi số là giá trị của tích phân cần tính Từ chuỗi số ta lấy một số số hạng đầu tiên của chuỗi, ta được giá trị gần đúng của tích phân Sai số được đánh giá nhờ phần dư của chuỗi số
Ta khai triển hàm f(x) theo công thức Taylor thành chuỗi lũy thừa:
g(x) =
Trang 12
Trong đó
Ta sẽ lấy cho n một giá trị khá lớn để có được giá trị I là tích phân gần đúng của hàm f(x)
2 Thuật toán:
Bước 1 Chuẩn bị:
- Gán giá trị của a
- Tính giá trị f(0):
- Tính giá trị đầu tiên của g:
Bước 2: Thực hiện vòng lặp để tính f(i):
Bước 3: Thực hiện vòng lặp để tính g(x):
Trang 13
Bước 4: Tính kết quả:
Bước 5: Kết luận và in ra kết quả:
3 Code
4 Một số trường hợp cụ thể:
TH1: Hàm
Với số vòng lặp n = 10
Đầu vào:
Trang 14Kết quả:
TH2: Hàm
Với số vòng lặp n = 200
Đầu vào:
Trang 15Kết quả:
TH3: Hàm:
Với số vòng lặp n = 10;
Trang 16Đầu vào:
Kết quả:
TH4: Hàm:
Với số vòng lặp là n = 500
Đầu vào:
Trang 17Kết quả:
TH5: Hàm:
Đầu vào:
Trang 18Kết quả:
Phần IV: Kết luận
− Từ những ví dụ trên ta nhận thấy nếu giá trị đầu vào với n càng lớn (tức là thực hiện càng nhiều vòng lặp) thì kết quả của phép tính tích phân xác định nhờ chuỗi hàm có giá trị càng chính xác
− Đối với những hàm đa thức, cận của tích phân không ảnh hưởng quá lớn đến kết quả cuối cùng của phép tính Đối với các hàm khác (ví dụ hàm lũy thừa, …) thì giá trị của cận sẽ ảnh hưởng nhiều đến giá trị cuối cùng của phép tính
− Có một số hàm khi tính tích phân bằng thuật toán này trên phần mềm Maple dù tăng số vòng lặp lên rất lớn khiến cho thời gian xử lý rất chậm vẫn không thu được kết quả có độ chính xác cao
− Thuật toán trên chỉ phù hợp để tính tích phân xác định cho những hàm không quá phức tạp
Trang 19Phần VI: Phụ lục
1 Tài liệu tham khảo
• Website: http://nhdien.wordpress.com
• Ebook: Hướng dẫn sử dụng maple (.chm) – tác giả: GS Nguyễn Hữu Điển
• Ebook: Tài liệu môn lập trính tính toán (scientific.pdf) – tác giả: GS Nguyễn Hữu Điển
• Website: http://vi.wikipedia.org
• Và một số thông tin trên mạng internet khác
2 Công cụ:
• Phần mềm Maple 13.0 của hãng Mapsoft
• Phần mềm soạn thảo OpenOffice.org 3.0
• Phần mềm làm việc theo nhóm Google docs (http://docs.google.com)