You are on page 1of 332

NGUYỄN HỮU ĐIỂN

THỰC HÀNH TÍNH TOÁN


TRONG MAPLE

NHÀ XUẤT BẢN ĐẠI HỌC QUỐC GIA HÀ NỘI


NỘI DUNG
Mục lục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Lời nói đầu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Những kí hiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Danh sách hình. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Danh sách bảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Chương 1. Các lệnh tương tác với Maple . . . . . . . . . . . . . . . . . . 21
1.1. Thực hiện phép toán số học trong Maple. . . . . . . . . . . . . . . . . 21
1.2. Biến số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.3. Các hàm toán học của Maple . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.4. Các hằng số toán học của Maple . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.5. Dấu ngoặc đơn và độ ưu tiên phép toán . . . . . . . . . . . . . . . . . . 27
1.6. Những thành phần của biểu thức . . . . . . . . . . . . . . . . . . . . . . . . 29
1.7. Dãy biểu thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.8. Cấu trúc tập hợp và danh sách trong Maple . . . . . . . . . . . . . 34
1.9. Tính toán số với độ chính xác bất kỳ . . . . . . . . . . . . . . . . . . . . . 36
1.10. Định nghĩa hàm đơn giản trong Maple . . . . . . . . . . . . . . . . . 37
1.11. Lệnh alias đặt bí danh các hàm và ký hiệu . . . . . . . . . . . . . 39
1.12. Sửa chữa lỗi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.13. Đưa kết quả ra bằng print và lprint . . . . . . . . . . . . . . . . . . . . 41
1.14. Bài tập có lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
1.15. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Chương 2. Maple với giải tích sơ cấp. . . . . . . . . . . . . . . . . . . . . . . 45
2.1. Giải các phương trình đại số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.2. Phép thế biểu thức bằng hàm subs . . . . . . . . . . . . . . . . . . . . . . 49
2.3. Giải số các phương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.4. Tính giới hạn các hàm số thực và số phức. . . . . . . . . . . . . . . . 53
2.5. Tính tổng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.6. Chuỗi nguyên . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.7. Tính đạo hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
2.8. Tính tích phân xác định và không xác định . . . . . . . . . . . . . . 59
2.9. Giải phương trình sai phân bằng rsolve . . . . . . . . . . . . . . . . . 60
2.10. Hàm thực hiện trên mọi phần tử biểu thức . . . . . . . . . . . . . 62

3
4 Thực hành tính toán

2.11. Bài tập có lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63


2.12. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Chương 3. Maple với đại số sơ cấp . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.1. Rút gọn biểu thức bằng simplify . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.2. Khai triển một tích ra thừa số . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.3. Kết hợp các số hạng đa thức bằng combine . . . . . . . . . . . . . . 70
3.4. Giản ước các phân thức bằng normal . . . . . . . . . . . . . . . . . . . . 73
3.5. Tổ chức đa thức bằng collect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6. Sắp xếp các số hạng bằng sort . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.7. Phân tích đa thức ra thừa số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.8. Chuyển đổi giữa các dạng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.9. Tìm hệ số của đa thức. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.10. Bài tập có hướng dẫn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.11. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Chương 4. Maple với đại số tuyến tính . . . . . . . . . . . . . . . . . . . . 85
4.1. Bảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.2. Mảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.3. Tạo hệ thống chỉ số cho mảng và bảng . . . . . . . . . . . . . . . . . . . 91
4.4. Ma trận và vectơ cùng các phép toán . . . . . . . . . . . . . . . . . . . . 92
4.5. Gói lệnh đại số tuyến tính trong Maple . . . . . . . . . . . . . . . . . . 95
4.6. Toán tử tạo cấu trúc ma trận và vectơ . . . . . . . . . . . . . . . . . . 101
4.7. Gọi lệnh của gói lệnh thông qua with . . . . . . . . . . . . . . . . . . . 105
4.8. Gói lệnh đại số tuyến tính mới . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.9. Bài tập luyện tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
4.10. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Chương 5. Vẽ hình trong Maple . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
5.1. Một số hệ tọa độ trong không gian hai chiều . . . . . . . . . . . 113
5.2. Hàm vẽ đồ thị trong không gian hai chiều . . . . . . . . . . . . . . 119
5.3. Hàm polarplot vẽ đồ thị trong tọa độ cực . . . . . . . . . . . . . . . 124
5.4. Ánh xạ bảo giác . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.5. Một số lệnh khác vẽ đồ thị trên mặt phẳng . . . . . . . . . . . . . 128
Mục lục 5

5.6. Đồ thị trong không gian ba chiều . . . . . . . . . . . . . . . . . . . . . . . 130


5.7. Các lệnh vẽ đồ thị đặc biệt trong không gian . . . . . . . . . . . 139
5.8. Vẽ khối đa diện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
5.9. Làm hoạt hình đồ thị . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
5.10. Bài tập có lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
5.11. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Chương 6. Lập trình trong Maple . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.1. Cơ sở dữ liệu của Maple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
6.2. Các câu lệnh có cấu trúc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
6.3. Toán tử break và next trong while - for . . . . . . . . . . . . . . . . . 164
6.4. Tạo lập thủ tục hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
6.5. Tạo lập thủ tục đơn giản trong Maple . . . . . . . . . . . . . . . . . . 167
6.6. Biến cục bộ, hàm return và hàm error . . . . . . . . . . . . . . . . . . 168
6.7. Những toán tử tính toán trong Maple . . . . . . . . . . . . . . . . . . 175
6.8. trace và printlevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
6.9. Xem mã thư viện nguồn của Maple . . . . . . . . . . . . . . . . . . . . . 181
6.10. Chuyển mã Maple ra C, fortran, latex. . . . . . . . . . . . . . . . . 182
6.11. Một số thuật toán cổ điển . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
6.12. Phương pháp Newton trong giải tích số . . . . . . . . . . . . . . . 192
6.13. Bài tập luyện tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
6.14. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Chương 7. Maple với phương trình vi phân. . . . . . . . . . . . . . 201
7.1. Lệnh biểu diễn đạo hàm và tích phân . . . . . . . . . . . . . . . . . . 201
7.2. Giải phương trình vi phân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
7.3. Nghiệm giải tích của phương trình vi phân. . . . . . . . . . . . . 208
7.4. Giải số phương trình vi phân . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
7.5. Gói lệnh Detools vẽ đồ thị nghiệm . . . . . . . . . . . . . . . . . . . . . . 215
7.6. Vi phân của hàm nhiều biến . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
7.7. Tích phân của hàm nhiều biến . . . . . . . . . . . . . . . . . . . . . . . . . 222
7.8. Giải tích vectơ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
7.9. Chuỗi và tích vectơ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
7.10. Biến đổi tích phân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
6 Thực hành tính toán

7.11. Bài tập có lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232


7.12. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Chương 8. Lời giải và gợi ý bài tập . . . . . . . . . . . . . . . . . . . . . . . 237
8.1. Lời giải bài tập chương 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
8.2. Lời giải bài tập chương 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
8.3. Lời giải bài tập chương 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
8.4. Lời giải bài tập chương 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
8.5. Lời giải bài tập chương 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
8.6. Lời giải bài tập chương 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
8.7. Lời giải bài tập chương 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Phụ lục A. Giao diện của Maple 17 . . . . . . . . . . . . . . . . . . . . . . . 255
A.1. Cài đặt Maple 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
A.2. Giao diện của Maple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
A.3. Định dạng dữ liệu đầu vào và đầu ra của Maple 17 . . . . 257
A.4. Chuyển đổi các dạng biểu thức toán . . . . . . . . . . . . . . . . . . . . 258
A.5. Lệnh phím tắt quan trọng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Phụ lục B. Thư viện gói lệnh của maple 17 . . . . . . . . . . . . . . 263
B.1. Những chú ý về gói lệnh của Maple 17 . . . . . . . . . . . . . . . . . 263
B.2. Gói lệnh Student . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
B.3. Danh sách gói lệnh trong Maple 17 . . . . . . . . . . . . . . . . . . . . 265
Phụ lục C. Các lệnh thường dùng maple . . . . . . . . . . . . . . . . . 273
Phụ lục D. Gói lệnh đại số tuyến tính . . . . . . . . . . . . . . . . . . . . 283
Phụ lục E. Gói lệnh vẽ đồ thị plots . . . . . . . . . . . . . . . . . . . . . . . 305
Tài liệu tham khảo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Danh mục từ khóa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
LỜI NÓI ĐẦU

Ngày nay máy tính đã thâm nhập vào hầu hết các lĩnh vực khoa
học và đời sống. Nhiều chương trình ứng dụng đã được phát triển
liên quan tới quản lý dữ liệu, in ấn, đồ họa, sử lý ảnh... Riêng đối với
ngành toán đã có những sản phẩm phần mềm mang tính phổ dụng
như Mathematica, Matlab, Maple,... và nhiều chương trình chuyên
dụng cho từng bộ môn của toán học. Những phần mềm trên giúp ích
rất nhiều cho việc giảng dạy toán, học toán cũng như việc ứng dụng
toán trong các ngành kỹ thuật, kinh tế, và vì thế tại các nước phát
triển chúng trở thành cẩm nang của nhiều sinh viên, kỹ sư và các
ngành nghiên cứu khoa học. Ngày nay đã có phiên bản 17 của Maple
tốt hơn rất nhiều so với trước kia.
Maple là một hệ phần mềm chuyên dụng cho tính toán bao gồm
các tính toán thuần túy bằng ký hiệu toán học, các tính toán số và
các tính toán bằng đồ thị. Sản phẩm này do trường Đại học Tổng hợp
Waterloo (Canada) và trường đại học kỹ thuật Zurich (ETZ) xây dựng
và đưa vào thương mại đầu tiên năm 1985. Qua nhiều lần cải tiến,
hiện nay Maple 17 đã được phổ biến rộng rãi trên thế giới. Những
đặc tính căn bản của Maple 17 là dễ sử dụng, đòi hỏi cấu hình máy
không lớn, đáp ứng nhu cầu tính toán của nhiều đối tượng. Ngoài
ra Maple 17 còn được thiết kế thích hợp với chế độ tương tác người
và máy, cho phép người dùng phát triển các môđul chuyên dụng, lập
trình hoặc thư viện riêng ngay trong phần mềm của chúng.
Dưới đây xin giới thiệu các tính năng của Maple thông qua một
số ví dụ tính toán cụ thể. Sau khi chúng ta khởi động chương trình
Maple, trên màn hình xuất hiện cửa sổ vùng làm việc với dấu nhắc
[>_ ở góc trên bên trái, báo hiệu Maple đã sẵn sàng thực hiện các
lệnh được đưa vào sau dấu nhắc. Trong các ví dụ dưới đây, liền sau
dấu [> là câu lệnh do chúng ta gõ vào bằng bàn phím (kết thúc câu
lệnh bằng dấu ;), nếu đưa lệnh nhiều dòng màn hình nhấn phím
[Shift] đồng thời với nhấn phím [Enter] để vào tiếp tục lệnh. Sau đó
chúng ta nhấn phím [Enter], Maple sẽ thực hiện lệnh và cho hiển
thị kết quả tính toán tại dòng ngay sau đó.
8 Lời nói đầu

Ví dụ
1 -Tính tổng lập phương các số nguyên từ 1 tới 100:
>S := sum (i^3, i =1..100);
S:= 25502500
2 - Phân tích tổng S trên ra thừa số nguyên tố:
>ifactor (S);
(2)2 (5)4 (101)2
3 - Giải hệ phương trình tuyến tính với ba ẩn và một tham số :

 ax + 3y + 3z
 = 10
x − y + az =2

3x − 2y + z =6

>solve({a*x+3*y+3*z=10, x-y+a*z=2, 3*x-2*y+z=6}, {x, y, z})

−5 + 19a −16a2 + 3a + 15 −5 + 19a


{x = ,y = ,x = }
a (4 + a ) a (4 + a ) a (4 + a )

4 - Đưa vào một phương trình vi phân

d2 d
2
(y( x )) + 2 (y( x ))) + y = e−x
dx dx

bằng cách gán vào một biến:


>de :=diff( y(x), x, x)+2* diff( y(x), x)+y(x) = exp(-x);

d2 d
de := 2
(y( x )) + 2 (y( x ))) + y = e−x
dx dx

5 - Giải phương trình vi phân ở ví dụ trên với điều kiện ban đầu:
y(0) = 1, y0 (0) = 0
>soln := dsolve({de, y(0)=1, D(y)(0)=0}, y(x));

1 2
soln := y( x ) = x exp(− x ) + exp(− x ) + exp(− x ) x
2

6-Vẽ đồ thị nghiệm của phương trình vi phân nói trên:


Lời nói đầu 9

>plot(rhs(soln), x=0..8);

7. Giải phương trình phi tuyến cot( x + 18 ) = x với độ chính xác là


40 chữ số sau dấu phảy:
>Digits := 40;
Digits := 40
>fsolve(cot(x + Pi/8) = x, x);
.6218013732036774103273149629860812356122
>Digits := 10:
>fsolve(cot(x + Pi/8) = x, x);
.6218013732
8. Giải phương trình sai phân với điều kiện ban đầu:

6 f (n + 3) − 103 f (n + 2) + 144 f (n + 1) = 47 f (n)

với f (0) = 1, f (1) = 2, f (2) = 4.


>reqn := 6*f(n+3) - 103*f(n+2) + 144*f(n+1) = 47*f(n);
reqn := 6 f (n + 3) − 103 f (n + 2) + 144 f (n + 1) = 47 f (n)
>rsolve({reqn, f(0) = 1, f(1) = 2, f(2) = 4}, f(n));
1 47
− n−
2 3
10 Lời nói đầu
R∞ 2
9. Tính tích phân 0
e− x ln x dx.

>int(exp(-x^2)*ln(x), x=0..infinity);
1√ 1√
− πγ − π ln(2)
4 2
10. Định nghĩa một ma trận dùng lệnh trong gói lệnh đại số tuyến
tính LinearAlgebra:
>with(LinearAlgebra):
>A := matrix(4, 4, [ -26, -28, 89, -456, 104, 258, 70,
3132, 40, 88, -266, 1109, 2, 1, -4, 26]);
 
26 −28 89 −456
104 258 70 3132 
A :=  
 40 88 −266 1109 
−2 1 −4 26

11- Xác định một ma trận Toeplitz 3 × 3 chiều với giá trị ban đầu
là a, b, c
>T := toeplitz([a,b,c]);
 
a b c
T := b a b
c b a

12- Tính giá trị riêng của ma trận T nói trên


>eigenvals(T);
1 1 1 1
a − c, a + c + (c2 + 8b2 )1/2 , a + c − (c2 + 8b2 )1/2
2 2 2 2

13- Vẽ hai hình lồng nhau trên cùng một hệ tọa độ trong không
gian ba chiều:
>with(plots):
>tubeplot({[10*cos(t),10*sin(t),0,
t=0..2*Pi, radius= 2+cos(7*t),
numpoint=120, tubepoints=24],
[0,10+5*cos(t), 5*sin(t), t=0..2*Pi, radius= 1.5,
numpoint=50,tubepoints=18]},
scaling=CONSTRAINED);

Như chúng ta đã thấy qua các ví dụ trên, việc giao tiếp và thực
hiện theo ý đồ toán học của ta nhờ Maple khá dễ dàng. Tài liệu này
Lời nói đầu 11

gồm những hướng dẫn các chức năng tính toán của Maple. Thông
qua hướng dẫn cụ thể ta có thể bước đầu sử dụng Maple giải một
số bài toán thông thường hoặc tự kiểm tra các kiến thức phổ thông,
toán cao cấp thông qua các ví dụ. Nội dung cơ bản này được trình
bày trong Chương 1 Các lệnh tương tác với Maple, Chương 2 Maple
với giải tích sơ cấp, Chương 3 Maple với đại số sơ cấp, Chương 4
Maple với đại số tuyến tính, Chương 5 giới thiệu các tính năng đồ họa
trong không gian hai chiều và ba chiều, đây cũng là một trong các ưu
điểm nổi bật của Maple. Chương 6 lập trình bằng ngôn ngữ Maple,
Chương 7 là ứng dụng các chương trước để khảo sát giải phương
trình vi phân và giải tích nhiều biến. Cuối cùng là các phụ lục về gói
lệnh vẽ đồ thị (plots), gói lệnh đại số tuyến tính (LinearAlgebra), và
danh sách các gói lệnh thường dùng.
Mỗi phần đều có công thức chung và sau đó là ví dụ cụ thể chia
ra từng bước A, B, C.... Sau dấu [> là bắt đầu lệnh còn các dòng sau
đó là tiếp tục lệnh hoặc trong nhóm lệnh cùng thực hiện; kết quả là
dòng cuối cùng của các dòng lệnh.
Những năm gần đây Maple đã được phổ biến trong các trường
đại học ở Việt Nam. Những tài liệu sử dụng Maple và khai thác
Maple trong giảng dạy và nghiên cứu đã có bằng tiếng Việt như
[1],[2],[3],[4],[6]. Rất nhiều tài liệu nước ngoài bằng tiếng Anh
về ứng dụng Maple trong nghiên cứu và học tập, tôi chỉ liệt kê
một số cuốn quan trọng như [13], [9], [10], [11], [13], [14], [15],
[16],[17],[18],[19],[20],[21],[22]. Ngày nay cũng có rất nhiều trang
web dành cho học tập và trao đổi kinh nghiệm về sử dụng Maple
như [24], [25], [26],...Tác giả đã xem xét lại nội dung cuốn sách sử
dụng Maple [2] của mình, kết hợp với những tiến bộ của phần mềm
Maple 17 và kết hợp với các tài liệu đã chỉ ra ở trên để soạn ra tài
liệu này. Phần lập trình đã nghiên cứu và nhiều bài tập lập trình
trên cơ sở cuốn sách của tác giả [5]. Phần vẽ đồ thị đã thể hiện các
hệ tọa độ phẳng, không gian và vẽ hình trên các hệ tọa độ này. Phần
khối đa diện đều và làm hoạt hình được đưa vào với ví dụ cụ thể.
Tác giả đã sử dụng Maple 17 kiểm tra các lệnh và chương trình
trong cuốn sách này. Phần mềm Maple 17 phiên bản 32 bit chạy
trên Windows 7 phiên bản 64 bit rất ổn định và tốt. Mọi trao đổi sai
sót và bình luận nội dung cuốn sách này với tác giả tại trang Web:
12 Phương pháp đại lượng bất biến

http://nhdien.wordpress.com.
Tác giả cám ơn Lãnh đạo Khoa Toán - Cơ - Tin học,Trường
ĐHKHTN, ĐHQGHN Hà nội đã tạo điều kiện cho tôi dạy môn "Thực
hành tính toán" và thành lập các hội đồng kiểm định nội dung cuốn
sách này. Tác giả chân thành cảm ơn PGS. TS. Tạ Duy Phượng và
PGS. TS. Đặng Đình Châu đã đọc và cho rất nhiều ý kiến chỉ dẫn về
sai sót trong bản thảo để kịp thời sửa chữa.Tôi cũng cám ơn Trung
tâm Tính toán Hiệu năng cao, ĐHKHTN và các sinh viên đã học
môn "Thực hành tính toán".
Hà Nội, ngày 27 tháng 11 năm 2013
Nguyễn Hữu Điển

NHỮNG KÍ HIỆU
Trong cuốn sách này ta dùng những kí hiệu với các ý nghĩa xác
định trong bảng dưới đây:

N tập hợp số tự nhiên


R tập hợp số thực
C tập hợp số phức
{...} Ký hiệu tập hợp
[...] Ký hiệu danh sách
∩ Giao tập hợp
∪ Hợp tập hợp
\ Trừ tập hợp
> Dấu bắt đầu nhập lệnh của Maple
i Đơn vị ảo
␣ Ký tự trắng
⇒ Kết quả của lệnh.
. Bài tập
PT phương trình
ĐK điều kiện
KBT khoảng biến thiên
<Đối số> Đối số có thể là biến, hằng, hàm số, hệ phương
trình...
DANH SÁCH CÁC HÌNH
5.1 Hệ tọa độ polar và đồ thị trong polar . . . . . . . . . . . . . 118
5.2 Hệ tọa độ elliptic và đồ thị trong elliptic . . . . . . . . . . . 118
5.3 Đồ thị danh sách điểm . . . . . . . . . . . . . . . . . . . . . 121
5.4 Đồ thị giao động tắt dần . . . . . . . . . . . . . . . . . . . . 121
5.5 Đồ thị parabol . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.6 Đồ thị với style=point . . . . . . . . . . . . . . . . . . . . . . 122
5.7 Đồ thị với giá trị mặc định của numpoints . . . . . . . . . . 122
5.8 Đồ thị trong khoảng hẹp . . . . . . . . . . . . . . . . . . . . 123
5.9 Vẽ hai đồ thị trên một hệ tọa độ . . . . . . . . . . . . . . . . 123
5.10 Đồ thị hàm đặc biệt y = sin x/x . . . . . . . . . . . . . . . . 124
5.11 Đồ thị các hàm cos x và sin x với nhiều tùy chọn . . . . . . . 124
5.12 Vẽ đồ thị theo thông số t . . . . . . . . . . . . . . . . . . . . 125
5.13 Vẽ đồ thị theo thông số lượng giác . . . . . . . . . . . . . . . 125
5.14 Đường tròn đơn vị trên hệ tọa độ Đề các . . . . . . . . . . . 126
5.15 Đường tròn đơn vị trên hệ tọa độ cực . . . . . . . . . . . . . 126
5.16 Hệ tọa độ cartesian . . . . . . . . . . . . . . . . . . . . . . . 126
5.17 Hệ tọa độ bipolar . . . . . . . . . . . . . . . . . . . . . . . . 126
5.18 Hệ tọa độ polar . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.19 Vẽ đồ thị theo tọa độ cực nhiều hàm . . . . . . . . . . . . . 127
5.20 Vẽ đồ thị theo tọa độ cực hàm t2 . . . . . . . . . . . . . . . . 127
1
5.21 Đồ thị hàm số . . . . . . . . . . . . . . . . . . . . . . . . . 128
z
z−i
5.22 Đồ thị hàm số . . . . . . . . . . . . . . . . . . . . . . . 128
z+i
5.23 Dùng lệnh listplot. . . . . . . . . . . . . . . . . . . . . . . . . 129
5.24 Dùng lệnh pointplot . . . . . . . . . . . . . . . . . . . . . . . 129
5.25 Nối 8 điểm trên đường tròn. . . . . . . . . . . . . . . . . . . 130
5.26 Nối 200 điểm trên đường tròn. . . . . . . . . . . . . . . . . . 130
5.27 Hệ tọa độ rectangular . . . . . . . . . . . . . . . . . . . . . . 132
5.28 Hệ tọa độ cylindrical . . . . . . . . . . . . . . . . . . . . . . 132
5.29 Hệ tọa độ spherical . . . . . . . . . . . . . . . . . . . . . . . 132
5.30 Đồ thị hàm số | x − y| + | x + y| . . . . . . . . . . . . . . . . . 133

13
14 Thực hành tính toán

5.31 Hai đồ thị trong không gian ba chiều. . . . . . . . . . . . . 133


5.32 Đồ thị với miền xác định ẩn . . . . . . . . . . . . . . . . . . 134
5.33 Đa đồ thị trên một hệ tọa độ. . . . . . . . . . . . . . . . . . . 134
5.34 Tùy chọn scaling = unconstrained . . . . . . . . . . . . . . . 136
5.35 Tùy chọn scaling = constrained . . . . . . . . . . . . . . . . 136
5.36 plot3d tùy chọn axes = box . . . . . . . . . . . . . . . . . . . 136
5.37 plot3d tùy chọn view=0..40 . . . . . . . . . . . . . . . . . . . 136
5.38 Chọn style = point . . . . . . . . . . . . . . . . . . . . . . . . 137
5.39 Chọn style = patch . . . . . . . . . . . . . . . . . . . . . . . . 137
5.40 Tùy chọn style = wireframe . . . . . . . . . . . . . . . . . . 137
5.41 Chọn style = hidden . . . . . . . . . . . . . . . . . . . . . . . 137
5.42 plot3d tùy chọn axes = none . . . . . . . . . . . . . . . . . . 138
5.43 plot3d tùy chọn axes = frame . . . . . . . . . . . . . . . . . 138
5.44 plot3d tùy chọn axes = box . . . . . . . . . . . . . . . . . . . 138
5.45 plot3d tùy chọn axes = normal . . . . . . . . . . . . . . . . . 138
5.46 Biểu diễn nhiều đồ thị trên một hệ tọa độ . . . . . . . . . . 139
5.47 Đồ thị hàm thông số . . . . . . . . . . . . . . . . . . . . . . . 139
5.48 plod3d tùy chọn style = patchcontour . . . . . . . . . . . . . 140
5.49 plod3d tùy chọn góc nhìn orientation . . . . . . . . . . . . . 140
5.50 plod3d tùy chọn filled = true . . . . . . . . . . . . . . . . . . 140
5.51 plod3d tùy chọn filled = false . . . . . . . . . . . . . . . . . . 140
5.52 tubeplot tùy chọn style=contour . . . . . . . . . . . . . . . . 141
5.53 tubeplot tùy chọn style = patch nét lưới . . . . . . . . . . . 141
5.54 tubeplot tùy chọn tiêu đề . . . . . . . . . . . . . . . . . . . . 141
5.55 tubeplot vẽ nhiều hàm một lúc . . . . . . . . . . . . . . . . . 141
5.56 tubeplot chọn vị trí của ba hình. . . . . . . . . . . . . . . . . 142
5.57 tubeplot vẽ bốn khuyên . . . . . . . . . . . . . . . . . . . . . 142
5.58 tubeplot vẽ hình xoắn . . . . . . . . . . . . . . . . . . . . . . 142
5.59 tubeplot vẽ đối xứng . . . . . . . . . . . . . . . . . . . . . . . 142
5.60 tubeplot vẽ ba khuyên lồng nhau . . . . . . . . . . . . . . . 143
5.61 tubeplot vẽ đường xoắn . . . . . . . . . . . . . . . . . . . . . 143
Danh sách hình 15
q
5.62 sphereplot vẽ hàm x = 3 sin2 y − 1) . . . . . . . . . . . . . 144
p
5.63 sphereplot vẽ hàm x = 5 cos2 y − 1) . . . . . . . . . . . . . 144
5.64 Khối hình nón cylinderplot mở . . . . . . . . . . . . . . . . . 144
5.65 Khối tròn theo từng nấc . . . . . . . . . . . . . . . . . . . . 144
5.66 Mô hình sóng giao thoa . . . . . . . . . . . . . . . . . . . . . 145
5.67 Khối MetabiaugmentedTruncatedDodecahedron . . . . . . 147
5.68 Khối đa diện echidnahedron . . . . . . . . . . . . . . . . . . 147
5.69 Hoạt hình danh sách khối đa diện . . . . . . . . . . . . . . 148
5.70 Vẽ hoạt hình với khung 50 ảnh . . . . . . . . . . . . . . . . 150
5.71 Vẽ hoạt hình hàm có thông số . . . . . . . . . . . . . . . . . 150
5.72 Vẽ hoạt hình đồ thị chuyển động lên. . . . . . . . . . . . . . 151
5.73 Vẽ hoạt hình đồ thị chuyển động tròn . . . . . . . . . . . . . 151
5.74 Khung hình đầu tiên của dãy hoạt hình. . . . . . . . . . . . 153
5.75 Khung hình thứ 18 của dãy 25 hình . . . . . . . . . . . . . 153
5.76 Hoạt hình dùng lệnh animate3d . . . . . . . . . . . . . . . . 153
5.77 Hoạt hình trên hàm vẽ hình 3D. . . . . . . . . . . . . . . . . 153

6.1 Ví dụ phép lặp Newton . . . . . . . . . . . . . . . . . . . . . 195

7.1 Nghiệm của bài toán Côsi . . . . . . . . . . . . . . . . . . . 210


7.2 Nghiệm gần đúng và nghiệm chính xác . . . . . . . . . . . 212
7.3 Đồ thị nghiệm của phương trình vi phân theo giải số . . . . 213
7.4 Đồ thị của nghiệm theo cách giải số và nghiệm gần đúng . 214
7.5 Đồ thị của nghiệm giải số và nghiệm gần đúng . . . . . . . 215
7.6 Đồ thị của nghiệm giải số vẽ bằng DEplot . . . . . . . . . . 216
7.7 Ảnh pha không mũi tên của hệ phương trình vi phân . . . 217
7.8 Ảnh pha vectơ trường mũi tên của hệ phương trình vi phân 218
7.9 Lệnh phaseportrait vẽ pha cho hệ phương trình . . . . . . 218
7.10 Đồ thị hàm sai số er f ( x ) . . . . . . . . . . . . . . . . . . . . 228
7.11 Đồ thị hàm khai triển theo Fourier . . . . . . . . . . . . . . 229
16 Thực hành tính toán

7.12 Các đồ thị của một hàm khai triển theo Fourier với bậc
khác nhau . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

8.1 Lời giải bài 5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . 242


8.2 Lời giải bài 5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . 242
8.3 Lời giải bài 5.3 . . . . . . . . . . . . . . . . . . . . . . . . . . 243
8.4 Lời giải bài 5.4 . . . . . . . . . . . . . . . . . . . . . . . . . . 243
8.5 Lời giải bài 5.5 . . . . . . . . . . . . . . . . . . . . . . . . . . 243
8.6 Lời giải bài 5.6 . . . . . . . . . . . . . . . . . . . . . . . . . . 243
8.7 Lời giải bài 5.7 . . . . . . . . . . . . . . . . . . . . . . . . . . 244
8.8 Lời giải bài 5.8 . . . . . . . . . . . . . . . . . . . . . . . . . . 244
8.9 Lời giải bài 5.9 . . . . . . . . . . . . . . . . . . . . . . . . . . 244
8.10 Lời giải bài 5.10 . . . . . . . . . . . . . . . . . . . . . . . . . 244
8.11 Lời giải bài 5.11 . . . . . . . . . . . . . . . . . . . . . . . . . 245
8.12 Lời giải bài 5.12 . . . . . . . . . . . . . . . . . . . . . . . . . 245
8.13 Hoạt hình chuyển động . . . . . . . . . . . . . . . . . . . . . 245
8.14 Ví dụ vẽ đồ thị hàm theo ẩn số phụ . . . . . . . . . . . . . . 245
8.15 Đồ thị xoắn Cornu Spiral . . . . . . . . . . . . . . . . . . . . 246
8.16 Đồ thị xoắn Cornu Spiral . . . . . . . . . . . . . . . . . . . . 246
8.17 Đồ thị con bướm . . . . . . . . . . . . . . . . . . . . . . . . . 246
8.18 Đồ thị Umbilic Torus . . . . . . . . . . . . . . . . . . . . . . 247
8.19 Đồ thị Hyperboloid . . . . . . . . . . . . . . . . . . . . . . . 247
8.20 Nghiệm của phương trình vi phân giải bằng phương
pháp khác nhau. . . . . . . . . . . . . . . . . . . . . . . . . 252
8.21 Nghiệm của phương trình vi phân thường. . . . . . . . . . 252
8.22 Hoạt hình của nghiệm phương trình vi phân thường,
ảnh thứ 23. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

A.1 Biểu tượng Maple trên Desktop . . . . . . . . . . . . . . . . 256


A.2 Maple trên Menu:Start . . . . . . . . . . . . . . . . . . . . . 256
A.3 Giao diện chính của Maple 17 . . . . . . . . . . . . . . . . . 256
A.4 Nút công cụ ở chế độ văn bản . . . . . . . . . . . . . . . . . 257
Danh sách hình 17

A.5 Nút công cụ ở chế độ đồ thị . . . . . . . . . . . . . . . . . . . 257


A.6 Định dạng input Maple và 2D Math Output . . . . . . . . . 258
A.7 Định dạng trong khi soạn thảo Maple . . . . . . . . . . . . 259
A.8 Chuyển đổi biểu thức 1D Math sang 2D Math Input . . . . 260
A.9 Chuyển đổi biểu thức 2D Math sang 1D Math Input . . . . 260
A.10 Chuyển đổi biểu thức 1D Math sangLATEX . . . . . . . . . . 261
A.11 Chuyển đổi biểu thức 2D Math sang LATEX . . . . . . . . . . 261

C.1 Lệnh vẽ đồ thị . . . . . . . . . . . . . . . . . . . . . . . . . . 280

E.1 Lệnh animate . . . . . . . . . . . . . . . . . . . . . . . . . . 305


E.2 Lệnh animate3d . . . . . . . . . . . . . . . . . . . . . . . . . 305
E.3 Lệnh animatecurve . . . . . . . . . . . . . . . . . . . . . . . 305
E.4 Lệnh arrow . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
E.5 Lệnh changecoords . . . . . . . . . . . . . . . . . . . . . . . 306
E.6 Lệnh complexplot . . . . . . . . . . . . . . . . . . . . . . . . 306
E.7 Lệnh complexplot3d . . . . . . . . . . . . . . . . . . . . . . . 307
E.8 Lệnh conformal . . . . . . . . . . . . . . . . . . . . . . . . . 307
E.9 Lệnh conformal3d . . . . . . . . . . . . . . . . . . . . . . . . 307
E.10 Lệnh contourplot . . . . . . . . . . . . . . . . . . . . . . . . 307
E.11 Lệnh contourplot3d . . . . . . . . . . . . . . . . . . . . . . . 308
E.12 Lệnh densityplot . . . . . . . . . . . . . . . . . . . . . . . . . 308
E.13 Lệnh display . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
E.14 Lệnh dualaxisplot . . . . . . . . . . . . . . . . . . . . . . . . 309
E.15 Lệnh fieldplot . . . . . . . . . . . . . . . . . . . . . . . . . . 309
E.16 Lệnh fieldplot3d . . . . . . . . . . . . . . . . . . . . . . . . . 309
E.17 Lệnh gradplot . . . . . . . . . . . . . . . . . . . . . . . . . . 310
E.18 Lệnh gradplot3d . . . . . . . . . . . . . . . . . . . . . . . . . 310
E.19 Lệnh implicitplot . . . . . . . . . . . . . . . . . . . . . . . . 310
E.20 Lệnh implicitplot3d . . . . . . . . . . . . . . . . . . . . . . . 310
E.21 Lệnh inequal . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
E.22 Lệnh intersectplot . . . . . . . . . . . . . . . . . . . . . . . . 311
18 Thực hành tính toán

E.23 Lệnh listcontplot . . . . . . . . . . . . . . . . . . . . . . . . . 312


E.24 Lệnh listcontplot3d . . . . . . . . . . . . . . . . . . . . . . . 312
E.25 Lệnh listplot . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
E.26 Lệnh listplot3d . . . . . . . . . . . . . . . . . . . . . . . . . . 313
E.27 Lệnh loglogplot . . . . . . . . . . . . . . . . . . . . . . . . . 313
E.28 Lệnh logplot . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
E.29 Lệnh matrixplot . . . . . . . . . . . . . . . . . . . . . . . . . 314
E.30 Lệnh plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
E.31 Lệnh odeplot . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
E.32 Lệnh pareto . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
E.33 Lệnh plotcompare . . . . . . . . . . . . . . . . . . . . . . . . 315
E.34 Lệnh pointplot . . . . . . . . . . . . . . . . . . . . . . . . . . 315
E.35 Lệnh pointplot3d . . . . . . . . . . . . . . . . . . . . . . . . 315
E.36 Lệnh polarplot . . . . . . . . . . . . . . . . . . . . . . . . . . 315
E.37 Lệnh polygonplot . . . . . . . . . . . . . . . . . . . . . . . . 316
E.38 Lệnh polygonplot3d . . . . . . . . . . . . . . . . . . . . . . . 316
E.39 polyhedra_supported . . . . . . . . . . . . . . . . . . . . . . 317
E.40 Lệnh polyhedraplot . . . . . . . . . . . . . . . . . . . . . . . 317
E.41 Lệnh rootlocus . . . . . . . . . . . . . . . . . . . . . . . . . . 317
E.42 Lệnh semilogplot . . . . . . . . . . . . . . . . . . . . . . . . 317
E.43 Lệnh setoptions . . . . . . . . . . . . . . . . . . . . . . . . . 318
E.44 Lệnh setoptions3d . . . . . . . . . . . . . . . . . . . . . . . . 318
E.45 Lệnh spacecurve . . . . . . . . . . . . . . . . . . . . . . . . . 319
E.46 Lệnh sparsematrixplot . . . . . . . . . . . . . . . . . . . . . 319
E.47 Lệnh surfdata . . . . . . . . . . . . . . . . . . . . . . . . . . 319
E.48 Lệnh textplot . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
DANH SÁCH CÁC BẢNG
1.1 Ký hiệu các phép toán thông thường trong Maple . . . . . . 22
1.2 Các hàm toán học trong Maple . . . . . . . . . . . . . . . . 25
1.3 Các hàm đặc biệt của toán học trong Maple . . . . . . . . . 26
1.4 Các hằng số toán học của Maple . . . . . . . . . . . . . . . . 28
1.5 Kiểu biểu thức trong Maple . . . . . . . . . . . . . . . . . . 29
1.6 Kiểu biểu thức lôgic trong Maple . . . . . . . . . . . . . . . 30
1.7 Toán tử tập hợp trong Maple . . . . . . . . . . . . . . . . . . 34

2.1 Giá trị tham số tuỳ chọn cho hàm fsolve. . . . . . . . . . . 52


2.2 Các giá trị tuỳ chọn của limit. . . . . . . . . . . . . . . . . . 55

3.1 Các lệnh cơ bản trong đại số sơ cấp . . . . . . . . . . . . . . 67


3.2 Các giá trị tham số <Qui tắc> của simplify . . . . . . . . . 68
3.3 Cách thu gọn biểu thức bằng combine . . . . . . . . . . . . 71
3.4 Các tùy chọn chuyển đổi của hàm convert . . . . . . . . . . 80

4.1 Bảng Wavelength . . . . . . . . . . . . . . . . . . . . . . . . 86


4.2 Những hàm chỉ số trong Maple . . . . . . . . . . . . . . . . 91
4.3 Toán tử cho ma trận và vectơ với hàm evalm . . . . . . . . 93
4.4 Các toán tử cho vectơ và ma trận . . . . . . . . . . . . . . . 96
4.5 Các hàm toán học cho vectơ và ma trận . . . . . . . . . . . 96
4.6 Các toán tử vi phân trên ma trận và vectơ. . . . . . . . . . 99
4.7 Các toán tử dùng để tính tập vectơ cơ sở. . . . . . . . . . . . 100
4.8 Tìm số chiều của ma trận và vectơ. . . . . . . . . . . . . . . 101
4.9 Các toán tử về cấu trúc trên ma trận và vectơ. . . . . . . . 102

5.2 Lưới tọa độ trong các hệ tọa độ trên mặt phẳng . . . . . . . 117
5.3 Đồ thị hàm cos( x + x cos x ) trong các hệ tọa độ . . . . . . . 119
5.4 Các tùy chọn cho hàm plot. . . . . . . . . . . . . . . . . . . 120
5.5 Các tùy chọn khác cho hàm conformal. . . . . . . . . . . . 128
5.6 Những tùy chọn cho plot3d . . . . . . . . . . . . . . . . . . 134
5.7 Khối đa diện đều . . . . . . . . . . . . . . . . . . . . . . . . . 146

19
20 Thực hành tính toán trong Maple

5.8 Chức năng của nút hoạt hình . . . . . . . . . . . . . . . . . 149

6.1 Một số toán tử trong Maple. . . . . . . . . . . . . . . . . . . 175

7.1 Lệnh dsolve có tuỳ chọn. . . . . . . . . . . . . . . . . . . . . 206

B.1 Các gói lệnh phiên bản cũ được thay thế . . . . . . . . . . . 263
B.2 Các thành phần gói lệnh Student. . . . . . . . . . . . . . . . 264
B.3 Danh sách các gói lệnh của Maple 17. . . . . . . . . . . . . 265
CHƯƠNG 1
CÁC LỆNH TƯƠNG TÁC VỚI MAPLE

1.1. Thực hiện phép toán số học trong Maple . . . . . . . . . . . . . . . . 21


1.2. Biến số. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.3. Các hàm toán học của Maple . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.4. Các hằng số toán học của Maple . . . . . . . . . . . . . . . . . . . . . . . . 27
1.5. Dấu ngoặc đơn và độ ưu tiên phép toán . . . . . . . . . . . . . . . . 27
1.6. Những thành phần của biểu thức . . . . . . . . . . . . . . . . . . . . . . . . 29
1.7. Dãy biểu thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.8. Cấu trúc tập hợp và danh sách trong Maple . . . . . . . . . . . . . 34
1.9. Tính toán số với độ chính xác bất kỳ . . . . . . . . . . . . . . . . . . . . . . 36
1.10. Định nghĩa hàm đơn giản trong Maple . . . . . . . . . . . . . . . . . . 37
1.11. Lệnh alias đặt bí danh các hàm và ký hiệu . . . . . . . . . . . . . 39
1.12. Sửa chữa lỗi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.13. Đưa kết quả ra bằng print và lprint . . . . . . . . . . . . . . . . . . . . . . 41
1.14. Bài tập có lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
1.15. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Chương này giới thiệu sử dụng Maple trong chế độ tương tác trực
tiếp giữa người sử dụng và Maple. Cuộc đối thoại giữa người sử dụng
với Maple thông qua lệnh gõ từ bàn phím vào dấu nhắc >_ và kết thúc
lệnh bằng dấu ; cuối cùng nhấn phím [Enter]. Maple sẽ thực hiện
lệnh và trả lời ngay trên dòng tiếp theo. Sau đó Maple cho hiện dấu
nhắc >_ để chờ lệnh mới. Từ chương này chúng ta sẽ tìm hiểu trong
Maple gồm có những thành phần gì? Những phương thức thể hiện
của chúng ta theo ngôn ngữ của Maple ra sao? Maple đưa ra kết quả
thế nào khi chúng ta nhập sai lệnh của Maple?...

1.1. Thực hiện phép toán số học trong Maple


Trước hết, ta có thể sử dụng Maple để làm các phép tính số học
thông thường (cộng, trừ, nhân, chia) đối với các số nguyên, phân số,
đa thức, các hàm hữu tỷ hoặc một kiểu dữ liệu của Maple trong biểu
thức toán học ta muốn tính toán. Ta chỉ việc đánh lệnh tính toán
dưới dạng một biểu thức toán học.
22 Chương 1. Các lệnh tương tác với Maple

Ví dụ 1.1. Gõ biểu thức, đánh dấu ; ở cuối biểu thức và ấn phím


[Enter]
>32 + 12;
44

Chú ý 1.1 Đừng quên dấu chấm phẩy ";". Nếu ta quên dấu ";" thì
Maple sẽ đáp lại bằng con trỏ nhấp nháy ở dòng tiếp và chờ nhập
tiếp dữ liệu coi như tiếp tục dòng trên. Khi đó ta có thể đánh lại dấu
";" và ấn phím [Enter] để Maple thực hiện tính toán.
Chú ý 1.2 Có thể sử dụng trình đơn Edit để biên tập các câu
lệnh, hoàn toàn tương tự như khi sử dụng MS Word về cắt, dán và
sao chép biểu thức.

Bảng 1.1. Ký hiệu các phép toán thông thường trong Maple

Phép toán Ký hiệu phép Ví dụ Kết


toán trong quả
Maple
Cộng + >2 + 2; 4
Trừ - >10 - 4; 6
Nhân * >3*5*8; 120
Chia / >35/2; 17.5
Chia lấy dư iquo(...) >iquo(17,3); 2
Chia lấy nguyên irem(...) >irem(10, 7); 1
Mũ ^ hoặc ** >7^2; hoặc >7**2; 49
Giá trị tuyệt đối abs(...) >abs(-6); 6
Giai thừa ! >4!; 24

Chú ý 1.3 Những người mới sử dụng Maple đôi khi gõ 2␣x, x2,
x␣2 với ý hiểu là 2 nhân x. Tuy nhiên trong biểu thức lệnh phải đánh
2*x hoặc x*2 thì Maple mới hiểu.
Khi ta thực hiện dãy các câu lệnh kế tiếp nhau, chúng ta có thể
tận dụng kết quả của phép tính trước đó bằng ký hiệu % (Xem Ví dụ
1.2). Nếu ta không muốn in kết quả ra màn hình ta có thể kết thúc
câu lệnh bằng dấu ":" thay cho dấu ";".
Ta có thể kéo dài biểu thức tính toán của mình ra nhiều dòng.
Maple sẽ không thực hiện bất kỳ một công việc tính toán nào cho tới
khi ta đánh dấu ";" tại cuối biểu thức và ấn phím [Enter].
1.2. Biến số 23

Ví dụ 1.2. Tính toán một vài biểu thức toán học đơn giản.
A. Sử dụng kết quả phép tính trước đó. Chú ý dấu "%" trong biểu
thức
>2 + abs(-2);
4
>(4 + (%+ 6) / 999999-32516);
28
967483
B. Chúng ta sử dụng dấu ":" để tránh việc in ra số quá lớn.
>2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19
*20*21*22*23*24:
C. Chúng ta lại sử dụng nó trong việc tính toán tiếp theo dùng dấu
"%".
>% - 24!;
0

1.2. Biến số
Ta có thể gán kết quả đã tính toán vào một ký hiệu để sử dụng lại
chúng sau này, như S:=sum (i^3, i=1..100); đó chính là việc gán
giá trị này cho một biến số S trong Maple. Nhưng không giống như
các ngôn ngữ lập trình khác Maple có thể sử dụng những biến này
theo nghĩa ẩn số của toán học. Lệnh gán giá trị vào biến
<Tên biến>:= <Biểu thức>;
Chúng ta dùng ký hiệu <....> viết trong công thức có thể thay
đổi được trong lệnh đối với Maple. Biến trong Maple thông thường
được bắt đầu bằng một chữ cái, có thể dài tới 498 ký tự gồm chữ cái,
chữ số hoặc dấu ngạch dưới. Tất nhiên không nên tạo ra các biến có
độ dài tối đa, chúng nên được tạo lập sao cho thuận lợi để gõ vào và
dễ nhớ. Những tên biến của Maple có thể được tạo lập bởi một dãy
các ký tự nằm trong dấu nháy đơn. Những tên trong dấu nháy đơn
có thể bao gồm bất kỳ ký tự bàn phím nào (kể cả dấu trắng). Sau đây
là một vài ví dụ về tên biến trong Maple:

Ví dụ 1.3. expr1, x, T, Formula_47


d2DYDX, ‘a funny name?‘, ‘The answer is=‘
‘SessionLog.m‘
24 Chương 1. Các lệnh tương tác với Maple

Chú ý 1.4 Maple phân biệt chữ hoa và chữ thường. Ví dụ xyz và
xyZ là hai biến khác nhau.
Chú ý 1.5 Dấu nháy đơn tạo ra một đường biên giới xung quanh
tên biến nhưng không phải là thành phần của tên biến. Maple suy
xét ‘x‘ để hiểu rằng nó có nghĩa là biến x. Nhưng ‘1‘ khác 1. Ký tự số
không là tên biến và nó không thể gán giá trị được. Việc gán các biến
không chứa giá trị nào ta phải luôn thực hiện lại lệnh >restart;.

Ví dụ 1.4. Gán giá trị


A. Biến Tong là nhãn của công thức cộng hai biến bien1và bien2
>Tong:= bien1 + bien2;
Tong := bien1 + bien2

B. Chúng ta gán giá trị cho hai biến bien1, bien2


>bien1:=3000;bien2:= 26400;
bien1 := 3000 bien2 := 26400
C. Giá trị của Tong bây giờ là tổng giá trị của bien1 và bien2
>Tong:= bien1 + bien2;
29400
D. Nếu chúng ta thay đổi giá trị của một trong hai biến bien1 hoặc
bien2
>bien1:= 3500;
bien1 := 3500
E. Giá trị của Tong cũng sẽ thay đổi theo.
>Tong:= bien1 + bien2;
29900
F. Tạo ra một tên biến chứa cả dấu trắng
>‘Total energy‘:= tong * 40;
Total energy := 1196000

Maple có một số biến toàn cục cài sẵn để điều khiển các phép
toán và kết quả tính toán như order, Digits,... chúng ta có thể thay
đổi giá trị mặc định các biến này và sẽ kiểm nghiệm các biến này ở
phần sau.
1.3. Các hàm toán học của Maple 25

1.3. Các hàm toán học của Maple


Maple có sẵn các hàm toán học chuẩn, chúng ta chỉ việc sử dụng
khi ta có biến đối số.
Bảng 1.2. Các hàm toán học trong Maple
Hàm Tên trong Maple
e x (Hàm số mũ) exp(x)
ln x (Lôgarit tự nhiên) ln(x) hoặc log(x)
log10 x (Lôgarit cơ số mười) log10(x)
logb x (Lôgarit cơ số b) log[b](x)

x (căn bậc hai) sqrt(x)
| x | (giá trị tuyệt đối) abs(x)
Giá trị lớn nhất, nhỏ nhất min, max
Làm tròn x thành số nguyên round(x)
Phần nguyên của x trunc(x)
Phần thập phân của x frac(x)
Ước chung lớn nhất gcd(a,b,...)
Bội chung nhỏ nhất lcm(a,b,...)
sin, cos, tan sin(x), cos(x), tan(x)
sec, csc, cot sec(x), csc(x), cot(x)


 1 với Re z ≥ 0

signum(z) = −1 với Re z < 0 signum(z)
 z

 giá trị khác
|z|
Hàm lượng giác ngược arcsin(x),arccos(x),
arctan(x),arcsec(x),
arccsc(x), arccot(x)
Hàm hyperbolic sinh(x),cosh(x),tanh(x),
sech(x),csch(x),coth(x)
Hàm hyperbolic ngược arcsinh(x),arccosh(x),
arctanh(x),arcsech(x),
arccsch(x), arccoth(x)
Giai thừa n! n!
Cm n Hệ số của nhị thức Newton binomial(n, m)
Tính a modul b a mod b hoặc mod(a, b)
UCLN của a và b mod p Gcd(a, b) mod p
Hàm Bernoulli bậc n bernoulli(n)
Hàm Euler bậc n euler(n)
Hàm Gamma GAMMA
26 Chương 1. Các lệnh tương tác với Maple

Hàm Beta Beta(x, y)

Chú ý 1.6. Maple yêu cầu biểu diễn số π bằng ký hiệu Pi còn
PI, pI và pi không tương ứng với Pi. Sử dụng I để biểu diễn số ảo và
exp(x) cho e x . Maple coi sqrt(−1) và I là như nhau.

Bảng 1.3. Các hàm đặc biệt của toán học trong Maple

Hàm Tên trong Maple


Đạo hàm của ln Γ:ψ( x ), ψ0 ( x ), Psi(x), Psi(1, x),
ψ00 ( x )... Psi(2, x)...
R x 2e−t2
Hàm sai số er f ( x ) = 0 √ dt erf(x)
π
Hàm Ai ( x ), Bi ( x ) Ai(x), Bi(x)
Hàm Riemann ζ Zeta(x), Zeta(1, x),...
R x ln t
Hàm Dilogarithm 1 dt dilog(x)
1−t
Hàm Bessel: Jv( x ), Yv( x ) BesselJ(v,x), BesselY(v,x)
Iv( x ), Kv( x ) BesselI(v,x), BesselK(v,x)
Hàm δ(t) δ0 (t), Dirac(t), Dirac(1, t),
δ00 (t), ... Dirac(2, t)

Ví dụ 1.5. Tính các hàm đặc biệt


π
A. Tự động tính biểu thức 2|sin(− )|.
2
>2*abs(sin(-Pi/2));
2
B. Tính Γ(7) − 6!.
>GAMMA(7) - 6!;
0

C. Tính i2 e2π −1 .

>I^2*exp(2*Pi*sqrt(-1));
−1
D. Tính e2 ln x .
>exp(2*ln(x));
x2
1.4. Các hằng số toán học của Maple 27

Trong ví dụ trên ta thấy rằng x chưa có giá trị. Maple coi đó là


một ký hiệu toán học. Những câu lệnh trong Maple được mở rộng để
thực hiện việc ước lượng hoặc xấp xỉ số, phép tính đạo hàm, phép lấy
vi phân, tích phân, giải các phương trình và tìm giới hạn của các biểu
thức toán học. Ta chỉ cần đánh các câu lệnh đó vào Maple để thực
hiện như: diff để tính đạo hàm, solve để giải các phương trình,...
Thực ra đây là các hàm trong Maple, nó là các thuật toán như chúng
ta thường làm khi được học làm toán. Sang chương sau một loạt các
hàm như thế sẽ sử dụng trong tính toán như một công cụ có sẵn.

Ví dụ 1.6. Maple tính toán cùng với các biến toán học
A. Những biểu thức của Maple có thể chứa các biến cũng như các số,
và có thể được gán cho một biến khác. Maple tự động đơn giản biểu
thức bằng phép toán giản ước biểu thức.
>expr1:=(x+y+ x+ x*x*x + x)/2;
3 1 1
expr1 := + x + y + + x3
2 2 2
>expr2:= ((4*expr1) - 2*y)/x;
6x + 2x3
expr2 :=
x
B. Biểu thức ký hiệu có thể chứa bất kỳ một hàm nào của Maple.
>bigexpr:=sin(expr1)/ln(expr2^2);
3 1 1
sin( x + y + x3 )
2 2 2
(6x + 2x3 )2
ln
x2

1.4. Các hằng số toán học của Maple


Maple có sẵn một vài hằng toán học chuẩn (ví dụ e,π, ...), ta chỉ
việc dùng thông qua tên của hằng số (Bảng 1.4).
Chú ý 1.7. Không nên tạo ra biến trùng với tên hằng số, vì Maple
ưu tiên tên của hằng số trong khi tính toán.

1.5. Dấu ngoặc đơn và độ ưu tiên phép toán


Khi nhập một biểt thức như >5 + 4 * 6; vào trong Maple. Ta
hiểu là 5 + 24 (thực hiện phép nhân trước) hoặc 9*6 (thực hiện phép
cộng trước). Maple đưa ra quy định áp dụng trong biểu thức ưu tiên
28 Chương 1. Các lệnh tương tác với Maple

Bảng 1.4. Các hằng số toán học của Maple

Hằng Tên trong Maple


Số nguyên -47, 3, 2
Phân số 3/5, 7/9
Số thực 1.5, 5.008
đúng, sai true, false
π Pi

e exp(1), E
√ I, (-1)^1/2
−1
∞ infinity
gama
Số Euler γ
Catalan
∞ (−1)i
Số Catalan c = ∑ 2
i =0 (2i + 1)

các phép toán như chúng ta đã được học trong số học. Ví dụ kết quả
trên là 29 chứ không phải 54 điều đó có nghĩa là Maple thực hiện
phép nhân trước phép cộng.
Chú ý 1.8. -1^(1/2) có nghĩa là -(1^(1/2)) kết quả là -1. Nếu
ta muốn nhận được căn bậc hai của -1 ta viết như sau: (-1)^(1/2).
Những người sử dụng cho rằng dấu ngoặc đơn là không cần thiết
đôi khi sẽ gặp phải những vấn đề rắc rối bởi Maple không thực hiện
được công việc như mong muốn.

Ví dụ 1.7. Những vấn đề phát sinh khi không sử dụng dấu ngoặc.
A. Ta muốn thực hiện (−5)2 và nhập vào dòng lệnh dưới dạng -5^2;,
khi đó Maple thực hiện câu lệnh này theo dạng: -(5^2) và đưa ra kết
quả bằng −25.
>-5^2;
−25
B. Ta phải thiết lập dấu ngoặc đơn để biểu thức đúng với quy định
của Maple
>-5*-5;
Syntaxerror, ‘-‘ unexpected
1.6. Những thành phần của biểu thức 29

>-5*(-2);
10
C. Những toán tử luỹ thừa của Maple thường đòi hỏi dấu ngoặc đơn
để đảm bảo việc thực hiện công việc chính xác. a(b^c) và (ab)^c
nên được viết tách riêng ra như sau a^(b^c) và (a^b)^c. Viết a^b^c
không phù hợp với cú pháp trong ngôn ngữ Maple. Ta phải thiết lập
dấu ngoặc đơn cho biểu thức mũ.
>2 ^ 3 ^ 4;
Syntax error, ‘^‘ unexpected
>2 ^ (3 ^ 4);
2417851639229258349412352

1.6. Những thành phần của biểu thức


Thông qua phép tính và thành phần số hạng của biểu thức toán
học bằng cách gõ trực tiếp vào Maple, chúng ta có thể tính toán cho
kết quả. Ý nghĩa Biểu thức toán học trong Maple như thế nào. Mỗi
biểu thức trong Maple được định dạng như một hoặc nhiều "kiểu"
biểu thức. ví dụ x + y + z là kiểu biểu thức cộng (+). còn 2 ∗ 3 ∗ x là
kiểu biểu thức nhân (*). Tồn tại những kiểu biểu thức trong Maple
được liệt kê ở bảng 1.5.

Bảng 1.5. Kiểu biểu thức trong Maple


Kiểu biểu thức Tên kiểu của Ví dụ
Maple
Số
Số nguyên integer 5
Số hữu tỷ fraction 1/3
Số chấm động float 4.7
Biểu thức đại số
Biến số string x, ’A string’
Tên chỉ số indexed a[i]
Cộng ’+’ x+y, x-y
Nhân ’*’ x*y, x/y
Lũy thừa ’^’ x^5,1/x
Hàm số function sin(1), f(x,y)
Hợp hàm số function sin@cos, f@@5
Toán tử tự xây dựng function a&+b
Toán tử procedure (x,y)->sin(x)*cos(y)
30 Chương 1. Các lệnh tương tác với Maple

Dấu bằng ’=’ a=b-3


Cỡ ’..’ 1..10
Chuỗi series Kết quả tính chuỗi
Ma trận (mảng) xem Chương 4

Mỗi biểu thức của Maple có một cấu trúc giữ liệu. Nếu cấu trúc
dữ liệu bao gồm một số thành phần thông tin, thì cấu trúc có nhiều
phần. Những phần của cấu trúc theo thứ tự tuyến tính. Nghĩa là có
phần thứ nhất, phần thứ hai, ... Nhưng mỗi phần có cùng cấu trúc
kiểu hoàn chỉnh. Ví dụ x + y + z biểu diễn một cấu trúc dữ liệu. Cấu
trúc này có thể chia làm ba phần, mỗi phần chứa thông tin về thành
phần của tổng đó là x, y và z. Biểu thức 2 ∗ ( x + y) ∗ z cũng có cấu
trúc gồm ba phần, nhưng phần hai lại có cấu trúc tổng mà trong nó
lại có hai phần.

Bảng 1.6. Kiểu biểu thức lôgic trong Maple


Kiểu biểu thức Tên kiểu của Maple Ví dụ
Lôgic
Hoặc ’or’ a or b
Phủ định ’not’ not b
Và ’and’ a and b
Bất đẳng thức
Nhỏ hơn ’<’ a<b; b>a
Nhỏ hơn và bằng ’<=’ a<=b; b>=a
Khác nhau ’<>’ a<>b
Tương đương ’=’ a=b-3

Maple có một số hàm cho phép ta nhận thông tin về thành phần
và kiểu biểu thức.
• op(i,<biểu thức>) đưa ra phần thứ i của <biểu thức>.
Ví dụ >op(1,2*x*y) là 2.
• nops(<biểu thức>) đưa ra số số hạng của biểu thức.
Ví dụ >nops(2*x*y) là 3, >nops([4,3]) là 2.
• whatype(<Biểu thức>) đưa ra kiểu biểu thức.
Ví dụ >whattype(2*x*y) là ’*’.
• type(<Biểu thức, <tên kiểu>) đưa ra giá trị true (đúng) hoặc
false (sai) phụ thuộc vào biểu thức có cùng tên kiểu hoặc không.
1.6. Những thành phần của biểu thức 31

Có thể có biểu thức thuộc kiểu mà nó là tổ hợp của các tiêu


chuẩn.
Ví dụ >type(2*x*y,’*’); là đúng, >type(2*x*y,polynom) cũng
là đúng.

Ví dụ 1.8. Kiểu và thành phần của biểu thức tính theo whattype và
op
A. whattype đưa ra kiểu của biểu thức. Kiểu của biến là chuỗi.

>s:=x+2*y+sin(3*z^2);
s := x + 2y + sin(3z2)
>whattype(s);
+
>whattype(t);
string

B. nops đưa ra số số hạng của biểu thức. Có ba số hạng trong tổng s.

>nops(s)
3
C. op(i,<biểu thức>) đưa ra số hạng thứ i của biểu thức.

>op(1,s);
x
D. Giá trị 0 ở đầu của op là tên hàm.

>nops(op(3,s));
1
>op(0,op(3,s));
sin
E. sin(3*z^2) có một số hạng, đó là đối số 3*z^2.

>op(1,op(3,s));
3z2
F. Lỗi xảy ra khi hỏi đối số thứ hai của sin(3*z^2), vì chỉ có một.

>op(2,op(3,s));
error, improper op or subscript selector

G. Phép chia như là phép nhân. tích luôn coi hàng hữu tỷ như số
hạng đầu tiên.
32 Chương 1. Các lệnh tương tác với Maple

>q:=x/(6*y);
1x
q :=
6y
>type(q,’*’);
true
>op(1,q);
1
6
>op(2,q);
x
>r:=op(3,q);
1
r :=
y
>type(r,’^’);
true
>op(1,r);
y
>op(2,r);
−1

1.7. Dãy biểu thức


Dãy biểu thức là việc sắp xếp đối tượng của Maple theo thứ tự và
tách nhau bởi dấu phẩy, như a,b,c. Dãy có thể được gán vào một biến
như một giá trị giống như bất kỳ một phép gán nào của Maple. Trong
Maple có nhiều hàm và cấu trúc dữ liệu liên quan tới dãy như cấu
trúc tập hợp, cấu trúc danh sách và các hàm giải phương trình,...Ví
dụ hàm solve nhiều khi cho kết quả dãy các nghiệm, hàm op được
cho một đối số, thì nó đưa ra dãy tất cả số hạng. Ký hiệu NULL dùng
cho dãy rỗng không có phần tử nào.
Nhiều khi ta cần phải xây dựng dãy, ví dụ như nếu seq1 được
gán vào dãy các biến a,b,c thì seq1,d sẽ ra dãy a,b,c,d còn
seq1,NULL,seq1,NULL sẽ ra a,b,c,a,b,c.
Vì dãy thường xuất hiện trong thực tế nên Maple có một số hàm
sẵn để xây dựng dãy.
Xây dựng dãy theo giới hạn số nguyên

>seq(f(i),i=<cận dưới>..<cận trên>);

Xây dựng dãy biến đổi theo phần của biểu thức
1.7. Dãy biểu thức 33

>seq(f(x),x=<biểu thức>);

Dạng một của seq sinh ra dãy biểu thức bằng cách thay i vào
f(i) từ giá trị cận dưới tới giá trị cận trên. Biểu thức f(i) có thể là
biểu thức bất kỳ chứa i, nhưng không ở dạng hàm ẩn. f(i) cũng có
thể không có i khi đó mọi phần tử của dãy là như nhau và dãy được
thay bằng chính phần tử này.
Dạng hai của seq tạo ra dãy từ các số hạng của một biểu thức
hoặc từ một biểu thức con của một biểu thức đã biết. Ví dụ như
f(op(1,<biểu thức>),..,f(op(n,<biểu thức>) với n là số của số
hạng biểu thức.

Ví dụ 1.9. Cấu trúc dãy và hàm seq.


A. seq hoạt động giống lệnh sum. Tạo ra dãy số từ 12 giảm tới 0.
>seq(12-i,i=0..12);
12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
B. Xây dựng dãy theo liệt kê.
>seq1:=sin(x), x=0;
seq1 := sin( x ), x = 0
>seq1:=seq1, 5;
seq1 := sin( x ), x = 0, 5

C. Dãy có thể dùng như một đối số cho hàm.


>t:=taylor(seq1);
t : = x − x 3 + 0( x 5 )

D. Dãy gồm số mũ và hệ số của số hạng trong biểu thức.


>seq(op(i,t),i=0..nops(t));
1
x, 1, 1, − , 3, 0(1), 5
6
E. Tạo dãy gồm số hạng thứ 0, 2 4 của dãy trên.
>seq(op(2*i,t),i=0..2);
x, 1, 3
F. op(<biểu thức>) chỉ có một thông số đưa ra dãy các số hạng của
<biểu thức>, tương đương với
p(1..nops (<biểu thức>), <biểu thức>).
34 Chương 1. Các lệnh tương tác với Maple

>op(x+y+z);
x, y, z

G. op(i..j,<biểu thức>) là dãy gồm các số hạng của biểu thức từ


thứ i tới thứ j.
>op(1..4,t);
1
1, 1, − , 3
6

1.8. Cấu trúc tập hợp và danh sách trong Maple


1. Tập hợp của Maple được viết như một dãy nằm trong dấu { },
đây là ký hiệu toán học cho tập hợp hữu hạn. Cũng như các đối tượng
khác của Maple tập hợp được gán giá trị như một biến, có thể làm
đối số, kết quả của phép tính hoặc một hàm. Maple cung cấp một số
toán tử như lấy hợp, lấy giao và hiệu trên tập hợp.
>set1:={a,b};
set1 := { a, b}
>set2:={a,d,e};
set2 := { a, d, e}
>set3:={b,e};
set3 := {b, e}

Bảng 1.7. Toán tử tập hợp trong Maple


Tên toán tử Toán tử Maple Ví dụ
Hợp a ∪ b a union b >u:=set1 union set2;
u := {b, a, d, e}
Giao a ∩ b a intersect b >i:=set1 intersect set2;
i := {e}
Trừ tập hợp a − b a minus b >d:=set1 minus set3;
d := { a}

Việc sắp xếp thứ tự trong tập hợp của Maple không có qui tắc
nào, khi ta đưa vào các phần tử của tập hợp trong Maple theo thứ tự
thế nào thì tập hợp sẽ dữ nguyên thứ tự đó.
2. Danh sách của Maple là một dãy nhưng trong nó không có
phần tử lặp lại (mỗi phần tử là duy nhất). Những phần tử trùng
nhau trong danh sách sẽ bị loại bỏ chỉ để lại một. Danh sách không
1.8. Cấu trúc tập hợp và danh sách trong Maple 35

có toán tử hợp, giao và trừ. Danh sách của Maple tạo ra bởi dãy nằm
giữa các dấu [ , ]. Phân biệt dãy và danh sách: khi viết [a,b],[b,c]
thì Maple hiểu là hai danh sách, còn khi viết (a,b),(b,c) thì chỉ là
một dãy a,b,b,c.
3. Hàm op (xem lại phần trước) tác dụng lên tập hợp và danh
sách đối với các số hạng và các phép toán tương ứng của chúng.
Lệnh subsop trong Maple tạo ra phiên bản khác nhau của tập
hợp, danh sách hoặc một cấu trúc dữ liệu với nhiều số hạng.
Tạo biểu thức mới bằng thay chỉ số thành phần bằng một đại
lượng đã cho vào trong một biểu thức.

>subsop(<chỉ số thành phần>=<đại lượng thay>, <biểu thức>);

Ví dụ 1.10. Xử lý trên phần tử của danh sách.


A. Nối hai danh sách lại thành một danh sách khác.
>list1:=[1,2,3];
list1 := [1, 2, 3]
>list2:=[4,5,6];
list2 := [4, 5, 6]
>list3:=[op(list1),op(list2)];
list3 := [1, 2, 3, 4, 5, 6]
B. Đảo lại danh sách.
>n:=nops(list3);
n := 6
>list4:=itseq(op(n-i,list3),i=0..(n-1))];
list4 := [6, 5, 4, 3, 2, 1]
>list5:=[seq(list3[n-i+1],i=1..n)];
list5 := [6, 5, 4, 3, 2, 1]
C. Tập hợp và toán tử của tập hợp.
>set6:={list5[1..4]} intersect {op(list1)};
set6 := {3}

D. Dùng subsop thay phần tử.


>list6:=subsop(5=47, list5);
list6 := [6, 5, 4, 3, 47, 1]
36 Chương 1. Các lệnh tương tác với Maple

1.9. Tính toán số với độ chính xác bất kỳ


Trong tính toán thường chúng ta cũng chỉ nhận được kết quả gần
đúng với giá trị thực, vì vậy Maple có một biến và một hàm để tính
cho ta kết quả xấp xỉ tốt nhất với độ chính xác bất kỳ.
I. Tìm số xấp xỉ với biến Digits cho trước

>Digits:=<số nguyên>;
Giá trị của biến điều khiển Digits xác định số các chữ số thập
phân chính xác để sử dụng trong khi tính toán. Giá trị của Digits
được mặc định bằng 10 chữ số, nhưng ta có thể thay đổi giá trị của
Digits bằng cách gán cho nó một giá trị khác. Ví dụ như nếu ta
muốn tính toán với 40 chữ số chính xác sau dấu phẩy thập phân, ta
gán cho biến Digits giá trị 40 (Digits:=40) trước khi bắt đầu thực
hiện tính toán.

Ví dụ 1.11. Số thực với dấu chấm động trong Maple.


A. Việc tính các số thực với dấu chấm động được sử dụng khi biểu
thức có số hạng phân số và số chấm động.
>1.0 + 3/5;
1.6000000000
>3.0*10^20 - 2.99*10^13;
.2999999701 ∗ 1021
B. Việc tính các số thực với dấu chấm động không phải lúc nào cũng
chính xác.
>1.0/3.0 + 1.0/3.0 +1.0/3.0;
.99999999
>% - 1;
−.1 ∗ 10−9
C. Phép tính số học cho kết quả xấp xỉ là số thập phân khi trong biểu
thức có một số có dấu chấm động, nếu không có số dấu chấm động
thì Maple cho kết quả là phân số chính xác.
>sum(1.0/(2*i - 1), i = 1..10);
2.133255530
>sum(1/(2*i - 1), i = 1..10);
31037876/14549535
D. Giá trị của biến Digits dùng để xác đinh độ chính xác của việc
1.10. Định nghĩa hàm đơn giản trong Maple 37

tính toán đối với các số thực có dấu chấm động.


>Digits;
10
>Digits:= 5: 2.0/3.0 + 5;
5.6667
>Digits:= 40; 2.0^(1/3);
1.259921049894873164767210607278228350570
>Digits:= 10; #Trả lại kết quả mặc định
Digits := 10

II. Tìm số xấp xỉ với độ chính xác theo giá trị của Digits
Tính toán trên số chấm động cho kết quả không chính xác khi dùng
các kiểu số khác nhau, nhưng chúng ta có thể kiểm tra được độ chính
xác. Điển hình như tìm nghiệm tới độ chính xác cho trước của phương
trình. Hàm evalf có đối số là biểu thức như các toán tử, hàm số hoặc
các hằng số và tùy chọn biến Digits.

>evalf(<Biểu thức>, Digits);

Ví dụ 1.12. Xấp xỉ kết quả bằng evalf


A. evalf có thể được dùng để lấy lại việc tính toán các số thực với dấu
chấm động ở bất kỳ một hàm nào hoặc những biểu thức chứa các số
thập phân hoặc các hằng số.
>expr1:= tan(1.0) + tan(2);
expr1 := 1.557407725 + tan(2)
>evalf(expr1);
−.627632138
>Digits:= 20: evalf(expr1);
−.6276321382615189916
B. Ta có thể thiết lập tạm thời giá trị cho biến Digits bằng tham số
thứ hai trong hàm evalf.
>evalf(sqrt(2), 40);
1.414213562373095048801688724209698078570

1.10. Định nghĩa hàm đơn giản trong Maple


I. Định nghĩa hàm một biến:

<Tên hàm>:= <Biến>-><Biểu thức>;


38 Chương 1. Các lệnh tương tác với Maple

II. Định nghĩa hàm nhiều biến:

<Tên hàm>:= (<Biến1>,..., <Biếnn>) -><Biểu thức>;


Maple cho phép ta tạo ra các hàm thông thường để sử dụng trong
toán học, khoa học và kỹ thuật. Maple có thể thực hiện tính toán
trên các hàm đã tạo ra như tính đạo hàm, giải những phương trình
hoặc đơn giản biểu thức, .... Ta có thể định nghĩa hàm bằng việc sử
dụng dấu -> của Maple. Toán tử gán := để liên kết tên hàm với định
nghĩa hàm. Tên của hàm ở bên trái dấu :=, hàm định nghĩa ở bên
phải dấu :=. Ví dụ f:= x ->x^2 là câu lệnh định nghĩa hàm bình
phương. Khi đó ta có thể tính giá trị của hàm này như f (5) có kết
quả 25 hoặc f (y + 1) có giá trị là (y + 1)2 .

Ví dụ 1.13. Dấu -> để định nghĩa hàm trong Maple.


A. Ví dụ đơn giản.
>g:= t ->t^3 + t^2 + t + 12;
g := t → t3 + t2 + t + 12
B. Định nghĩa một hàm bình phương và sử dụng nó.
>f:= y ->y^2;
f : = y → y2
>sin(f(x+1)*f(f(5))/sqrt(f(Pi+y));
sin( x + 1)2
625
π+y
>diff(f(z), z);
2z
C. Khi ta đã tính toán một biểu thức và muốn tạo ra một hàm để
định nghĩa nó hãy sử dụng câu lệnh unapply.
>expr1:= tan(t):
>expr2:= diff(tan(t), t):
>f:= unapply(expr2, t);
f := t → 1 + tan(t)2
D. unapply có thể nạp thêm tham số vào cho hàm đã được định nghĩa.
>expr3:= subs(t=s*t, expr2):
>g:= unapply(expr3, s, t);
g := (s, t) → 1 + tan(st)2

Trong Chương 6 sẽ có phương pháp tạo ra các hàm bằng cách


1.11. Lệnh alias đặt bí danh các hàm và ký hiệu 39

định nghĩa trong proc / end với lập trình của Maple.

1.11. Lệnh alias đặt bí danh các hàm và ký hiệu


Gán cho biểu thức một bí danh.

>alias(<Tên>= <Biểu thức>)


Ta có thể tạo ra một tên ngắn cho các hàm hoặc các biểu thức
mà thường xuyên sử dụng. <Tên> là một √ ký tự (hoặc một ký hiệu),
như cho ký tự "a" đại diện cho biểu thức x2 − 2. Maple sử dụng việc
xử lý tượng tự như hàm subs (hàm thay thế) thay biểu thức bằng bí
danh. Nếu ta gán bí danh có tên "alpha" cho một biểu thức con trong
biểu thức thì khi in ra biểu thức này sẽ in thay "alpha" bằng biểu
thức con này. Câu lệnh alias để đặt bí danh. Khi làm việc tương tác
với Maple, tại bất kỳ vị trí nào của dòng lệnh nhập vào, nếu Maple
thấy một bí danh thì nó sẽ trực tiếp thay thế biểu thức vào đó. Bí
danh không thực hiện khi trong nó lại có chính bí danh này. Những
đối số và các biến cục bộ bên trong những hàm thủ tục Maple không
được thiết lập bí danh.

Ví dụ 1.14. Tính toán có bí danh.


>alias(alpha=sqrt(x^2-2));
α
>y:= alpha^3 + alpha^2;
3/2
y := x2 − 2 + x2 − 2

1.12. Sửa chữa lỗi


Maple có một vài quy định ngữ pháp đối với các giá trị nhập vào,
ví dụ như Maple quy định để tính một biểu thức thì kết thúc biểu
thức đó phải có dấu ";" hoặc dấu ":".

Ví dụ 1.15. Lỗi mắc phải khi nhập biểu thức.


A. Người sử dụng gõ thiếu một số ký tự. Maple thông báo lỗi xẩy ra
ở đâu bằng cách dừng con trỏ ở đó.
>2 * 4 * * 5 * 6 -;
syntax error:
2 * 4 * * 5 * 6 -;
^
40 Chương 1. Các lệnh tương tác với Maple

B. Người sử dụng sửa lỗi vừa được phát hiện, nhưng vẫn tồn tại một
lỗi ở phía cuối cuả biểu thức.
>2 * 3 * 4* 5 * 6 -;
syntax error:
2 * 3*4 * 5 * 6 -;
^
C. Biểu thức đúng đắn
>2 * 4 * 5 * 6 - 240;
480

Khi ta nhập vào một phép tính hoặc một câu lệnh mà không tuân
theo những quy định của Maple, thì Maple sẽ đáp lại bằng việc đưa
ra thông báo lỗi syntax error và con trỏ dừng lại tại điểm lỗi xẩy ra.
Khi đó cố gắng tìm lỗi ở về phía trước con trỏ để chữa. Làm như vậy
mà Maple vẫn còn báo lỗi thì phải tra cứu lại tài liệu hướng dẫn của
Maple tìm ra qui tắc đúng.

Ví dụ 1.16. Tập hợp các lỗi cú pháp.


A. Biểu thức có quá nhiều dấu ngoặc.
>(a + b))/2 +c;
Syntax error, ‘)‘ unexpected

B. Đôi khi lỗi xuất hiện sau dòng có lỗi. Ở đây người sử dụng quên
không đánh dấu ";" sau biểu thức 1 + 2.
>1+2
Syntax error, unexpected number
>3+4;
10
C. Người sử dụng quên không kết thúc Funny name bằng dấu nháy
đơn.
>p:= 1 + ’ Funny name;
Syntax error, missing operator or‘;‘

D. Một số từ khóa cấm không được dùng


>if+done;
Syntax error, reserved words ‘quit‘, ‘done‘, or ‘stop‘
unexpected
1.13. Đưa kết quả ra bằng print và lprint 41

Maple có một vài quy định giới hạn khi tính toán, ví dụ như ta
không thể thực hiện phép chia cho 0 hoặc tính tan(Pi/2). Khi đó
Maple thông báo lỗi chạy chương trình (run - time error) bắt đầu
bằng thành ngữ Error hoặc Error, (in function), khi function là
tên của một hàm của Maple. Đôi khi ta thấy tên một hàm trong
thông báo lỗi không phải câu lệnh mà ta đã gõ vào, nhưng đúng hơn
đó là một thủ tục con được cung cấp và sử dụng tại một bước nào đó
phía trước để tính ra kết quả.

Ví dụ 1.17. Tập hợp các lỗi run - time


A. Khi ta thực hiện Maple chia cho 0
0 >23/0;
Error, division by zero
B. Không thể tính được đạo hàm của sin(x) theo 5, vì 5 không phải
là biến của hàm.
>diff(sin(x), 5);
Error,wrong number(or type)of parameteric in function diff;

C. Maple thông báo lỗi do không thể tạo được kết quả tính trong bộ
nhớ của máy tính.
>1234567890^9876543210;
Error, integer too large in context
>sum(f(i), i=1..2^16);
System error. object too large
D. Lệnh solve không thể giải được bất phương trình, vì không viết
đúng cú pháp của hàm này.
>solve({x^6 + 3*x + 1 >2}, {x});
Error,(in solve/ineqs) unable to handle these expressions

1.13. Đưa kết quả ra bằng print và lprint


In các biểu thức với dạng tuyến tính

>print( <Biểu thức>1,.. ,<Biểu thức>n );


>lprint( <Biểu thức>1,.. , <Biểu thức>n );
Mặc định Maple đưa ra kết quả tính bất kỳ một biểu thức nào
hoặc là phép gán mà ta vừa nhập vào theo dạng chuẩn. Câu lệnh
42 Chương 1. Các lệnh tương tác với Maple

print và lprint dùng để hiển thị giá trị của một hoặc nhiều biểu
thức một lúc. print dùng cho tham số có giá trị gồm nhiều thành
phần được tách biệt bằng dấu phẩy. lprint dùng hiển thị những giá
trị số do kết quả tính toán <Biểu thức>1,<Biểu thức>2... trên một
dòng, không tách bằng dấu phẩy. Những kết quả của lệnh lprint
được hiển thị trên một dòng với khuôn mẫu giống như khuôn mẫu
ta gõ vào.
Với cả hai câu lệnh print và lprint, các biến giữa hai dấu ’ không
đưa ra.

Ví dụ 1.18. Dùng hàm print và lprint.


A. Đưa ra kết quả theo kiểu mặc định của Maple.
>a:= 3/47;
3
a :=
47
>b:= (a+x)^2/x;
(3/47 + x )2
b :=
x
B. lprint đưa ra các kết quả trên một dòng.
>lprint(a, b, a-1);
3 (3/47 + x )2 −44
, ,
47 x 47
C. Kết quả tượng tự được đưa ra bằng hàm print.
>print(a, b, a-1);
3 (3/47 + x )2 −44
, ,
47 x 47
D. lprint không phân tách các thành phần bằng dấu phẩy.
>lprint(’a’s value is ’,a);
3
a’s value is
47
E. print phân tách các thành phần bằng dấu phẩy.
>print(’a’s value is ’,a);
3
a’s value is,
47

Tóm lại, chương này chúng ta đã biết Maple có thể làm các phép
toán số học, tuân theo luật lệ ưu tiên thường thấy. Maple cũng có
1.14. Bài tập có lời giải 43

một loạt hằng, hàm số toán học cơ bản mà ta có thể dùng ngay khi
tính toán. Đồng thời Maple báo cho ta các lỗi khi ta gõ vào không
đúng luật.

1.14. Bài tập có lời giải


. 1.1. Tính biểu thức (sin π8 )4 + (cos 3π 4 5π 4 7π 4
8 ) + (sin 8 ) + (cos 8 ) .

. 1.2. Tính biểu thức cos π3 + tan 14π


3 .

. 1.3. Tạo một biểu thức lấy từ vế trái và một biểu thức lấy từ vế
phải của phương trình a2 − b2 = c.

. 1.4. Tạo một biểu thức lấy từ tử số và một biểu thức lấy từ mẫu số
a2 + b
của biểu thức sau f = .
2a − b
. 1.5. Khai triển biểu thức sau ( x + 1)( x − 1)( x2 − x + 1)( x2 + x + 1).

. 1.6. Phân tích ra thừa số biểu thức p = x5 − x4 − 7x3 + x2 + 6x.

a4 − b4
. 1.7. Giản ước biểu thức .
( a2 + b2 ) ab

. 1.8. Rút gọn biểu thức (cos x − sin x )(cos x + sin x ).

. 1.9. Phân tích ra thừa số p = x3 + 4x2 + 2x − 4.


1 + sin 2x + cos 2x
. 1.10. Đơn giản biểu thức sau .
1 + sin 2x − cos x

. 1.11. Rút gọn biểu thức 3(sin4 x + cos4 x ) − 2(sin6 x + cos6 x ).


p
. 1.12. Xác định hàm f = 1 − x2 − y2 và chuyển về tọa độ cực với
x = ρ cos ϕ, y = ρ sin ϕ và rút gọn biểu thức.

 x,
 x < −1;
2
. 1.13. Xác định hàm số f ( x ) = − x , −1 ≤ x < 1;

− x, x ≥ 1.

và cộng vào hàm x: x + f ( x ).

. 1.14. Cho số phức z = 3 + 2i, lấy phần thực và phần ảo của z và


thiết lập biểu thức liên hợp của nó.
44 Chương 1. Các lệnh tương tác với Maple

. 1.15. Tìm phần nguyên, phần dư và thử lại tổng hai số này của số
57
a= .
13
2 − 3i
. 1.16. Cho số phức z = + i6 . Tính phần thực, phần ảo, biểu
1 + 4i
thức liên hợp w và chỉ ra w + z = 2Re(z).

1.15. Bài tập tự giải


. 1.17. Tính số π bằng hai cách: Tính số π bình thường gán vào biến
a và tính π với độ chính xác 15 chữ số gán vào b. Tính hiệu b − a.
. 1.18. Khai triển Taylor hàm số cos x tại x = 0.5.
. 1.19. Đư các số hạng của biểu thức sau vào một dãy: x5 + 3x4 +
4x3 + x2 + 2x + 1.
n
. 1.20. Tính tổng ∑ ik với k = 8, 9, 10, 11.
i =1
∞ ∞ ∞ ∞
   
1 1
. 1.21. Tính tổng ∑ ∑ m
. và ∑ ∑ k .
n =2 m =2 ( p + n ) k =2 m =2 m

. 1.22. Liệt kê 50 số hạng đầu tiên của dãy {7−i }.


. 1.23. Cho z1 = a + ib, z2 = c + id, tính công thức
z1
z1 z2 , z1 + z2 , , z1 + z̄1 .
z2
q √ √
. 1.24. Viết lệnh rút gọn biểu thức 3 + 3 + (10 + 6 3)1/3 .

. 1.25. Tính a) (−1 + i )5 và b) eiπ/2 .


. 1.26. Phân tích ra thừa số p = x3 − 4x2 + 5x − 2.
. 1.27. Đơn giản biểu thức sin2 3x − sin2 2x − sin 5x sin x.
. 1.28. Tính phép toán sau có 5 chữ số thập phân
√ √3 1

27 2

(a) 27 (b) 8 2 (c) − .
3 64
. 1.29. Tính số e, π chính xác đến 500 chữ số thập phân.
. 1.30. Cho A = {19, 25, 31, 37, 43, 49, 55} và
B = {23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71}.
Tìm A ∩ B, A ∪ B và A \ B.
CHƯƠNG 2
MAPLE VỚI GIẢI TÍCH SƠ CẤP

2.1. Giải các phương trình đại số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45


2.2. Phép thế biểu thức bằng hàm subs . . . . . . . . . . . . . . . . . . . . . . . 49
2.3. Giải số các phương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.4. Tính giới hạn các hàm số thực và số phức . . . . . . . . . . . . . . . 53
2.5. Tính tổng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.6. Chuỗi nguyên . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.7. Tính đạo hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
2.8. Tính tích phân xác định và không xác định . . . . . . . . . . . . . . . 59
2.9. Giải phương trình sai phân bằng rsolve . . . . . . . . . . . . . . . . . . 60
2.10. Hàm thực hiện trên mọi phần tử biểu thức . . . . . . . . . . . . . 62
2.11. Bài tập có lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
2.12. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Trong chương trình toán học chúng ta đã biết nhiều phương pháp
giải phương trình, các phép toán trên đa thức, hay khảo sát những
tính chất khác nhau của các hàm số, v.v... Chương này nghiên cứu
các lệnh trong Maple có thể giúp ta giải các phương trình và cho kết
quả ngay.

2.1. Giải các phương trình đại số


Giải phương trình theo ẩn

>solve(<Phương trình>);
>solve(<Phương trình>, <Tên biến>);

Trong mẫu thứ nhất, <Phương trình> có thể là phương trình một
ẩn số như 3x + 4 = 5x lệnh trong Maple là solve(3x + 4 =5x);.
Mẫu thứ hai cho phương trình có nhiều ẩn số, khi đó yêu cầu
giải theo ẩn số số nào như ln( x2 − 1) = a, lệnh trong Maple là
solve(ln(x^2 - 1) = a, x);. Giá trị kết quả của lệnh solve có thể
là số hoặc biểu thức, đó chính là nghiệm của phương trình.
Nếu solve tìm ra được nhiều hơn một nghiệm của phương trình
thì nó đưa ra tất cả các nghiệm đó, mỗi nghiệm cách nhau bởi dấu
46 Chương 2. Maple với giải tích sơ cấp

phẩy. Khi phương trình không có nghiệm, solve sẽ không đưa ra giá
trị gì (hoặc ký hiệu NULL). Bằng việc gán kết quả của solve cho một
biến ví dụ như s, ta có thể lấy ra từng nghiệm bằng việc sử dụng toán
tử lựa chọn hoặc chỉ số của s.

Ví dụ 2.1. Giải phương trình một ẩn.


A. Giải phương trình đơn giản một ẩn.
>solve(3*x + 4 = 5*x);
2
B. Giải phương trình có nhiều hơn một nghiệm. Maple đưa ra một
dãy các nghiệm, mỗi nghiệm cách nhau một dấu phẩy.
>solve(ln(x^2 - 1) = a, x);
−1/2(4 exp( a) + 4)1/2 , 1/2(4 exp( a) + 4)1/2

C. Khi ta cho đối số của solve một biểu thức thay cho một phương
trình, Maple sẽ thiết lập một phương trình bằng việc gán cho biểu
thức đó giá trị 0.
>solve(q^3 - k, q);
−1 1/3 −1 1/3 1/3 −1 1/3 −1 1/3 1/3
k1/3 , k + 3 k I, − k − 3 k I
2 2 2 2

D. Gán kết quả của phương trình cho một biến và đối chiếu tới mỗi
nghiệm bằng tệp chỉ số.
>solutions:= %;
−1 1/3 −1 1/3 1/3 −1 1/3 −1 1/3 1/3
solutions := k1/3 , k + 3 k I, − k − 3 k I
2 2 2 2
>solutions[1];
k1/3
>solutions[3];
−1 1/3 −1 1/3 1/3
− k − 3 k I
2 2

Giải hệ phương trình nhiều ẩn

>solve(<Tập các phương trình>,<tập các biến>) ;

Nếu như ta truyền cho hàm solve một tập phương trình cùng với
tập các tham số, Maple sẽ đưa ra tập nghiệm.
2.1. Giải các phương trình đại số 47

Ví dụ: Giải hệ phương trình sau với t là thông số.


(
x = y+2
y−x = t
Lệnh trong Maple giải hệ hai phương trình với hai ẩn số x và y với
thông số t.
>solve({x = y + 2, y - x = t}, {x, y});
Mỗi phần tử của tập nghiệm sẽ là một phương trình có dạng
<ẩn số>= <Biểu thức>, trong đó <ẩn số> là một biến lời giải.
Để cho gọn, người ta thường gán tập hợp hệ phương trình vào
một biến và tệp các biến cần tìm vào một biến khác, sau đó dùng
lệnh giải hệ tác động lên hai biến này. Chúng ta xét các ví dụ sau.
Ví dụ 2.2. Nghiệm của hệ phương trình.
A. Giải hệ phương trình tuyến tính, ẩn số gom vào một tập hợp. Khi
đó nghiệm cũng là một tập hợp.
>eqnset:= {x+y =b, a*x - 2/3 *y = k};
2
eqnset := { x + y = b, ax − y = k }
3
>varset:= {x, y};
varset := { x, y}
>SolutionSet:= solve(eqnset, varset);
−k + ba
 
2b + 3k
SolutionSet := x = ,y = 3
3a + 2 3a + 2
B. Hàm assign sẽ lấy ra tập nghiệm từsolve, và gán vào những biến
thích hợp tương ứng.
>assign(SolutionSet);
>x ;
2b + 3k
x=
3a + 2
>y;
−k + ba
y=3
3a + 2
C. Các giá trị của hệ phương trình bây giờ bao gồm các thông tin
được cập nhật về x và y.
>eqnset;
−k + ba −k + ba
 
2b + 3k 2b + 3k
+3 = b, a −2 =k
3a + 2 3a + 2 3a + 2 3a + 2
48 Chương 2. Maple với giải tích sơ cấp

D. Câu lệnh simplify rút gọn biểu thức dựa trên các giá trị đã biết.
>simplify(eqnset);
{b = b, k = k}
E. Thiết lập lại giá trị cho x và y như là ẩn số.
>x:= ’x’; y:= ’y’;
x := x
y := y

F. Phương trình có dạng ban đầu.


>eqnset;
{ x + y = b, ax − 2/3y = k}

Maple luôn luôn tìm ra tất cả nghiệm của một hệ phương trình
tuyến tính nếu có đủ bộ nhớ và thời gian tính toán. Tuy nhiên cách
này thường không thực hiện được với hệ phương trình phi tuyến
thậm chí hệ có nghiệm. Nếu như Maple không thể tìm được nghiệm
nào của các phương trình, nó sẽ không hiển thị ra được gì và thực
hiện lệnh sau đó. Đôi khi Maple tìm được một vài nghiệm cho phương
trình hoặc hệ phương trình nhưng nó có thể không là tất cả nghiệm.

Ví dụ 2.3. Vấn đề khi không có nghiệm hoặc một vài nghiệm.


A. Khi không tìm ra nghiệm, Maple không đưa ra gì cả.
>solve(x = x+1, x);
>
>solve({cos(x*Pi)=0, cot(x*Pi/3) = 0}, {x});
>
B. Maple không luôn luôn in ra tất cả các nghiệm của phương trình.
>solve(cos(x*Pi) = 0, x);
1/2
C. Nếu không có biến nào được cung cấp làm ẩn cho phương trình,
Maple sẽ giải cho tất cả các biến thành ẩn.
>solve(a*x^2 + b*x + c = 0);
{c = − ax2 − bx, x = x, a = a, b = b}

Đôi khi nghiệm bao gồm những số đại số. Một vài số đại số có

dạng như sau: 4 và −4 là nghiệm của x2 − 16; 2 là nghiệm của
2.2. Phép thế biểu thức bằng hàm subs 49

x2 − 2. Tuy nhiên, đôi khi ta nhận được nghiệm trong Maple là các
số đại số như nghiệm của đa thức đã cho, ví dụ nghiệm của phương
trình x3 + 3x = 2 là RootOf(_Z3 + 3*_Z =2).
Nhất là khi ta thấy "RootOf" trong kết quả nghiệm của solve,
mỗi nghiệm đều là nghiệm của đa thức bên trong ký hiệu này.
(
y2 + 1 = x,
Ví dụ 2.4. A. Giải hệ phương trình
x + 2 = y.

>s:=solve({y^2 + 1 = x, x + 2 = y}, {x, y});


s := {y = RootO f (_Z2 + 3 − _Z ), x = −2 + RootO f (_Z2 + 3 − _Z )}
B. Nhưng thực chất giá trị của nghiệm là
>evalf(s[1]);
x = -1.500000000+1.658312395*I
>evalf(s[2]);
y = .5000000000+1.658312395*I

Tóm lại, chúng ta cảnh giác với kết quả mà hàm solve đưa ra và
nên kiểm tra lại. Tuy nhiên trong rất nhiều trường hợp solve thực
hiện rất có hiệu quả.

2.2. Phép thế biểu thức bằng hàm subs


I. Thế cho một biến bên trong biểu thức
>subs(<Biến>= <Lượng thay>, <Biểu thức>);
II. Thực hiện nhiều phép thế trong biểu thức

>subs(<Biến>1=<Lượngthay>1,<Biến>2=<Lượngthay>2,<Biểuthức>);

Với việc tính toán kéo dài nhiều bước, việc thay thế như
f = m*a, v = i*r hoặc x = 5/3 vào biểu thức là rất cần thiết.
Chúng ta có thể làm được điều đó bằng phép thay thế tất cả f trong
biểu thức bởi m*a, hoặc tất cả các v bằng i*r, ... trong Maple với mẫu
đầu tiên của hàm subs sẽ thực hiện được việc này. Kết quả là nhận
được một biểu thức mới bằng việc thay thế tất cả ký hiệu <Biến>
trong biểu thức bằng <Lượng thay>.
Hai phép thế có thể được thực hiện trong biểu thức bằng mẫu
thứ hai của câu lệnh subs. Tất cả <Biến>1 được thay thế bằng
50 Chương 2. Maple với giải tích sơ cấp

<Lượng thay>1 và <Biến>2 được thay thế bằng <Lượng thay>2. Cũng
có thể thực hiện được nhiều phép thay thế khi sử dụng subs bằng
việc cho câu lệnh này tập các biểu thức thế.
Ví dụ 2.5. Phép thế một biểu thức bằng subs
A. Câu lệnh subs có thể dùng thử lại nghiệm của phương trình và
kiểm tra tính tính đúng đắn nghiệm.
>soln:= solve(3*x - y = x, x);
1
soln := y
2
>subs(x = soln, 3*x - y = x);
1 1
y= y
2 2
B. Thay thế đồng thời nhiều ký hiệu bằng các ký hiệu khác hoặc biểu
thức khác.
>msol:= solve(e = m*c^2, m);
e
msol := 2
c
>subs(m= msol, a=9.8, c=300000, f = m*a);
f = .10888888899 ∗ 10−9 e
C. Lưu ý rằng việc thay thế được thực hiện từ trái qua phải. Trong
trường hợp này c được thay thế trước và bất kỳ một c nào trong biểu
thức sau đó không được thay thế.
>subs(c=300000,m=msol,a= 9.8, f = m*a);
f = 9.8

D. Thay thế một biểu thức bằng một biểu thức khác.
>expr2:= cos(x)^2 + tan(x)^2;
expr2 := cos( x )2 + tan( x )2

>subs(tan(x)=sin(x)/cos(x),cos(x)^2=1-sin(x)^2,expr2);
sin( x )2
11 − sin( x )2 +
cos( x )2
>subs( cos(x)^(-2) = 1/(1 - sin(x))^2, %);
sin( x )2
11 − sin( x )2 +
1 − sin( x )2

Tham số đầu tiên cho subs có thể là một tập (hoặc một danh sách)
các phương trình. Vì vậy ta có thể sử dụng kết quả của solve cho các
2.3. Giải số các phương trình 51

phép thế khi muốn kiểm tra nghiệm của phương trình và hệ phương
trình. Dùng phép thế tập hợp cho hàm subs để thực hiện một cách
đồng thời các nghiệm thay vì phải thực hiện nhiều lần.

Ví dụ 2.6. Thay thế biểu thức liên tiếp.


A. Phép thế đầu tiên cho x và tiếp đến y.
>f:= x*y^2 + z;
f := xy2 + z
>subs(x=y, y=x, f);
x3 + z
B. Thay vì các phép thế được thực hiện theo thứ tự. ở đây ta thực
hiện các phép thế đồng thời.
>subs({x=y, y=x},f);
yx2 + z

2.3. Giải số các phương trình


Lệnh giải số các phương trình

>fsolve( <Biểu thức>);


>fsolve( <Tập các phương trình>, <Tập Biến>);
>fsolve( <Tập các phương trình>, <Tập biến>, <Tùy chọn>);
Phương pháp giải số các bài toán có sử dụng phép tính toán với số
dấu chấm động. fsolve cũng như solve được dùng tìm nghiệm của
các phương trình đại số, nhưng fsolve sử dụng phương pháp giải
số thay cho phép biến đổi công thức. Trong khi solve sử dụng phép
loại trừ các biến trong phương trình của hệ, các hằng đẳng thức
hoặc phân tích ra tích đa thức để tìm nghiệm, thì fsolve dùng kỹ
thuật sinh ra những dãy giá trị trung gian hội tụ tới nghiệm đúng.
Vì trong khi tính toán dùng các phép tính trên số chấm động, nên
nghiệm do fsolve tìm được có thể chỉ xấp xỉ nghiệm chính xác. Mặc
định fsolve tìm một giá trị nghiệm thực cho phương trình. Ngoại
trừ, nếu <Biểu thức> là một đa thức thì tất cả các nghiệm thực sẽ
được đưa ra. fsolve không đưa ra gì cả khi nó không tìm được một
nghiệm nào, nhưng không có nghĩa là phương trình vô nghiệm.

Ví dụ 2.7. Dùng fsolve giải phương trình bằng phương pháp số .


A. fsolve cũng như solve giải phương trình và hệ phương trình.
52 Chương 2. Maple với giải tích sơ cấp

>fsolve(cos(x) = x);
.7390851332
B. fsolve sẽ không in ra một thông tin gì khi phương trình không
có nghiệm thực.
>fsolve({x^2+y^2=1,x^3*y+2*x*y=3},{x, y});
>
>fsolve (x^2 + 1 = 0, x);
>
C. Nhiều khi fsolve trả về đúng biểu thức vừa được nhập vào khi
không giải được.
>fsolve (sin(x)^2 + cos(x)^2 = 2);
f solve(sin( x )2 + cos( x )2 = 2, x )

D. fsolve tìm tất cả các nghiệm thực của phương trình. solve tìm cả
nghiệm giá trị số phức.
>fsolve (x^4 - x^3 - x^2 -x -2, x);
−1., 2.
>solve (x^4 - x^3 - x^2 -x -2, x);
−1., 2., I, − I

Tham số tuỳ chọn của hàm fsolve có thể các giá trị trong bảng 2.1.

Bảng 2.1. Giá trị tham số tuỳ chọn cho hàm fsolve.
Tùy chọn Chức năng
complex Tính các nghiệm phức. Nếu <Biểu thức> là một
đa thức thì tất cả các nghiệm phức đươc tìm.
a..b Nếu <Biểu thức> chứa một biến số, fsolve chỉ
tìm nghiệm trong khoảng mở (a, b).
{x = a..b, Giới hạn việc tìm nghiệm khi <Biểu thức> chứa
y = c..d,...} đựng một vài tham số.
maxsols=n Tìm nhiều nhất n nghiệm của đa thức
fulldigits Mặc định, fsolve sử dụng thích hợp giá trị chữ
số thập phân Digits cho cụ thể máy tính để tiết
kiệm bộ nhớ và thời gian tính toán. Nhưng đặt
fulldigits vào tùy chọn của fsolve thì Maple
dùng Digits trong tính toán độ chính xác, nên
mất khá nhiều thời gian.
2.4. Tính giới hạn các hàm số thực và số phức 53

Ví dụ 2.8. Những ví dụ khác của fsolve.


A. Tìm tất cả các nghiệm thực của phương trình.
>poly:= 23*x^5 + 105*x^4 - 10*x^2 + 17*x:
>fsolve(poly, x);
0, −4.5361689813431116003, −.63718131853104998515
B. Tìm tất cả các nghiệm phức của phương trình.
>fsolve(poly, x, complex);
0, −4.5361689813431116003, −.63718131853104998515,
.30406645428490687970 − .40406190575175854716 ∗ I,
.30406645428490687970 + .40406190575175854716 ∗ I
C. Tìm tất cả các nghiệm thực của phương trình trong khoảng
(−1, 0).
>fsolve(poly, x, x=-1..0);
−.6371813185
D. Tìm hai nghiệm thực của phương trình.
>fsolve(poly, x, maxsols = 2);
0, −4.536168981
E. Tìm một nghiệm thực củaphương trình trong đoạn [−5, 5], kết hợp
tùy chọn.
>fsolve(poly, x,x=-5..5, maxsols = 1);
−.6371813185
F. Ví dụ hệ phương trình
>f:= sin(a+b) - log10(a)*b = 0:
>g:= a - b^2 =1:

>fsolve({f, g}, {a, b}, {a = -1..1, b = -2..2});


{ a = 1.913283552, b = .9556587006}

2.4. Tính giới hạn các hàm số thực và số phức


I. Giới hạn thực hai phía
>limit( f, x = a );
Mẫu limit dùng để tính giá trị giới hạn của hàm f , đó là biểu
thức chứa tham số x, x tiến dần tới a. Hàm limit cho giá trị b nếu
như lim f = b tồn tại và có nghĩa. Hàm limit không phải lúc nào
x→a
54 Chương 2. Maple với giải tích sơ cấp

cũng tìm được kết quả chính xác. Hàm limit đưa ra đúng biểu thức
mà ta nhập vào khi nó không tìm được giới hạn.
Hàm limit chấp nhận tất cả các ẩn số trong biểu thức như những
số thực và số khác 0.
Điểm giới hạn a có thể là một số thực bất kỳ, một biểu thức,
hoặc infinity, -infinity. Nếu như điểm giới hạn là infinity hoặc
-infinity, thì giới hạn được thiết lập một phía, không hai phía như
mặc định. Kết quả của hàm limit có thể là số, biểu thức, infinity,
-infinity, undefined hoặc một đoạn thẳng c..d.
Ví dụ 2.9. Giới hạn thực hai hai phía.
A. Giới hạn hàm thực.
>r:= (x^2 - 1) / (11**x^2 - 2*x - 9):
>limit(sqrt(r), x = 1);
1 1/2 1/2
2 5
10
>limit(sin(x) / x, x = 0);
1
>limit(sin(x) / x^2, x = 0);
−1..1
>limit(sin(1/x), x = 0);
undefined
R1
B. Tính 0 sin xdx. Công thức tính tích phân xác định của hàm sin
trong khoảng từ 0 tới 1, bằng cách tính tổng hình chữ nhật có chiều
rộng 1/n và cho n tiến tới vô cùng
>intsin01:= sum(sin(i/n)*1/n, i = 1..n);
1 n+1
1 sin( n+ 1
) 1 sin( ) cos( )
intsin01 := − n
+ n n
2 n 2 1
n(cos( ) − 1)
n
1 1
1 sin( n1 ) 1 sin( n ) cos( n )
+ −
2 n 2 1
n(cos( ) − 1)
n
>limit(intsin01, n = infinity);
− cos(1) + 1
C. Hàm signum là một hàm xác định dấu
>limit(c*x, x = infinity);
signum(c)∞
2.4. Tính giới hạn các hàm số thực và số phức 55

II. Giới hạn một phía

>limit( f, x = a, <tùy chọn>);


Mẫu thứ hai của hàm limit được dùng để tính giới hạn theo phía
phụ thuộc <tùy chọn>. Bảng 2.2 liệt kê <tùy chọn> cho giới hạn. Tùy
chọn complex tính giới hạn theo mọi phía.

Bảng 2.2. Các giá trị tuỳ chọn của limit.


<Tùy chọn> Tính giới hạn
left lim f ( x ).
x → a−
right lim f ( x ).
x → a+
complex Giá trị infinity ở đây là một giá trị không xác
định phức như điểm giới hạn tiến dần tới nó.
real Giống như kết quả của giới hạn thực hai phía
(khi không có tùy chọn), trừ khi điểm giới hạn
ở vô cực. Trong trường hợp này b là tồn tại nếu:
b = lim f ( x ) = lim f ( x ).
x →−∞ x →+∞

Ví dụ 2.10. Giới hạn một phía và thay đổi giới hạn tai điểm vô cực.
A. Giới hạn một chiều.
>limit(tan(x), x = Pi/2, right);
−∞
>limit(tan(x), x = Pi/2, left);

B. Giới hạn thực hai chiều không tồn tại.
>limit(tan(x), x = Pi/2);
unde f ined

C. Nhưng giới hạn tùy chọn complex tồn tại.


>limit(tan(x), x = Pi/2, complex);

D. Giới hạn với x tiến tới vô cùng (vô cùng dương).
>limit(-x, x = infinity);
−∞
E. Giới hạn với x tiến tới âm vô cùng (vô cùng thực âm).
56 Chương 2. Maple với giải tích sơ cấp

>limit(-x, x = -infinity);

F. Với x tiến tới vô cùng( theo hai chiều giới hạn).
>limit(-x, x = infinity, real);
unde f ined

G. Với x tiến tới vô cùng phức.


>limit(-x, x = infinity, complex);

2.5. Tính tổng


I. Tổng hữu hạn phần tử

>sum(<Lệnh tính tổng>,<biến chỉ số = cận dưới .. cận trên>);

II. Tổng vô hạn phần tử

>sum(<Lệnh tính tổng>,<biến chỉ số >);

Ví dụ 2.11. Tính tổng bằng hàm sum


A. Tính tổng 100 số nguyên đầu tiên
>sum(i, i = 1..100);
5050
n
B. Tính tổng bình phương của n số nguyên ∑ i2
i =1

>sum(i^2, i = 1..n);
1/3(n + 1)3 − 1/2(n + 1)2 + 1/6n + 1/6
n
C. Tổng ký hiệu xác định của chuỗi 2i với i = m..n, ∑ 2 j
j=m

>sum(2^j, j = m..n)
2n +1 − 2n
D. Tính tổng vô hạn phần tử.
>sum(1 / (i^2), i);
− Psi (1, i )
2.6. Chuỗi nguyên 57

E. sum đưa ra biểu thức ban đầu khi nó không tìm được kết quả.
>sum(1/(1 - i), i = 0..n);
n 1

i =0 1 − i
>lprint(%);
sum(1/(1 - i), i = 0..n)

2.6. Chuỗi nguyên


>series(<Biểu thức>, <Biến=tại điểm>,<Bậc giới hạn>);
Maple có thể xây dựng một chuỗi Taylor có hữu hạn các số hạng
(và chuỗi Laurent) cho biểu thức. Giá trị của biến điều khiển Order
cắt cụt đến bậc lớn nhất của chuỗi. Giá trị của Order được mặc định
bằng 6, nhưng ta có thể thay đổi nó bằng phép gán cũng như đối với
tất cả các biến toàn cục. Số hạng cuối cùng của chuối là hàm số hạng
dư O( x n ).
Ví dụ 2.12. Tính chuỗi luỹ thừa.
A. Tính một số số hạng đầu tiên của chuỗi Taylor cho sin x khai triển
tại x = 0. Giá trị mặc định của Order chuỗi được tính tới O( x6 ).
>t1:= series(sin(x), x = 0);
t1 := x − 1/6x3 + 1/120x5 + O( x6 )
B. Tham số tuỳ chọn (đối số thứ ba) thiết lập lại giá trị Order, mặc
định ban đầu của nó là 6.
>t2:= series(ln(x), x = 1, 4);
t2 := x − 1 − 1/2( x − 1)2 + 1/3( x − 1)3 + O(( x − 1)4 )
C. Thông tin về bậc của lũy thừa được dùng trong phép tính số học
trên chuỗi. Ví dụ dưới đây cho kết quả chỉ có O( x7 ) vì bậc của t1 chỉ
tới O( x6 ).
>S:= series(t1*t1, x = 0, 10);
S := x2 − 1/3x4 + 2/45x6 + O( x7 )
D. Để tính giá trị của chuỗi, thì chuyển đổi chuỗi đó thành đa thức
bằng cách loại bỏ phần số hạng bậc. Maple có convert để chuyển đổi
chuỗi thành đa thức.
>P:= convert(%, polynom);
P := x2 − 1/3x4 + 2/45x6
58 Chương 2. Maple với giải tích sơ cấp

E. Tính giá trị chuỗi bằng thế giá trị cho biến độc lập ở đa thức trên.

>subs(x = 2, P);
68
45
F. Tính trực tiếp chuỗi tai giá trị biến không làm được, khi số hạng
bậc chưa loại bỏ.

>subs(x = 2, S);
Error, invalid substitution in series

G. Để bỏ các số hạng bậc cao của chuỗi đa thức ta sử dụng hàm rem.
Hàm rem sẽ bỏ tất cả số hạng của chuỗi đa thức P bậc lớn hơn 5.

>rem(P, x^6, x);


x2 − 1/3x4

H. Những đa thức khai triển theo chuỗi là chính các đa thức này nếu
bậc khai triển lớn hơn bậc của đa thức.

>series(x^10 + 1, x = 0, 20);
1 + x10
>series(x^10 + 1, x = 0, 5);
1 + O( x10 )

I. Maple có một lệnh asympt dùng để tính tiệm cận chuỗi. Ví dụ


dưới đây dùng asympt để tạo ra công thức xấp xỉ Sterling cho n!

>S1:= simplify(asymt(n, n, 1));!


1
S1 := 212 Pi1/2 n1/2 + O( 1/2 )nn exp(−n)
n
K. Để tính dược số hạng bậc của chuỗi tiệm cận chúng ta có thể thay
"hàm zero" cho "hàm O lớn".
>simplify(subs(0 = 0, S1));
21/2 Pi1/2 n1/2+n exp(−n)

L. Maple có thể tính được chuỗi Laurent và chuỗi Poisson.

>series(GAMMA(x), x = 0, 2);
x −1 − γ + (1/12Pi2 + 1/2γ2 ) x + 0( x2 )
>series(sqrt(cos(x), x = 0, 4);
1 − 1/4x2 + 0( x4 )
2.7. Tính đạo hàm 59

2.7. Tính đạo hàm


Tính đạo hàm biểu thức

>diff(<Biểu thức>,<Biến lấy đạo hàm>);


diff tính đạo hàm của <biểu thức> theo biến <Biến lấy đạo hàm>.

Ví dụ 2.13. Đạo hàm bậc nhất theo x


>diff(sin(ln(x^2 + 1) / 3), x); 
2
cos ln( x2 + 1) x
2 3
3 x2 + 1

Ta có thể tính được đạo hàm riêng bậc cao với dãy biến bằng diff.
∂2
Ví dụ sau tính đạo hàm riêng của biểu thức theo s và t.
∂t∂s
Ví dụ 2.14. Đạo hàm riêng bậc hai của biểu thức theo s và t.
>(t^2 - s) / (s^3 - 1):
>diff(%, t, s);
6ts2

( s3 − 1)2

2.8. Tính tích phân xác định và không xác định


I. Tính tích phân không xác định.

>int(<Biểu thức >,<Biến lấy tích phân>);


II. Tích phân xác định

>int(<Biểu thức>,<Biến lấy tích phân>=<Cận dưới..Cận trên>);

Maple sẽ tính tích phân xác định và tích phân không xác định
bằng lệnh int. Nhiều khi lệnh int lấy tích phân không được, Maple
không đưa ra biểu thức ban đầu.

Ví dụ 2.15. Ký hiệu tích phân xácZđịnh và không xác định.


A. Tính tích phân không xác định x3 cos xdx.

>int(x^3*cos(x), x);
x3 3 sin x ( x ) + 3x2 cos( x ) − 6 cos( x ) − 6x sin( x )
60 Chương 2. Maple với giải tích sơ cấp

Z2a p
B. Tích phân xác định x3 x2 − a2 dx.
a

>int((x^3)*sqrt(x^2 - a^2), x = a..2*a);


14 5 31
a
5 2
x2
Z
C. Tính √ dx.
1 − x2
>int((x^2)*sqrt(1 - x^2), x);
1 1
− x (1 − x2 )1/2 + arcsin( x )
2 2
D. Tính các tích phân xác định khác.
>int(cos(theta)^3, theta = 0..Pi/2);
2/3
>int(1 / (1+x^2), x = 0..infinity);
1/2Pi
E. Khi Maple không thể tính được tích phân của biểu thức, kết quả
thực hiện đưa ra lại chính là biểu thức nhập vào.
>int(1 / (x+exp(x)), x= 0..1);
Z 1
1
dx
0 x + exp (x)
F. Sử dụng lprint để lấy lại kết quả ban đầu.
>lprint(%);
int(1 / (x+exp(x)), x= 0..1)
G. Tuy nhiên ta có thể sử dụng evalf để tính giá trị của tích phân đó.
>evalf(%);
.5163007634

2.9. Giải phương trình sai phân bằng rsolve


>rsolve( <Phương trình sai phân>,<Hàm số(biến)>);
>rsolve(<Tệp PT sai phân và ĐK ban đầu>,<Hàm số(biến)>);
>rsolve(<Tệp PT sai phân và ĐK ban đầu>,<Tệp Hàm số>);
Đẳng thức sai phân mô tả hàm không tường minh, mà là một
đẳng thức của hàm đó theo đối số n và tại giá trị nhỏ hơn n. Bài toán
2.9. Giải phương trình sai phân bằng rsolve 61

tìm công thức sai phân thường có điều kiện giá trị ban đầu của hàm
cần tìm. Ví dụ F (n) = F (n − 1) + F (n − 2) phương trình sai phân
với F (0) = 0, F (1) = 1 điều kiện ban đầu. Đây là dãy số Fibonaci
F (0) = 0, F (1) = 1, F (2) = 1, F (3) = 2, F (4) = 3, ......
Maple dùng lệnh rsolve để giải các bài toán tìm công thức sai
phân.
Dạng một, thông số đầu đòi hỏi đẳng thức sai phân, thông số thứ
hai là hàm cần tìm với đối số của nó. Nếu rsolve giải có kết quả thì
đưa ra hàm cần tìm. Ngược lại, Maple không đưa ra gì cả và chuyển
sang lệnh tiếp sau.
Dạng hai của rsolve khi muốn thay đổi những giá trị ban đầu
khác nhau. Đối số thứ nhất của rsolve là tập phương trình hồi qui
và điều kiện ban đầu. Nếu có cặp phương trình sai phân và giải cho
nhiều hàm thì dùng dạng ba.
Ngoài ra, rsolve có thể lấy đối số thứ ba bằng ztrans, khi đó
nó cố gắng giải phương trình sai phân bằng phương pháp đặc biệt
Z-biến đổi.

Ví dụ 2.16. Giải phương trình hồi qui bằng rsolve.


A. Giải phương trình sai phân tuyến tính f n = −3 f n−1 − 2 f n−2 .
>rsolve(f(n)=-3*f(n-1)-2*f(n-2),f);
(2 f (0) + f (1))(−1)n + (− f (0) − f (1))(−2)n

B. Tìm đẳng thức nghiệm của phương trinh Fibonacci.


>Fib_sol:=({F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)},F);
1 1/2 1 1 1/2 n 1 1/2 1 1 1/2 n
   
Fib_sol := 5 + 5 − 5 − 5
5 2 2 5 2 2

C. Đưa ra 11 số hạng của dãy nghiệm của phương trình trên. Dùng

hàm simplify để rút gọn các 5 trong biểu thức nghiệm cho kết quả.
>[seq(simplify(subs(n=i,Fib_sol)),i=0..10)];
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

D. rsolve có thể lấy thông số thứ ba bằng ztrans.


>rsolve({y(n+1)+f(n)=2*2^n+n,f(n+1)-y(n)=n-2^n+3,
y(1)=1,f(5)=6},{y,f},ztrans);
{ y ( n ) = − 1 + 2n , f ( n ) = n + 1 }
62 Chương 2. Maple với giải tích sơ cấp

2.10. Hàm thực hiện trên mọi phần tử biểu thức


I. Thực hiện hàm cho mọi thành phần của biểu thức

>map(f,<biểu thức>);

II. Hàm với đối số cho mỗi thành phần của biểu thức

>map(f,<biểu thức>,arg2,arg3,...,argn);
Maple xây dựng những toán tử như evalf, mod, normal,... tác
dụng trên tập số và các biểu thức. Nhưng chưa có hàm tác dụng trên
danh sách hoặc tập hợp tới mọi phần tử của nó. Hàm map được sử
dụng trong trường hợp này, lệnh thực hiện một hàm f tác động lên
mọi phần tử của một biểu thức. Hàm map không chỉ tác dụng trên
cấu trúc danh sách và tập hợp, mà còn trên tổng, tích, phương trình,
bảng,...

Ví dụ 2.17. Sử dụng hàm map.


A. Hiệu quả tác động hàm sin trên danh sách, tập hợp và tổng.
>L:=[3/5,Pi/2,ln(3)];
L := [3/5, Pi/2, ln(3)]
>map(sin,L);
[sin(3/5), 1, sin(ln(3))]

>s:={3*Pi/4,Pi,11+Pi/4};
s := { Pi, 3/4Pi, 11/4Pi }
>s2:=map(sin,s);
s2 := {0, 1/2, 21/2}
>expr:=1+ln(3)+exp(4);
expr := 1 + ln(3) + exp(4)
>map(sin,expr);
sin(1) + sin(ln(3)) + sin(exp(4))

B. evalf tác động tự động trên tập số


>evalf(L);
[.6000000000, 1.570796327, 1.098612289]
>evalf(s2);
{0, .7071067810}
C. Xây dựng hàm và thiết lập danh sách, tập hợp bằng các hàm
f ( x ) = x2 ; g( x ) = x, x2
2.11. Bài tập có lời giải 63

>f:=x->x^2;
f := x − > x2
>g:=proc(x) RETURN(x,x^2) end;
g := proc( x ) RETURN ( x, x2 )end
>L2:=[1,2,3,4];
L2 := [1, 2, 3, 4]
>s2:={op(L2)}
s2 := [1, 2, 3, 4]
D. Toán tử f và g tác dộng trên danh sách L2, tập hợp s2
>L3:=map(f,L2);
L3 := [1, 4, 9, 16]
>map(g,L2);
[1, 1, 2, 4, 3, 9, 4, 16]
>map(g,s2);
[1, 2, 3, 4, 9, 16]

2.11. Bài tập có lời giải


(
x 2 − y2 = 1,
. 2.1. Giải hệ phương trình .
x2 + xy = 2.

. 2.2. Giải số phương trình sau: x2 = cos( x ).

. 2.3. Tính công thức hàm f ( x ) thỏa mãn f 2 ( x ) − 2 f ( x ) = x.

. 2.4. Tìm tất cả nghiệm của 5 sin( x ) + 12 cos( x ) = 13.


sin(2x )
. 2.5. Tính giới hạn lim .
x →0 x
πx
. 2.6. Tính giới hạn lim (1 − x ) tan .
x →1 2
1 1
. 2.7. Tính giới hạn một phía lim arctan và lim arctan .
x →1− 1−x x →1+ 1−x
. 2.8. Tính đạo hàm f ( x ) = sin3 2x − cos3 2x.
d24 x x2 − 1 .

. 2.9. Tính biểu thức dx 24 e

(sin ( x ))2
. 2.10. Tính đạo hàm bậc 2 của biểu thức y = tại các
2 + sin ( x )
π
điểm π và .
2
64 Chương 2. Maple với giải tích sơ cấp

1
. 2.11. Tìm điểm gián đoạn của hàm số y = e x + 3 .
x
. 2.12. Tìm điểm gián đoạn của hàm số y = tan .
2−x
. 2.13. Tính giá trị lớn nhất và nhỏ nhất √ của hàm
2
f ( x ) = 1/2 x − 1/2 arcsin ( x ) + 1/4 x 1 − x2 − 1/12 π x2 .


. 2.14. Tính giá trị lớn nhất và nhỏ nhất của f ( x ) = x2 ln x.

x3
. 2.15. Tính các giá trị cực trị của y = .
4 − x2

2.12. Bài tập tự giải


. 2.16. Hãy tìm những nghiệm hữu tỉ của phương trình
a) x4 − 2x3 − 8x2 + 13x − 24 = 0;
b) x5 − 7x3 − 12x2 + 6x + 36 = 0;
c) x5 − 2x4 − 4x3 + 4x2 − 5x + 6 = 0;
d) 24x5 + 10x4 − x3 − 19x2 − 5x + 6 = 0;
e) x4 − 7x2 − 5x − 1 = 0;
f) x6 − 6x5 + 11x4 − x3 − 18x2 + 20x − 8 = 0.

. 2.17. Hãy tìm những giá trị của tham số λ sao cho những nghiệm
α1 , α2 , α3 , α4 của đa thức

P( x ) = x4 − x3 + λx2 − x − 6

thỏa mãn điều kiện α1 + α2 = 1.

. 2.18. Hãy tìm những giá trị của tham số λ sao cho những nghiệm
α1 , α2 , α3 , α4 của đa thức

P( x ) = x4 + 2x3 − 6x2 + λx + 11

thỏa mãn điều kiện α1 + α2 = α3 + α4 .

. 2.19. Hãy tìm những giá trị của tham số λ sao cho những nghiệm
α1 , α2 , α3 , α4 của đa thức P( x ) = x4 + 4x3 + 9x2 + 12x + λ thỏa mãn
điều kiện α1 α2 = α3 α4 .
2.12. Bài tập tự giải 65

. 2.20. Tính giới hạn của


1 x

sin x
(a) lim , (b) lim 1 + .
x →0 x x →∞ x
. 2.21. Tính giá trị của
2x2 + 25x + 72 9 3x2 − 7x − 20 5
(a) 2
tại x = − , (b) 2
tại x = − .
72 − 47x − 14x 2 21x + 14x − 35 3
sin 3x
. 2.22. Tính giới hạn của lim .
x →0 x
x
x2 − 2x + 1

. 2.23. Tìm giới hạn lim .
x →∞ x2 − 4x + 2
1
. 2.24. Tìm giới hạn của hàm số y = với x → +0 và
1 + x1/x
với x → −0.
1
. 2.25. Lấy giới hạn của hàm số f ( x ) = 3 tại các giá trị của
x − 2x2
x = −∞; 0; 2; ∞.
∂5
. 2.26. Tính đạo hàm bậc cao (ln x ).
∂x5
1
. 2.27. Tìm điểm gián đoạn của hàm số y = 1 .
1 − e 1− x
x2
. 2.28. Tính điểm cực trị của hàm f ( x ) = x sin x + cos x − ,
4
x ∈ [−1, 1] và giải thích đặc trưng của nó.
x 2 ( x − 1)
. 2.29. Triển khai khảo sát hàm số y = .
x+1
1 1 + an + a3n−1
. 2.30. Cho a0 = 0, a1 = và an+1 = . Tính lim an và
2 3 n→∞
khảo sát khi a1 thay đổi.
3 + 2am
. 2.31. Cho a1 = 1 và an+1 = . Tìm lim an và cho a1 = a, với
3 + an n→∞
a là một số bất kỳ.

. 2.32. Tính tổng ∑ n(n + 2) x n .
n =1


 
1 1
. 2.33. Chứng minh đẳng thức ∏ 1− = .
n =2 n2 2
66 Chương 2. Maple với giải tích sơ cấp

. 2.34. Cho hàm số f ( x ) = x sin(πx ) + 2 tanh( x − 5). Tính lim f ( x ))


x =∞
và vẽ đồ thị bằng lệnh >plot(f);

0,
 x < 0;
. 2.35. Định nghĩa hàm số f ( x ) = x, 0 ≤ x < 1;

sin x, x ≥ 1.

Tìm f 0 ( x ) và giới hạn của hàm f ( x ) tại x = 5.

. 2.36. Định nghĩa hàm số f ( x ) = x + 2 và g( x ) = x2 − 2x + 1. Tính


f ( x ) ∗ g( x ) và f ( g( x )).

. 2.37. Cho các hàm số h( x ) = x2 + 2x, f (y) = y2 − 1, g( x ) = x +


1, F (y) = y2 + 4y + 3, G ( x ) = x − 1. Chứng minh rằng h = f ( g( x )) =
F ( G ( x )).

3
 x ≤ −1,
8
. 2.38. Cho hàm số f ( x ) = x + 1 −1 < x ≤ 10,

 2
x x > 10.
Tính x2 + f ( x ), x3 f ( x ).

. 2.39. Cho hai hàm số 


  x+1 x ≤ 0,
 x x ≤ 2,


  x2 + 2

0 < x ≤ 3,
f ( x ) = x2 2 < x ≤ 4, và g( x ) =

 3  x3 + 3 3 < x ≤ 5,
x 4 < x.


 x4

x > 5.
Tính h( x ) = g( x ) − f ( x ), k ( x ) = g( x ) + f ( x ).
CHƯƠNG 3
MAPLE VỚI ĐẠI SỐ SƠ CẤP

3.1. Rút gọn biểu thức bằng simplify . . . . . . . . . . . . . . . . . . . . . . . . . . 68


3.2. Khai triển một tích ra thừa số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.3. Kết hợp các số hạng đa thức bằng combine . . . . . . . . . . . . 70
3.4. Giản ước các phân thức bằng normal. . . . . . . . . . . . . . . . . . . 73
3.5. Tổ chức đa thức bằng collect . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6. Sắp xếp các số hạng bằng sort . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.7. Phân tích đa thức ra thừa số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.8. Chuyển đổi giữa các dạng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.9. Tìm hệ số của đa thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.10. Bài tập có hướng dẫn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.11. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Trong đại số sơ cấp một phần quan trọng là các phép toán thực
hiện trên các đa thức. Những đa thức dạng khác nhau như lượng
giác, số mũ hoặc các đa thức có nhiều đối số,.v.v...Như ta đã biết ở
chương trước hàm simplify rút gọn biểu thức, nhưng không phải lúc
nào cũng rút gọn được. Maple có một số hàm có thể thực hiện biến
đổi biểu thức về dạng mà ta mong muốn. Trong phần này chúng
ta nghiên cứu các kiểu biến đổi cụ thể biểu thức về dạng tối giản.
Bảng 3.1 bao gồm các câu lệnh trong phần này.

Bảng 3.1. Các lệnh cơ bản trong đại số sơ cấp


Tên hàm Chức năng
simplify Giản ước biểu thức đại số
expand Chuyển đổi tích ra tổng thừa số. áp dụng công
thức nhân góc hàm lượng giác, nguyên tắc cộng
đối số hàm số mũ,....
combine Gom các hệ số của biểu thức.
normal Biến đổi đa thức phân số về dạng tối giản.
collect Sắp xếp biểu thức theo biến số chính hoặc các
biến qui định.
68 Chương 3. Maple với đại số sơ cấp

sort Sắp xếp các số hạng theo thứ tự tăng hoặc giảm
của bậc đa thức. Có thể thiết lập các tuỳ chọn
đặc biệt để sắp xếp theo thứ tự từ điển, theo bậc
hoặc việc chấp thuận một vài tiêu chuẩn khác.
convert Chuyển đổi những hàm lượng giác, hàm số mũ,
hàm nhị thức Newton hoặc những hàm khác. Có
thể biến đổi biểu thức thành các phần phân số,
căn thức RootOf, phân số liên tục và nhiều mẫu
khác.
factor Phân tích đa thức thành các thừa số.

3.1. Rút gọn biểu thức bằng simplify


I. Rút gọn biểu thức

>simplify(<Biểu thức>);

II. Sử dụng loại qui tắc rút gọn

>simplify(<Biểu Thức>,<Qui tắc>);


Maple không tự động rút gọn đa thức về dạng đơn giản nhất. Ví
dụ như không đưa về phân thức tối giản, không bỏ thừa số chung
lớn nhất trong phân thức,... Điều đó gây ra lãng phí về tính toán và
đưa ra kết quả không gọn gàng. simplify là câu lệnh dùng để rút
gọn các biểu thức. Ví dụ nó được dùng để rút gọn các phân thức, như
cho giá trị 0 đối với biểu thức x2 − y2 − ( x + y)( x − y).
Khi ta cho tham số <Qui tắc> các giá trị trong bảng 3.2 để
thực hiện các kiểu rút gọn chuẩn, ta có kết quả 1 đối với biểu thức
cos( x )2 + sin( x )2 hoặc 2log x đối với biểu thức log x2 .

Bảng 3.2. Các giá trị tham số <Qui tắc> của simplify

<Qui tắc> Rút gọn theo Trong Maple


atsign Những toán tử >sin@arcsin -> x;
hàm x
GAMMA Hàm Γ >GAMMA(n+1)/GAMMA(n);
n
3.1. Rút gọn biểu thức bằng simplify 69

hypergeom Hàm >hypergeom([1], [1], z);


Hypergeometric exp(z)
power Hàm luỹ thừa, >(a^b)^c;
c
hàm mũ, ab
hàm logarit. >exp(5*ln(x)+1);
x5 exp(1)
>ln(x*y);
ln( x ) + ln(y)
radical Biểu thức >(x^2 - 4*x + 4)^(1/4);
chứa căn. ( x − 2)(1/2)
RootOf Biểu thức chứa >Rootf(x^2-2=0,x);
hàm RootOf Root f ( x2 − 2 = 0, x )
>1/ Rootf(x^2-2=0,x);
1
Root f ( x2 − 2 = 0, x )
2
sqrt Căn bậc hai >16^(3/2);
hoặc lũy thừa 64
căn bậc hai >(10*x^2+60*x+90)^(1/2);
10(1/2) ( x + 3)
trig Lũy thừa các hàm >1+tan(x)^2;
lượng giác 1/ cos( x )2
>cos(x)^2 + sin(x)^2;
1

Ví dụ 3.1. Những ví dụ về simplify.


A. Không tự động rút gọn biểu thức.
>expr:= 2*(cos(2*y))^2 + 3*(sin(2*y))^2
+ exp(x)^(5/2)*(1+2*x+x^2)^(1/2)+ 2^(5/2);
expr := 2(cos(2y))2 + 3(sin(2y))2
+ exp( x )5/2 (1 + 2x + x2 )1/2 + 4.21/2

B. Lệnh simplify các phép biến đổi đã biết để rút gọn biểu thức.
>simplify(expr);
− cos(2y)2 + 3 + exp(5/2x ) + exp(5/2x ) x + 4.21/2
70 Chương 3. Maple với đại số sơ cấp

>simplify(exp(a+ln(b*exp(c))));
be a+b
>simplify(4^(1/2)+3);
5
Ví dụ 3.2. Tùy chọn của simplify xác định kiểu rút gọn.
>simplify(expr, power);
2 cos(2y)2 + 3 + 3 sin(2y)2 + exp(5/2x )(1 + 2x + x2 ) + 4.21/2
>simplify(expr, trig);
− cos(2y)2 + 3 + exp( x )5/2 + exp( x )5/2 x + 4.21/2

3.2. Khai triển một tích ra thừa số


expand khai triển tích đa thức thành một đa thức. Ví dụ như
expand với biểu thức ( x − y)( x + y) khai triển ra x2 − yx − xy − y2
và tự động rút gọn thành x2 + y2 .
expand sử dụng công thức các hàm lượng giác về tổng các góc,
quy tắc tổng đối số cho tích các hàm mũ và nó mở rộng các quy tắc
đó cho những hàm khác.
Ví dụ 3.3. Khai triển một tích thành các phép cộng và công thức các
hàm cos hoặc exp.
A. Khai triển tổng các tích thành tổng rút gọn.
>expr1:= (x+y+z)^2 - (x+y)^2;
expr1 := ( x + y + z)2 − ( x + y)2
>expand(expr1);
2xz + 2yz + z2
B. expand dùng công thức nhân các góc cho các hàm lượng giác và
tổng số mũ cho các hàm mũ.
>expr2:=cos(a+b)->exp(a+b)+(n+1)!^2/(n!^2);
((n + 1)!)2
expr2 := cos( a + b) − exp( a + b) +
(n!)2
>expand(expr2);
cos( a) cos(b) − sin( a) sin(b) − exp( a) exp(b) + (n + 1)2

3.3. Kết hợp các số hạng đa thức bằng combine


combine thực hiện thu gọn các hàm lượng giác, hàm mũ và hàm
logarit. Bảng 3.3 miêu tả các giá trị cho phép biển đổi này.
3.3. Kết hợp các số hạng đa thức bằng combine 71

Bảng 3.3. Cách thu gọn biểu thức bằng combine

Tên hàm Chức năng


combine Khử bỏ những phép nhân, luỹ thừa của
(<Biểuthức>,trig) cos, sin, cosh và sinh trong <Biểuthức>sử
dụng quy tắc phép tính của góc lượng giác
như:    
sin( a) cos(b) = sin a+2 b + sin a−2 b
   
sinh( a) sinh(b) = cosh a+2 b − cosh a−2 b
combine Rút gọn các phép nhân và luỹ thừa của những
(<Biểuthức>,exp) hàm mũ trong <Biểu thức> sử dụng quy tắc:
a
e x ey = e x+y , e(x ) = e xa , e x+n ln(y) = e x yn
combine Rút gọn các phép cộng logarit và phép nhân
(<Biểuthức>,ln) của những hàm logarit trong <Biểuthức> sử
dụng quy tắc:
a ln( x ) = ln( x a ), ln( x ) + ln(y) = ln( xy)
combine Rút gọn <Biểuthức> chứa đựng các phép nhân
(<Biểuthức>,power) luỹ thừa (báo gồm các hàm mũ) sử dụng quy
tắc sau:
x y x z = x y+z ( x y )z = x yz
x y
e e =e x + y (ey )z = eyz
Với mọi x, y, z và số nguyên a > 1.
combine Rút gọn <Biểuthức> thành tổng của các hàm
(<Biểuthức>,Psi) ψ(n) (.) sử dụng:
ψ(n) (z + 1) = ψ(n) (z) + (−1)n n!z−n−1
dn
ψ(n) (1 − z) = (−1)n (ψ(n) (z) + n cot πz)
dz
với các số n nguyên dương.

combine Rút gọn <Biểuthức> thành một biểu thức đưa


(<Biểuthức>) vào trong các toán tử Int, Sum và Limit
c1 lim f ( x ) + c2 lim g( x ) = lim (c1 f ( x ) + c2 g( x ))
Rx→b a x→a
Rb x→a
Rb
c1 a f ( x )dx + c2 a g( x )dx = a (c1 f ( x ) + c2 g( x ))
với giá trị tuỳ ý của x, c1 và c2 là những biểu
thức độc lập với x, f ( x ) và g( x ) là những biểu
thức tuỳ ý của x.
72 Chương 3. Maple với đại số sơ cấp

Ví dụ 3.4. Rút gọn biểu thức bằng combine.


A. Chuyển biểu thức e1 thành cos x.

>e1:= 2*cos(x/2)^2 - 1;
e1 := 2 cos( x/2)2 − 1
>combine(e1, trig);
cos( x )

B. Khử lũy thừa của sin và cos bằng cos2 x + sin2 x = 1, ...

>e2:= cos(x)^2 + 2sin(x)^2 + tan(x)^2;


e2 := cos( x )2 + 2 sin( x )2 + tan( x )2
>combine(e2, trig);
−1/2 cos(2x ) + 3/2 + tan( x )2

C. combine(.., exp) nhóm các phép nhân luỹ thừa trong biểu thức.

>e3:= (exp(x))^2*exp(y) + 2*ln(x) - ln(y) + (x^a)^2;


e3 := (exp( x ))2 exp(y) + 2 ln( x ) − ln(y) + ( xa)2
>combine(e3, exp);
exp(2x + y) + 2 ln( x ) − ln(y) + ( xa)2

D. combine(.., ln) kết hợp lại các phép cộng logarit trong biểu
thức.
>combine(e3, ln);
exp( x )2 exp(y) + ( xa)2 + ln(y)

E.combine(.., power) kết hợp lại các phép tính luỹ thừa của luỹ
thừa và các phép nhân luỹ thừa trong biểu thức.

>combine(e3, power);
exp(2x + y) + 2 ln( x ) − ln(y) + x (2a)
>combine((x^a)^2,power);
x (2a)
F. combine thực hiện cùng với một danh sách hoặc một tập hợp các
tham số. Ở đây chúng ta đơn giản một danh sách gồm hai biểu thức
cùng việc sử dụng một vài kiểu chuyển đổi đồng thời.

>combine([e1, e3], {exp, ln, trig});


[cos( x ), exp(2x + y) + x (2a) + ln()]
>combine(exp(sin(a)*cos(b))*exp(cos(a)*sin(b)),[trig,exp]);
esin(a+b)
3.4. Giản ước các phân thức bằng normal 73

3.4. Giản ước các phân thức bằng normal


Có thể biểu thức phải khai triển lại đơn giản hơn kết quả khai
triển, ví dụ như ( x + 1)100 . Sử dụng câu lệnh expand cho biểu thức
trên sinh ra 101 số hạng. Không chỉ là một kết quả mở rộng khó bao
hàm hết mà nó còn sử dụng quá nhiều không gian nhớ của máy tính
so với biểu thức ban đầu. Hàm normal được thiết kế thực hiện khai
triển thích hợp nhất. Nó thực hiện việc tối giản hoá biểu thức trong
khi cố gắng tránh việc khai triển mở rộng biểu thức không cần thiết.
Mẫu chung của biểu thức ’chuẩn hóa’ kết hợp tất cả vào trong
phân thức hoặc một phân thức nhân với hằng số. Đối với các biểu
thức là phân thức thì biểu thức chuẩn hóa là một phân thức tối giản.
Ví dụ 3.5. normal cung cấp một kiểu giản ước cho các hàm phân
số, số phân số,....
A. normal có thể được sử dụng để đơn giản các biểu thức phân số về
dạng tối giản.
>(2*x + 4*y)**(x^2 - y^2) / (x + y)^2;
(2x + 4y)( x2 − y2 )
( x + y )2
>normal(%);
( x + 2y)(y − x )
−2
x+y
>normal((x^2 - y^2) - (x + y)*(x - y));
0
B. Không phải lúc nào normal cũng tạo ra một kết quả ngắn gọn.
>2*x/(x+y)^3+x/ x+y)^2+y/ (x+y)+y / (x+y)^0;
x x y
2 3
+ 2
+ +y
( x + y) ( x + y) x+y
>normal(%);
( x + x2 + xy + yx2 + 2xy2 + y3 + yx3 + 3y2 x2 + 3xy3 + y4 )/( x + y)3

3.5. Tổ chức đa thức bằng collect


I. Thiết lập <Biểu thức> theo <biến >

>collect(<Biểu thức>, <Biến>);


II. Thiết lập <Biểu thức1> theo (<Biểu thức2>

>collect(<Biểu thức1>,(<Biểu thức2>);


74 Chương 3. Maple với đại số sơ cấp

III. Thiết lập <Biểu thức> và đơn giản các hệ số

>collect(<Biểu thức>, <Danh sách >, <kiểu mẫu>, <hệ số>);

Câu lệnh collect được sử dụng khi ta xếp đặt một biểu thức theo
một biến hoặc những biến dưới dạng tổng của các số hạng, mà mỗi số
hạng là lũy thừa của biến chính hoặc biểu thức nhân với hệ số liên
kết. Có hai khả năng cho <kiểu mẫu> là recursive (hồi qui) hoặc
distributed (khai triển).
1. Dạng hồi qui (recursive), kết quả tính toán có cấu trúc phân
cấp, biểu thức được chuyển thành dạng được bắt đầu bằng một đa
thức với biến đầu tiên trong <Danh sách biến> mà các hệ số của nó
là những đa thức với biến thứ hai trong <Danh sách biến> và biến
thứ hai cũng xếp như vậy đối với biến thứ ba, cứ tiếp tục như thế cho
đến biến cuối cùng trong <Danh sách biến>.
2. Dạng Khai triển (distributed), kết quả tính toán được viết
giống như một đa thức mở rộng - tổng của các số hạng, mỗi một số
hạng là tích luỹ thừa của những biến trong <Danh sách biến> và
hệ số (không phụ thuộc các biến trong <Danh sách biến>). Mẫu này
hữu ích khi ta muốn xử lý một vài biến dưới dạng chính hoặc không
đưa ra quyền ưu tiên cho bất kỳ biến nào trong đó.
Tham số tuỳ chọn <hệ số giản ước> của collect sẽ xác định tên
của thủ tục đơn giản hoá áp dụng cho các hệ số của mỗi số hạng
trong biểu thức.

Ví dụ 3.6. Kết hợp các số hạng bằng collect.


A. Kết hợp các thừa số của expr theo biến đầu tiên x tiếp tới y và z.
>expr:=r^2*x^2-2*x^2*r+x^2+ 8*z*y*r^2 -2*z*y*r*s
-6*z*y*s^2+t^2*z^2+3*r^2*s*y*t*x- r*x*s*y+ s^2*y^2
+r*s*y^2+ r^3*z*x -r*z*x*t^2;

expr := r2 x2 − 2x2 r + x2 + 8zyr2 − 2zyrs − 6zys2 + t2 z2 + 3r2 sytx −


rxsy + s2 y2 + rsy2 + r2 zx − rzxt2

B. Sử dụng distributed để dễ dàng thấy được hệ số của xz


>collect(expr, [x, y, z], distributed);
(−2r + 1 + r2 ) x2 + (s2 + rs)y2 + t2 z2 + (−2rs − 6s2 + 8r2 )zy + (−rs +
3r2 st) xy + (−rt2 + r3 ) xz
3.6. Sắp xếp các số hạng bằng sort 75

C. Bằng việc xác định hai tuỳ chọn distributed, factor thì các hệ số
sẽ được hiện ra dưới dạng
>collect(expr, [x, y, z], distributed, factor);
(r − 1)2 x2 + s(s + r )y2 + t2 z2 + 2(4r + 3s)(r − s)yz + rs(−1 + 3rt) xy +
r (r − t)(r + t) xz

3.6. Sắp xếp các số hạng bằng sort


I. Sắp xếp <Biểu thức> theo chữ cái và số hạng theo lũy thừa.

>sort(<Biểu thức>);

II. Sắp xếp <Biểu thức> theo thứ tự từ điển.

>sort(<Biểu thức>,<Danh sách biến>, plex);

III. Sắp xếp <Biểu thức> theo tổng số mũ.

>sort(<Biểu thức>,<Danh sách biến>, tdeg);

IV. Sắp xếp danh sách các biểu thức theo thứ tự tăng dần.

>sort(<danh sách>);

V. Sắp xếp danh sách theo thứ tự đã cho.

>sort(l<danh sách>, ordering);

Maple tự sắp xếp các hệ số theo thứ tự thích hợp. Nếu biểu thức
ban đầu như x + y + z thì Maple tiếp tục đặt như vậy. Tuy nhiên,
việc sắp xếp của Maple nhiều khi không cho hiệu quả và ý đồ của
ta. Ví dụ như Maple không sắp xếp tất cả các số hạng của đa thức
theo một biến đơn. Nếu muốn như vậy, câu lệnh sort(<Biểu thức>)
sắp xếp các số hạng theo thứ tự giảm dần của lũy thừa. Maple tiếp
tục sử dụng kiểu sắp xếp lại này cho các biểu thức đưa vào sau.
sort(<Biểu thức>) thiết lập tổng hoặc là tích của các biến theo thứ
tự từ điển.
Với các biểu thức bao gồm một vài biến luỹ thừa (hoặc một vài
loại biểu thức con) sort đòi hỏi ba tham số. Khi ta biểu diễn biểu
thức theo một biến chính và muốn sắp xếp các số hạng của biểu thức
đó với quyền yêu tiên cho những biến mà có số mũ cao nhất của biến
chính, câu lệnh sort(<Biểu thức>,<Danh sách biến>, plex) sẽ sắp
76 Chương 3. Maple với đại số sơ cấp

xếp các hệ số của biểu thức theo cách thức đó. <Danh sách biến> nên
là danh sách của các biến cùng với biến chính đầu tiên. Để ngắt và
sắp xếp số hạng có cùng mũ của biến chính hãy sử dụng mũ của biến
tiếp theo trong <Danh sách biến>. Nêú số hạng này vẫn chưa xếp
được thì lại sử dụng biến kế tiếp theo trong <Danh sách biến> và cứ
tiếp tục như vậy cho tới khi sắp xếp đến phần tử cuối cùng trong số
hạng. Điều này được coi là trình tự sắp xếp theo kiểu từ vựng vì nó
tương tự như quy tắc sắp xếp các từ theo thứ tự từ điển.
Một cách khác để tổ chức các số hạng của biểu thức được dựa
trên ’ tổng số mũ’ (ví dụ như tổng số mũ của x5 y7 z4 là 5 + 7 + 4 =
16). Các số hạng của biểu thức được sắp xếp theo thứ tự ’ tổng
số mũ ’. sort(<Biểu thức>,<Danh sách biến>, tdeg) sẽ sắp xếp
<biểu thức> theo thứ tự ’ tổng số mũ’. Trong thứ tự đó với hai số
hạng có cùng một ’tổng số mũ’ sử dụng kiểu sắp xếp từ vựng cho
biến bên trong <Danh sách biến>.
Nếu một <danh sách> được truyền cho sort, mà các thành phần
của <danh sách> đó đã được sắp xếp theo thứ tự tăng dần, thì việc
xác định một đối số tuỳ chọn cho sort có thể xác định kiểu sắp xếp
cho danh sách này. Nó có thể là một từ khoá xác định một kiểu định
trước để Maple sử dụng hoặc nó có thể là một hàm so sánh do người
sử dụng định nghĩa (xem ví dụ).

Ví dụ 3.7. Sắp xếp các số hạng bằng sort.


A. Việc sắp xếp được thiết lập ngay trong một lần thực hiện của
Maple. Nó được sử dụng một cách phù hợp tại bất cứ chỗ nào trong
biểu thức hoặc khi xuất hiện một biểu thức con(ở đây là y + z + x).

>a:= x^3 + y + sin(x+y+z)


+factor(x^2+2*x*y+2*x*z+y^2+2*y*z + z^2) + z;
a := x3 + y + sin(y + z + x ) + (y + z + x )2 + z
>b:= y+z+x;
b := y + z + x

B. Mặc định sắp xếp cho các đa thức là các số hạng không nhất thiết
được sắp theo thứ tự tăng hoặc giảm số mũ.

>c:= expand((x^2 + x + 1)^5);


c := 1 + 5x + 30x3 + 15x2 + 45x4 + 45x6 + 51x5 + 15x8 + 30x7 + x10 +
5x9
3.6. Sắp xếp các số hạng bằng sort 77

C. sort sắp xếp đa thức theo thứ tự giảm dần lũy thừa.

>sort(c);
x10 + 5x9 + 15x8 + 30x7 + 45x6 + 51x5 + 45x4 + 30x3 + 15x2 + 5x + 1

D. sort sắp xếp một danh sách theo thứ tự từ điển.

>sort([z, u, w, s, u, v, w, y, t]);
[s, t, u, u, v, w, w, y, z]

E. Sắp xếp các đối tượng khác nhau theo từng máy tính cụ thể.

>sort(t*s*u);
tus
>sort(s+t+u);
t+u+s

F. Quy định trên được áp dụng cho việc sắp xếp các biểu thức tại
những bước tiếp theo trong phiên làm việc này.

>sin(t+s+u);
sin(t + u + s)

G. Biểu thức được sắp xếp theo biến chính x và biến tiếp sau theo
thứ tự từ điển đối với biến.

>e:= 1+x^4*y*z+y^5*z^2*x+ >x*y^2*z^3;


e := 1 + x4 yz + y5 z2 x + xy2 z3
>sort(e, [x, y, z], plex);
x4 yz + xy5 z2 + xy2 z3 + 1

H. Sắp xếp theo thứ tự tổng số mũ của các số hạng và theo thứ tự từ
điển đối với biến.

>sort(e, [x, y, z], tdeg);


xy5 z2 + x4 yz + + xy2 z3 + 1

I. Ngay trong các biểu thức con các số hạng cũng được sắp xếp

>expand(cos(x+y) - sin(x+y)2);
cos( x ) cos(y) − sin( x ) sin(y) − sin( x )2 cos(y)2
−2 sin( x ) cos(y) cos( x ) sin(y) − cos( x )2 sin(y)2
78 Chương 3. Maple với đại số sơ cấp

>sort(", [cos(x), sin(x), cos(y), sin(y)], tdeg);


− cos( x sin(y)2 − 2 sin( x ) cos(y) cos( x ) sin(y) − sin( x )2 cos(y)2
+ cos( x ) cos(y) − sin( x ) sin(y)
>sort(", [cos(x), sin(x), cos(y), sin(y)], plex);
− cos( x )2 sin(y)2 − 2 sin( x ) cos(y) cos( x ) sin(y) + cos( x ) cos(y)
− sin( x )2 cos(y)2 − sin( x ) sin(y)

3.7. Phân tích đa thức ra thừa số


I. Phân tích đa thức trên những số hữu tỷ.

>factor(<Đa thức>);
II. Phân tích đa thức trên trường mở rộng đại số.

>factor(<Đa thức>, <Trường đại số>);


factor(<Đa thức>) sẽ thực hiện việc phân tích triệt để các đa
thức ra thừa số trong một hoặc nhiều biến với hệ số hữu tỷ. Mẫu thứ
hai của câu lệnh phân tích đa thức ra thừa số với miền xác định hệ
số khác số hữu tỷ. Trong khi các thuật toán hiện đại đã cho phép
có được một thuật toán phân tích ra thừa số tương đối có hiệu quả,
nhưng thực hiện quá trình phân tích ra thừa số quá chậm và tốn bộ
nhớ do vậy ta chỉ nên sử dụng khi thực sự cần thiết.

Ví dụ 3.8. Phân tích đa thức ra thừa số bằng factor.


A. Ví dụ về phân tích đa thức thành thừa số tối giản.
>p:= x^3 + 3*x^2 + 3*x + 1;
p := x3 + 3x2 + 3x + 1
>diff(p, x);
3x2 + 6x + 3
>factor(%);
3( x + 1)2
B. Một cách ngược với thứ tự các bước ở trên cho cùng kết quả.
>factor(p);
( x + 1)3
>diff(%, x)
3( x + 1)2
C. Phân tích ra thừa số trên tập hữu tỷ, chứ không phải trên số phức,
nên thừa số là đa thức hữu tỷ.
3.8. Chuyển đổi giữa các dạng 79

>q:= x^2 + 9/4;


q := x2 + 9/4
>factor(q);
x2 + 9/4
D. Ví dụ về phân tích ra thừa số đa thức nhiều biến.
>x^4*sin(y)^4+ x^4*sin(y)^3 + x^2;
x4 sin(y)4 + x4 sin(y)3 + x2
>factor(%);
x2 (sin(y) + 1)( x2 sin(y)3 + 1)
E. Sử dụng mẫu thứ 2 của câu lệnh factor, chúng ta định ra miền
xác định hệ số: những số phức bao gồm phần thực và phần ảo. Đẳng
thức trên phân tích được.
>factor(q, I);
( x + 3/2I )( x − 3/2I )
F. Thực hiện phân tích một đa thức với miền hệ số là một số hữu tỷ
nhân với căn bậc hai của 2. Chúng ta sử dụng câu lệnh alias để gán
cho RootOf(x^2+2) một bí danh.
>alias(alpha = RootOf(z^2 + 2));
I, al pha
>factor(x^2 + 1/8, alpha);
( x − 1/4al pha)( x + 1/4al pha)

3.8. Chuyển đổi giữa các dạng


Chuyển đổi thành dạng hàm khác.
convert(<Biểu thức>,<Dạng tùy chọn>);
Hàm convert sử dụng để rút gọn những dạng biểu thức lượng
giác gồm các hàm như sin, cosh, arctan...Nó được sử dụng để
chuyển đổi một hàm nhị thức Newton thành những giai thừa,...
Bảng 3.4 mô tả các tuỳ chọn khác nhau được sử dụng để chuyển
đổi. Hàm convert có các tùy chọn để chuyển các biểu thức thành
dạng phân số liên tục, phân số riêng từng phần và dạng cơ số tám.
Nó chuyển đổi RootOf thành căn và ngược lại.
Hàm convert còn sử dụng cho sự chuyển đổi một cấu trúc dữ
liệu. Điều này được trình bày trong chương sau.
80 Chương 3. Maple với đại số sơ cấp

Bảng 3.4. Các tùy chọn chuyển đổi của hàm convert
<Tuỳ chọn> Thực hiện chuyển đổi
exp Các hàm lượng giác ra các dạng tương đương
những hàm mũ
ln Những hàm lượng giác ngược thành những dạng
tương ứng hàm logarit.
expln Kết hợp hai tuỳ chọn exp và ln
expsincos Tất cả hàm lượng giác ra dạng gồm những hàm
sin, cos và những hàm lượng giác hyperbolic
chuyển thành dạng hàm số mũ.
sincos Các hàm lượng giác ra dạng gồm những hàm sin,
cos, sinh và cosh
tan Các hàm lượng giác ra dạng gồm những hàm tan

trig Các hàm mũ ra dạng gồm những hàm sin, cos,


sinh và cosh theo công thức Euler.
factorial GAMMA,nhị thức Newton và các hệ số của đa
thức thành những giai thừa.
GAMMA Các Giai thừa, hệ số nhị thức và những hệ số đa
thức thành dạng để sử dụng cho hàm.
hypergeom Chuyển đổi những biểu thức có chứa sum thành
dạng có chứa các hàm hypergeometric (hyper-
geom).

Ví dụ 3.9. Chuyển đổi một dạng hàm thành dạng khác.


A. Đơn giản một hàm lượng giác. Phần lớn simplify không thực hiện
được công việc này.
>expr:=cos(a)^2*cos(b)^2-2*cos(a)* cos(b)* sin(a)*sin(b)
+ (a)^2*sin(b)^2;
expr := cos( a)2 cos(b)2 − cos( a) cos(b) sin( a) sin(b) + sin( a)2 sin(b)2
>simplify(expr);
2 cos( a)2 cos(b)2 − 2 cos( a) cos(b) sin( a) sin(b) + 1 − cos(b)2 cos( a)2
B. Thực hiện rút gọn bằng các cách khác nhau: combine, convert,
simplify.
>combine(expr, trig);
1/2cos(2a + 2b) + 1/2
3.9. Tìm hệ số của đa thức 81

>convert(%, tan);
1 − tan( a + b)2
+ 1/2
1 + tan( a + b)2
>simplify(%);
cos( a + b)2

C. Một ví dụ khác: đơn giản hoá công thức truy hồi bằng rsolve.
>rsolve({T(n) = T((n-1))/3
  + n,T(0)=1}, T(n));
7 1 n 3 3
− + n
4 3 4 2
D. Hàm simplify không tạo ra được một biểu thức đơn giản hơn.
>simplify(%);
7 −n 3 3
3 − + n
4 4 2
E. Nhưng chúng ta có thể thực hiện việc đơn giản hoá bằng phép
chuyển đổi những phép luỹ thừa thành các hàm số mũ.
>convert(%, exp);
7 −n ln(3) 3 3
e − + n
4 4 2
F. Chuyển đổi hàm số theo hàm hypergeom.
>h := BesselJ(a,z);
h := BesselJ( a, z)
>j:=convert(h,hypergeom);
z a hypergeom([] [1 + a] − 14 z2 )
Γ (1 + a ) 2 a

3.9. Tìm hệ số của đa thức


Những phần trước là các lệnh khai triển hoặc sắp xếp một đa
thức, để lấy được hệ số trước các biến trong đa thức Maple cung
cấp hàm coeff. Hàm coeff(p,x,n) là hệ số của x n trong đa thức
p. lcoeff(p,x) là hệ số đầu tiên trong đa thức p theo biến x.
lcoeff(p,[x,y]) là hệ số đầu tiên của đa thức theo biến x và y,
mà ở đây x xem như là biến chính. Nếu p không phải là đa thức theo
biến đã cho thì Maple sẽ báo lỗi. Hàm tcoeff hoạt động tương tự như
lcoeff nhưng lấy hệ số cuối cùng của đa thức.
82 Chương 3. Maple với đại số sơ cấp

Ví dụ 3.10. Tìm hệ số đa thức bằng coeff, lcoeff. tcoeff.


A. Hệ số của x4 trong p là đa thức theo y và z. cos y không có trong p,
nên hệ số của nố bằng 0. Nếu tìm hệ số của (cos y) 0 trong p là chính
biểu thức p.
>p:=3*x^4*y^4+2*x^4*y^3+2*x^3*y^3*z-y^2*z^5+x*y^5;
p := 3x4 y4 + 2x4 y3 + 2x3 y3 z − y2 z5 + xy5
>coeff(p,x,4);
3y4 + 2y3
>coeff(p,cos(y),1);
0
>coeff(p,cos(y),0);
p := 3x4 y4 + 2x4 y3 + 2x3 y3 z − y2 z5 + xy5
>coeff(p,z,0);
3x4 y4 + 2x4 y3 + xy5
B. Hệ số đầu tiên của p coi như đa thức theo x.
>lcoeff(p,x);
3y4 + 2y3
C. Tìm hệ số đầu tiên của đa thức theo hai biến x và y.
>lcoeff(p,[x,y]);
3
D. Nếu coi y là biến chính cho kết quả khác
>lcoeff(p,[y,x]);
3

3.10. Bài tập có hướng dẫn


. 3.1. Đơn giản biểu thức sau ( a + b + c)( a2 + b2 + c2 − ab − bc − ca).
. 3.2. Phân tích ra thừa số x10 − x8 − 2x7 − x6 − x4 + x2 + 2x + 1.
π
. 3.3. Tìm giá trị của cos .
30
. 3.4. Tính tổng 1 + 2 + ... + n2 .
2 2

. 3.5. Tìm tích ∏ (2k − 1).


1≤k ≤50

. 3.6. Dùng Maple để kiểm tra


(a) ( x + y)5 − x5 − y5 = 5xy( x + y)( x2 + xy + y2 );
(b) ( x + a)7 − x7 − a7 = 7xa( x + a)( x2 + xa + a2 )2 .
3.11. Bài tập tự giải 83

. 3.7. Kiểm tra đẳng thức sau bằng Maple

( a2 + b2 )(c2 + d2 ) = ( ac + bd)2 + ( ad − bc)2 .

. 3.8. Tìm nghiệm của hệ phương trình


(
x 2 − y2 = 1
x2 + xy = 2.

. 3.9. Giải số phương trình x2 = cos( x ).

. 3.10. Tìm hàm số f ( x ), thỏa mãn phương trình f 2 ( x ) − 2 f ( x ) = x.

. 3.11. Tìm tất cả nghiệm của phương trình 5 sin x + 12 cos x = 13.

. 3.12. Giải bất phương trình 13x3 − 25x2 − x4 − 129x + 270 > 0.

. 3.13. Giải bất phương trình e2x+3 < 1.

. 3.14. Giải bất đẳng thức đại số sau



3x + 1 1 5
a)
< 3; b) + < 1.
x−3 2−x 2+x

. 3.15. Hãy tính nghiệm nguyên của bất đẳng thức

 x − 1 − 2x + 3 + x < 2 − x + 5


2 3 6 2
x+5 4−x x+1
1 −
 + < 3x −
8 2 4

3.11. Bài tập tự giải


5
. 3.16. Cho số phức z = 2eiπ/6 . Tìm phần thực, phần ảo, dạng đại
số, modul và hệ số góc.

arctan( x + y) 2
 
. 3.17. Tính giá trị của hàm f ( x, y) =
√ √arctan( x − y)
1+ 3 1− 3
tại x = 1, y = 0 và x = ,y = .
2 2
x 3 y2 − x 2 y3
. 3.18. Viết dạng toán tử của hàm số f ( x, y) = và tính
( xy)5
1
giá trị của nó tại x = a, y = 1 bằng lệnh subs.
84 Chương 3. Maple với đại số sơ cấp

. 3.19. Tìm tất cả các nghiệm của của hệ phương trình


(
x2 − 5xy + 6y2 = 0
x 2 + y2 = 10.

. 3.20. Tính tất cả các nghiệm lượng giác của phương trình sau
sin4 x − cos4 x = 21 .

. 3.21. Tìm nghiệm gần đúng của phương trình e x = 2(1 − x )2 .


. 3.22. Giải bất đẳng thức 2 ln2 x − ln x < 1.
. 3.23. Tìm nghiệm phương trình x x+7 − 8 = 0 và kiểm tra lại
nghiệm.

. 3.24. Giải các phương trình sau:


2 −4x
a) 3x = 32x−8 ; b) 5x+1.5 = 72x ;
√ √
c) 2sin x = 2cos x ; d) x + 2 − 2x − 10 = 1.

. 3.25. Tìm tất cả nghiệm của phương trình cos( x ) + tan 2x = 1 dùng
môi trường _EnvAllSolutions := true.

. 3.26. Giải hệ phương trình


(
x2 − y + a = 0,
2
−x + y + a = 0
1
thay a = vào nghiệm đã tìm được.
4
. 3.27. Giải hệ phương trình
( (
x2 + xy − 3y = 9 u + 2v = 4
a) b)
3x + 2y = −1. u2 + uv − v = −5.

. 3.28. Tìm nghiệm chính xác và nghiệm gần đúng của đa thức sau
x5 − 2x4 − 8x3 − x2 + 2x + 8.

. 3.29. Cho biểu thức hai biến p = 3y2 x2 + x3 + x + 9 + 2x5 −


5 sin(y)2 x4 . Thực hiện sắp xếp các số hạng theo thứ tự khác nhau
x; [ x, y]; { x, y, sin(y)}.

. 3.30. Lập dãy các hệ số và dãy các lũy thừ của x của đa thức
g = ( x3 + 2x + 1)( x2 + 1).
CHƯƠNG 4
MAPLE VỚI ĐẠI SỐ TUYẾN TÍNH

4.1. Bảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.2. Mảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.3. Tạo hệ thống chỉ số cho mảng và bảng . . . . . . . . . . . . . . . . . . 91
4.4. Ma trận và vectơ cùng các phép toán . . . . . . . . . . . . . . . . . . . 92
4.5. Gói lệnh đại số tuyến tính trong Maple . . . . . . . . . . . . . . . . . . . 95
4.6. Toán tử tạo cấu trúc ma trận và vectơ . . . . . . . . . . . . . . . . . . 101
4.7. Gọi lệnh của gói lệnh thông qua with . . . . . . . . . . . . . . . . . . . 105
4.8. Gói lệnh đại số tuyến tính mới . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.9. Bài tập luyện tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
4.10. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

Trong các chương trước chúng ta xét các hàm số của Maple thực
hiện trong đại số và giải tích sơ cấp. Những lệnh (hàm) đã xét mặc
định đã có khi ta khởi động Maple. Nhưng để khảo sát toán học
cao cấp người ta thường xây dựng các thư viện những hàm chuyên
dụng. Với đại số tuyến tính xét trong chương này liên quan đến một
gói lệnh linalg, có thể nói đây là đại số tuyến tính của Maple. Nếu
chúng ta cài đặt Maple đầy đủ, thì Maple còn rất nhiều gói thủ tục
(hàm) khác nhằm thực hiện nghiên cứu các chuyên ngành toán học
như sắc xuất thống kê, tối ưu hóa, lý thuyết đồ thị,...
Chương này chỉ là một ví dụ cách sử dụng một gói lệnh thông qua
linalg, các gói lệnh khác sử dụng tương tự cùng với hướng dẫn của
chính các gói lệnh đó.
Để tiếp cận được với đại số tuyến tính ta phải hiểu cấu trúc bảng
và mảng trong Maple. Bảng và mảng là một cấu trúc dữ liệu cho
phép ta truy nhập nhanh và thuận tiện tới bất cứ phần nào của tập
dữ liệu bằng từ khoá hoặc chỉ số. Đó là một trong các cấu trúc mà các
thành phần con cụ thể được thay thế trong vị trí đó. Ngược lại, việc
thay đổi các thành phần của danh sách thông qua lệnh subsop (hàm
thay thế thành phần) sẽ tạo ra một danh sách mới. Trong phần này
ta nghiên cứu cách sử dụng bảng, mảng, danh sách, tập hợp và việc
ứng dụng của nó.
86 Chương 4. Maple với đại số tuyến tính

4.1. Bảng
Maple có hàm table dùng để thu thập các thông tin ở dạng bảng.
Trong ví dụ dưới đây chúng ta tạo ra một bảng mô tả mối liên kết
giữa các bước sóng và màu.

Bảng 4.1. Bảng Wavelength

Màu Độ dài
sóng
red 610
bue 480
violet 450
green 520

Đặc thù của bảng là có một tệp chỉ số mô tả vị trí trong bảng.
Một giá trị cụ thể trong bảng được truy nhập thông qua vị trí của nó
trong bảng có dạng table<Tên bảng>[<chỉ số>], <Tên bảng> là
tên của bảng và <chỉ số> là một tên hoặc một chuỗi biểu thức. <chỉ
số> đôi khi được quy chiếu tới như mô tả một phần của bảng.
Trong Maple, hàm tạo bảng là table. Nếu một danh sách các từ
khóa như là tập <chỉ số> và gán giá trị tại chỉ số đó bằng dấu =, thì
danh sách được sử dụng như chỉ số và các giá trị là giá ban đầu của
bảng. Nếu không có chỉ số nào được khởi tạo khi dùng lệnh table,
thì nó sẽ tạo ra một bảng rỗng.
Bất kỳ một biến nào cũng có thể được gán cho bảng như gán một
giá trị. Một khi biến được gán bảng thì biến đó trở thàng tên bảng.
Để hiển thị nội dung của toàn bảng dùng lệnh print.
Ví dụ 4.1. Tạo lập và sửa đổi các bảng.
A. Gán biến cho Wavelength một đối tượng bảng. Tập chỉ số là tên
các mầu và các phần tử của bảng là các số. Khởi tạo bảng với giá trị
ban đầu.
>Wavelength:=table([red=610,blue=480,
violet=450,green=520, black=0]);
Wavelength := table([blue = 480, violet = 450, red = 610, green =
520, black = 0])
B. Truy nhập tới các thành phần của bảng.
4.1. Bảng 87

>Wavelength[red];
610

C. Thêm một giá trị vào bảng bằng cách gán giá trị với chỉ số mới.

>Wavelength[orange]:= 600;
Wavelength[orange] := 600

D. Sửa đổi một giá trị thành phần của bảng.

>Wavelength[red]:= 640;
Wavelength[red] := 640

E. Huỷ bỏ một thành phần của bảng là gán đúng bằng vị trí bảng.

>Wavelength[black]:= ’Wavelength[black]’;
Wavelength[black] := Wavelength[black]

F. Để hiển thị bảng sử dụng câu lệnh print


>Wavelength;
Wavelength
>print(Wavelength);
table([blue = 480, violet = 450, red = 640, green = 520, orange = 600])

G. Hàm indices sẽ đưa ra dãy các chỉ số được sử dụng trong bảng.
Hàm entries sẽ đưa ra dãy các giá trị của bảng.

>indices(Wavelength);
[blue], [violet], [red], [green], [ogange]
>entries(Wavelength);
[480], [450], [640], [520], [600]

Bảng có thể có các chỉ số không thuần nhất, mà là hỗn hợp: các
số, biến, biểu thức, dãy hoặc bất kỳ đối tượng nào của Maple. Ví dụ
sau minh hoạ điều này.

Ví dụ 4.2. Bảng Memo có tập chỉ số hỗn tạp.

>Memo [Monday]:= ’Nancy’s birthday’:


>Memo [1, 2]:= ’buckle my shoe’:
>Memo [e=mc^2]:= ’Einstein’s formula’:
>Memo [G]:= [’gravitational constant’, 9.8, 32]:
88 Chương 4. Maple với đại số tuyến tính

>print[Memo];
table([
G= [gravitational constant, 9.8, 32]
(1,2) = buckle my shoe
Monday = Nancy’s birthday
(e=mc2) = Einstein’s formula
])

Nếu một biến a được gán cho một giá trị là bảng, thì b:= eval(a)
sẽ gán cho b một bảng giống a. Sự thay đổi sau này của bảng a hoặc b
là độc lập. Nếu a được gán cho một bảng khác thì b vẫn giữa nguyên
giá trị của bảng gấn trước, không thay đổi theo a.

Ví dụ 4.3. Tạo Bảng bằng gán giá trị, tên bảng chứ giá trị.
A. Tạo lập một bảng dùng hàm table như định nghĩa.
>Wavelength:= table([’red’ = 610, ’blue’ = 480,
’violet’ = 450, ’green’ = 520, ’black’ = 0]);

Wavelength:= table([ blue = 480 violet = 450 red = 610


black = 0 green = 520 ]);

B. W12 và W13 là những bảng có cùng giá trị được gán, nhưng khi
thực hiện trực tiếp Maple chỉ đưa ra tên bảng chứ không phải nội
dung.
>W12:=Wavelength:W13:= W12:
>W12;
Wavelength
>W13;
Wavelength
C. Dùng hàm eval(<Tên bảng>) để nhận nội dung bảng.
>eval(W13);
table([blue = 480, violet = 450, red = 610, black = 0, green = 520]);

Tạo lập phiên bản khác nhau của một bảng bằng hàm copy.

Ví dụ 4.4. Sao chép bảng.


A. Tạo lập một bảng một vài số Fibonnaci, số thứ sáu không đúng
>Fibonnaci_table[1]:= 1: Fibonnaci_table[2]:= 1:
>Fibonnaci_table[3]:= 3: Fibonnaci_table[4]:= 3:
4.2. Mảng 89

>Fibonnaci_table[5]:= 5: Fibonnaci_table[6]:= 9:
B. Gán b cho bảng trên. Gán c cho bảng được sao chép từ bảng trên.
Hàm copy dùng để tạo ra một bảng hoặc mảng khác.
>b:= eval(Fibonnaci_table):
b := table([1 = 1, 2 = 1, 3 = 3, 5 = 5, 4 = 3, 6 = 9])
>c:= copy(Fibonnaci_table):
C. Thay đổi một thành phần của bảng, việc thay đổi này có ảnh
hưởng tới cả bảng b và bảng Fibonnaci_table.
>b[6]:= 8;
b [6] : = 8

D. Bảng Fibonnaci_table được quy chiếu bằng một tên khác, nó đã


bị thay đổi.
>Fibonnaci_table[6];
8
E. Nhưng bản sao của Fibonnaci_table là c thì không bị thay đổi.
>c[6];
9

4.2. Mảng
Mảng là một bảng với tập chỉ số là số nguyên. Miền biến
thiên của tập chỉ số phải được chỉ ra ngay khi mảng được xây dựng
bởi hàm array, hàm này cũng tượng tự như hàm table. Trong việc
tạo mảng, ta phải xác định một miền chỉ số nguyên cho mỗi chiều
của mảng. Trong đó ta có thể xác định chỉ số của mảng là rời rạc, đối
xứng, không đối xứng hoặc một vài kiểu chỉ số khác.
Công việc thay đổi, sao chép mảng cũng giống như bảng. Điểm
khác biệt giữa bảng và mảng nói chung được thể hiện bởi sự hạn chế
cho các chỉ số nguyên, phép quy chiếu tới mỗi thành phần của mảng
sẽ được kiểm tra để xác định xem chỉ số đó có nằm trong miền chỉ số
đã được định nghĩa khi tạo lập mảng hay không.
Ví dụ 4.5. Mảng trong Maple.
A. Định nghĩa một mảng hai chiều a bao gồm hai hàng và hai cột.
>a:= array(1..2, 1..2);
a := array(1..2, 1..2, [])
90 Chương 4. Maple với đại số tuyến tính

B. Gán giá trị vào thành phần của mảng.

>a[1, 1]:= 1: a[1, 2]:= 2: a[2, 2]:= 4:

C. Cũng như bảng, tên của nó khi thực hiện trực tiếp không cho nội
dung mảng. Sử dụng print để hiển thị mảng.Nếu một phần tử nào
không được gán giá trị thì Maple sẽ in ra tên của nó.

>a;
a
>print(a);
" #
1 2
a[2, 1] 4

D. Chỉ số một mảng tạo ra các tham chiếu đến giá trị vị trí của mảng.
Khi biểu thức chỉ số được gán cho một giá trị, lúc đó phép thay thế
toàn bộ được áp dụng cho mảng với chỉ số tương ứng.

>i:= ’i’;
i := i
>b:= a[i+1, i];
b := a[i + 1, i ]
>c:= 2*b;
c := 2a[i + 1, i ]
>i:= 1:
>b;
a[2, 1]

E. Xác lập một mảng một chiều có tệp chỉ số trong khoảng từ 1 tới 3.
định nghĩa chỉ số và giá trị tại đó là t.

>b:= array(-1..3, [-1=t]);


b := array(−1..3, , [
−1 = t
0 = b [0]
1 = b [1]
2 = b [2]
3 = b [3]
])
>b[-1] + b[1];
t + b [1]
4.3. Tạo hệ thống chỉ số cho mảng và bảng 91

4.3. Tạo hệ thống chỉ số cho mảng và bảng


I. Tạo mảng với hàm đánh chỉ số

>array(<hàm tạo chỉ số>,...);

II. Tạo bảng với hàm đánh chỉ số

>table(<hàm tạo chỉ số>,...);


Hàm chỉ số cho phép ta biết những phần tử của bảng hoặc mảng
phải lấy giá trị mặc định gì. Bảng 4.2 dưới đây chỉ ra một số loại
hàm chỉ số và được cho vào đối số đầu tiên của định nghĩa bảng hoặc
mảng. Ví dụ 4.6 dùng thông số sparse đánh chỉ số rời rạc với giá
trị mặc định ban đầu các phần tử là 0. Còn các hàm chỉ số khác
liên quan tới mối liên hệ giữa các phần tử của bảng hoặc mảng như
symmetric, antisymmetric,..

Bảng 4.2. Những hàm chỉ số trong Maple


Ký hiệu Maple Công dụng
sparse Thành phần mặc định là 0 nếu không có cập
nhật gì.
symmetric Tất cả thành phần mà chỉ số của nó bằng tổ
hợp là cùng như nhau.
antisymmetric Tất cả thành phần mà chỉ số là tổ hợp chẵn
của các chỉ số khác là giống nhau. Tất cả
thành phần mà chỉ số là tổ hợp lẻ của các chỉ
số khác là được cộng với số nghịch đảo. Thành
phần có chỉ số lặp lại bằng 0.
identity Tất cả thành phần trên đường chéo cho là 1.
Tất cả các thành phần khác cho bằng 0.

Ví dụ 4.6. Hàm chỉ số cho mảng và bảng, hàm indices và entries.


A. Chúng ta đánh chỉ số rời rạc một bảng, tính phần tử trùng nhau
trong danh sách. Chúng ta định nghĩa một bảng gồm các phần tử và
tần suất của chúng.

>List:=[x,y,x,z,x,z,a,z,x,x,y,b,a,z];
List := [ x, y, x, z, x, z, a, z, x, x, y, b, a, z]
92 Chương 4. Maple với đại số tuyến tính

>F:=table(sparse);
F := table(sparse, [])
>for i in List do F[i]:=F[i]+1 od:
B. Vì bảng định nghĩa bằng sparse, nếu ký tự chỉ số không có trong
danh sách List thì giá trị mặc định bằng 0.
>F[a],F[c],F[x];
2, 0, 5
C. Chỉ số và thành phần của bảng F tương ứng khác 0.
>indeces(F);
[ a ], [ z ], [ y ], [ x ], [ b ]
>entries(F);
[2], [4], [2], [5], [1]

4.4. Ma trận và vectơ cùng các phép toán


Maple sử dụng quy định vectơ là một mảng một chiều có dạng
array(1..n) và ma trận là một mảng có dạng array(1..m, 1..n) với
m, n là các số nguyên. Bằng việc gán các mảng cho các biến ta có
thể tạo ra được một biểu thức để làm việc được với các thủ tục đại số
tuyến tính của Maple.

Ví dụ 4.7. Tạo ra vectơ, ma trận và phép toán đơn giản.


A. Tạo vectơ và các phép toán đặc trưng của vectơ. Vectơ với các
thành phần b:=vector([x1,x2,...,xn])
>x:=vector([1,0,0]);
x := [1, 0, 0]
>x[1];
1
B. Tích của hai vectơ
>with(linalg):
>a:=([2,1,3,2]); b:=([1,2,-2,1]);
a := [2, 1, 3, 2]
b := [1, 2, −2, 1]
>dotprod(a,b);
0
>phi=angle(a,b);
π
φ=
2
4.4. Ma trận và vectơ cùng các phép toán 93

C. Chuẩn q và chuẩn hóa một vectơ. Nếu a = ( a1 , a2 , ..., an ) thì


|| a|| = x12 + x22 + ... + xn2 trong Maple là norm(a,2). Chuẩn hóa
a
là normalize(a).
|| a||
>with(linalg): norm(a,2); √
3 2
>normalize(a);
p p p p
[(1/3) (2), (1/6) (2), (1/2) (2), (1/3) (2)]
D. Định nghĩa ma trận tổng quát như lệnh mảng ma-
trix(n,m,[[a11,a12,...,a1m], [a21,a22,...,a2m], ..., [an1,an2,...,anm]])
ở đây n số hàng và m là số cột.
>A:=matrix([[1,2,3],[-3,-2,-1]]);
" #
1 2 3
−3 −2 −1
E. Ma trận đặc biệt
>J:=diag(1,2,3);  
1 0 0
 
0 2 0
 
0 0 3

Với cách này Maple sẽ thực hiện các phép toán vectơ/ma trận
thông qua áp dụng hàm evalm với các toán tử trong bảng 4.3 cho
biểu thức của vectơ/ma trận.

Bảng 4.3. Toán tử cho ma trận và vectơ với hàm evalm


Ký hiệu Thao tác Ví dụ
+ Cộng vectơ hoặc ma trận >evalm(A+B)
&* Nhân ma trận hoặc >evalm(A &* v)
vectơ với ma trận
^(-1) Nghịch đảo ma trận >evalm(A^(-1))
^(n) Luỹ thừa bậc n của ma >evalm(A^3)
trận,n nguyên
* Tích vô hướng >evalm(2*A&*B-C&* (a*v))
&*() Đồng nhất ma trận >evalm(A - lambda * &*())
94 Chương 4. Maple với đại số tuyến tính

Ví dụ 4.8. Các phép toán ma trận với hàm evalm.


A. Thiết lập ma trận A. Đây là một cách định nghĩa khác về ma trận
với việc liệt kê theo hàng.
>A:= array([ [1, 2, 3], [x,
 x, 5],[1/2, 4, -1] ]);
1 2 3
 
A :=  x x 5 


1
2 4 −1

B. Tính ma trận nghịch đảo của A.


>Alinv:= evalm(A^(-1));
 
−2 x+20 28
−2 −23x
10+3x
 23x−30 23x −30 −30 
 2x+5 −5+3x 
 23x−30 − 23x5−30 2 23x −30 
7 23xx−30 6
23x −30 −2 23xx−30

C. Kiểm tra tính đúng đắn của ma trận nghịch đảo.


>evalm(A &* Alinv);  
1 0 0
 
0 1 0
 
0 0 1

D. Thiết lập một vectơ v và gán giá trị cho 2 thành phần đầu của
nó. Biểu thức gốc nhân ma trận với vectơ,không đưa ra giá trị thành
phần.
>v:= array(1..3): v[1]:= 23:
>v[2]:= -y:

>print(v);
[23, −y, v[3]]
>A &* v;
A& ∗ v
E. Sử dụng evalm cho nhân ma trận và vectơ như một biểu thức.
>evalm(A &* v);
[23 − 2y + 3v[3], 23x − xy + 5v[3], 23/2 − 4y − v[3]]

F. Lưu ý rằng &* có thể được dùng cho phép nhân ma trận với ma
trận, ma trận với vectơ nhưng không được dùng cho tích hai vectơ.
4.5. Gói lệnh đại số tuyến tính trong Maple 95

>evalm(v &* v);


Error, (inlinalg[mutiply])vectordimensionsincompatible
>w:= array(1..3, 1..1, [[v[1]],  [v[2]], [v[3]]]);
23
 
w :=  −y 


v [3]
>evalm(v - 2*w);  
23
 

 y 

− v [3]
>evalm(A &* w - A &* v);  
0
 
0
 
0
>evalm(w &* v);
Error, (inlinalg[mutiply])matrix/vectordimensionsincompatible
G. Tính lũy thừa ma trận dùng ^.
>B:= evalm(2*A^2);
 
5 + 4x 28 + 4x 20
 
2x + 2x2 + 5 4x + 2x2 + 40 16x − 10
 
8x 28 + 4x 20

4.5. Gói lệnh đại số tuyến tính trong Maple


Thư viện của Maple chứa đựng một số gói thủ như đã nói ở phần
mở đầu, mỗi một gói thủ tục chứa đựng các hàm có liên hệ với nhau.
Trong phần này miêu tả gói thủ tụclinalg. Gói thủ tục này chứa
đựng các hàm thực hiện trên mảng (chính là những vectơ và ma
trận trong Maple). Câu lệnh with(linalg) cho phép ta gọi trực tiếp
các hàm trong gói thủ tục linalg. Ví dụ như sau khi ta thực hiện
câu lệnh with(linalg) ta có thể gọi hilbert thay vì linalg[hilbert].
Bảng 4.4 và 4.5 trình bày tên của các toán tử vectơ và ma trận. Bảng
4.7 trình bày các toán tử dùng để tính tập giá các vectơ hoặc vectơ cơ
sở. Bảng 4.6 trình bầy các toán tử vi phân cho vectơ và ma trận.
96 Chương 4. Maple với đại số tuyến tính

Bảng 4.4. Các toán tử cho vectơ và ma trận

Toán tử Lệnh trong Maple


u + v (vectơ) add(u, v) hoặc evalm(u+v)
A + B (ma trận) add(A, B) hoặc evalm(A+B)
AB multiply(A, B) hoặc evalm(A &* B)
Av multiply(A, v) hoặc evalm(A &* v)
u·v dotprod(u, v)
u×v crossprod(u, v)
A −1 inverse(A) hoặc evalm(1/A)
det A det(A)
tr A trace(A)
adj A adjoint(A)
AT transpose(A)
Tính biểu thức cố permanent(A)
định của A

Bảng 4.5. Các hàm toán học cho vectơ và ma trận

Toán tử Lệnh trong Maple


Giải phương trình Ax = b linsolve(A, b)
Thực hiện khử Gause trên A gausselim(A)
Khử hàng theo dạng Gause-Jordan ở A rref(A) hoặc
gausjord(A)
Tìm giá trị riêng của A eigenvals(A)
Tìm vectơ riêng của A eigenvects(A)
Tìm ma trận đặc trưng của A và x charmat(A. x)
Tìm đa thức đặc trưng của A charpoly(A, x)
Tìm đa thức cực tiểu của A minpoly(A, x)
Tìm hàm mũ Ma trận của A exponential(A)
Tìm dạng Jordan của A jordan(A)
Tìm dạng chuẩn tắc Smith của A smith(A, x)
Tìm dạng Hermite của A hermite(A, x)
4.5. Gói lệnh đại số tuyến tính trong Maple 97

Ví dụ 4.9. Gói lệnh đại số tuyến tính linalg.


A. Gọi gói lệnh đại số tuyến tính. Khi ta gọi bằng lệnh with, thì
Maple liệt kê tất cả hàm trong gói lệnh đó.
>with(linalg);
BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp, QRdecomp,
Wronskian, addcol, addrow, adj, adjoint, angle, augment,
backsub, band, basis, bezout, blockmatrix, charmat, charpoly,
cholesky, col, coldim, colspace, colspan, companion, concat,
cond, copyinto, crossprod, curl, definite, delcols, delrows, det,
diag, diverge, dotprod, eigenvals, eigenvalues, eigenvectors,
eigenvects, entermatrix, equal, exponential, extend, ffgausselim,
fibonacci, forwardsub, frobenius, gausselim, gaussjord,
geneqns, genmatrix, grad, hadamard, hermite, hessian, hilbert,
htranspose, ihermite, indexfunc, innerprod, intbasis, inverse,
ismith, issimilar, iszero, jacobian, jordan, kernel, laplacian,
leastsqrs, linsolve, matadd, matrix, minor, minpoly, mulcol,
mulrow, multiply, norm, normalize, nullspace, orthog, permanent,
pivot, potential, randmatrix, randvector, rank, ratform, row,
rowdim, rowspace, rowspan, rref, scalarmul, singularvals, smith,
stackmatrix, submatrix, subvector, sumbasis, swapcol, swaprow,
sylvester, toeplitz, trace, transpose, vandermonde, vecpotent,
vectdim, vector, wronskian

B. Tạo một véctơ ba chiều u.


>u:= array([-1, 3-s, -4]);
u := [−1, 3 − s, −4]
C. Thiết lập ma trận A có kích cỡ 3 × 3.
>A:= array( [ [1, 2, 3],
 [3, -1,6], [4, 8, 12] ]);
1 2 3
 
3 −1 6 
 
4 8 12

D. Giải phương trình Ax = u. Nếu có nhiều hơn một nghiệm, lin-


solve sẽ sử dụng các tham số t1, t2, t3, ... cho việc thể hiện các kết quả
theo thông số. Kết quả thực hiện hàm linsolve, mọi giá trị của t2 sẽ
đưa ra nghiệm của phương trình ma trận.
>linsolve(A, u);
[5t2 + 5 − s, t2, −7/3t2 − 2 + 1/3s]
98 Chương 4. Maple với đại số tuyến tính

E. Tính định thức của A.


>det(A);
0
F. Tính đa thức đặc trưng của A.
>cpoly:=charpoly(A, lam);
cpoly := lam3 − 12lam2 − 67lam

G. Kiểm tra định lý Cayley-Hamilton bằng phép giản ước đa thức


đặc trưng lam = A. Kiểm tra xem các thành phần của ma trận được
tạo ra có các phần tử đều bằng 0 hay không.
>subs(lam = A, cpoly);
A3 − 12A2 − 67A
>evalm(%);  
0 0 0
 
0 0 0
 
0 0 0

H. Tính giá trị riêng của A.


>eigenvals(A); √ √
0, 6+ 103, 6− 103

I. phân tích ra thừa số đa thức đặc trưng. Các nghiệm của đa thức
này chính là các giá trị riệng của ma trận A.
>factor(cpoly);
lam(lam2 − 12lam − 67)

K. Tính hàm mũ ma trận của ma trận phản đối xứng.


>a:= matrix([[0, x], [-x, "0]]); #
0 x
a :=
−x 0
>exponential(a); " #
cos( x ) sin( x )
− sin( x ) cos( x )
4.5. Gói lệnh đại số tuyến tính trong Maple 99

Bảng 4.6. Các toán tử vi phân trên ma trận và vectơ.

Toán tử Lệnh Maple


Cho f là một vectơ của 3 biểu thức và v curl(f, v)
là một vectơ của 3 biến. Tính rôta của f
theo v: rot f = (∂ f 3 /∂v2 − ∂ f 2 /∂v3 , ∂ f 1 /∂v3 −
∂ f 3 /∂v1 , ∂ f 2 /∂v1 − ∂ f 1 /∂v2 ).
Cho f là một vectơ của biến biểu thức các biến grad(f, v)
trong danh sách v. Tính grad của hàm f ,
grad f = (∂ f 1 /∂v1 ..∂ f n /∂vn ).
Tính div của f theo véc tơ v, diverge(f, v)
n
div f = ∑ ∂ f i /∂vi .
i =1
Tính ma trận Hess của hàm vô hướng s khả hessian(s, v)
vi hai lần và vectơ v, mà các thành phần là
các biến biến của s. Phần tử (i, j) của matrận
Hess là ∂2 s/∂vi ∂v j .
Cho hàm vô hướng s nhiều biến và vectơ của laplacian(s, v)
các biến v. Tính hàm Laplace của hàm s
theo biến v bằng công thức ∑i ∂2 s/∂v2i .
Cho một hàm vectơ f và vectơ các biến v. Tính jacobian(f, v)
ma trận jacobi, mà phần tử ở vị trí (i, j) là
∂ f i /∂v j .

Ví dụ 4.10. Ma trận vi phân và toán tử vectơ trong linalg.


A. Khởi động gói lệnh
>with(linalg):
>
B. Đưa vào một hàm vô hướng.
>f:= 4*x*z - 5*y*x^3;
f := 4xz − 5yx3
C. Tính ( grad của hàm f ) theo x, y, z.
>gradf:= grad(f, [x, y, z]);
grad f := [4z − 15yx2 , −5x3 , 4x ]
100 Chương 4. Maple với đại số tuyến tính

D. Đưa vào một vectơ v với các biến x, y, z


>v:= vector( 3, [4*x-3*x^3*y, 7*x*y*z^2+5*y^3,
4*x^2*y^2+2*x]]);
v := [4x − 3x3 y, 7xyz2 + 5y3 , 4x2 y2 + 2x ]
E. Tính (rot của trường vectơ v) và Jacobi.
>curlv:= curl(v, [x, y, z]);
curlv := [8yx2 − 14xyz, −8xy2 − 2, 7yz2 + 3x3 ]
>jacobian(v, [x, y, z]); 
4 − 9yx2 −3x3 0
 
 7yz2 7xz2 + 15y2 14xyz
 
2
8xy + 2 8yx 2 0

F. Tính hàm Laplace của f . Hàm evalb tính phương trình như
biểu thức logic. evalb đưa ra giá trị đúng nếu xác định hai vế phía
phương trình bằng nhau.
>lapf:= laplacian(f, [x, y, z]);
lap f := −30yx
>evalb(lapf =diverge(gradf, [x, y, z]));
true
G. Chúng ta xét định nghĩa vectơ Laplacian là
>vectlapv:=map(laplacian, v, [x, y, z]);
vectlapv := [−18yx, 30y + 14yx, 8y2 + 8x2 ]
>graddivv:= grad(div v, [x, y, z]);
graddivv := [0, 0, 0]
>curlcurlv:= curl(curlv, [x, y, z]);
curlcurlv := [7z2 , −14yx − 9x2 , −8y2 − 8x2 ]
>evalm(vectapv- (graddivv-curlcurlv));
[−18yx + 7z2, 30y − 9x2, 14xz]

Bảng 4.7. Các toán tử dùng để tính tập vectơ cơ sở.

Toán tử Lệnh Maple


Cho một danh sách hoặc tập hợp các vectơ V, tìm basis(V)
một cơ sở của không gian vectơ sinh ra bởi V. Giá
trị đưa ra là một danh sách (tập hợp).
4.6. Toán tử tạo cấu trúc ma trận và vectơ 101

Tìm cơ sở cho hạt nhân của ma trận A (nghĩa là kernel(A),


không gian các vectơ v sao cho Av là vectơ 0.) nullspace(A)
Tìm cơ sở cho không gian vectơ được tạo bởi các rowspace(A),
vectơ dòng (cột) của ma trận A. colspace(A)
Tính hệ vectơ cơ sở trực giao cho không gian GramSchmidt(A)
vectơ được tạo bởi các vectơ cột của ma trận A.

Ví dụ 4.11. Tính hệ vectơ cơ sở.


A. Cho hệ vectơ a1 , a2 , a3 , a4 , a5 , tính hệ vectơ cơ sở
>restart; with(linalg):
a1:= vector([1, 2, 2, -1]):
a2:= vector([1, 1, -5, 3]):
a3:= vector([3, 2, 8, 7]):
a4:= vector([0, 1, 7, -4]):
a5:= vector([2, 1, 12, -10]):
g:= basis([a1, a2, a3, a4, a5]);
g := [ a1, a2, a3, a5]
B. Tính cơ sở trực giao GramSchmidt.
>GramSchmidt(g);
[[1, 2, 2, −1], [2, 3, −3, 2], [81/65, −93/65, 327/65, 549/65],
[1633/724, −923/724, −71/724, −355/724]]

4.6. Toán tử tạo cấu trúc ma trận và vectơ


Nhiều trường hợp trong đại số tuyến tính liên quan tới việc tổ
hợp hoặc thao tác trên các thành phần riêng biệt của ma trận hoặc
vectơ, thường là các hàng hoặc các cột. Gói thủ tục linalg chứa đựng
nhiều hàm để giúp ta thực hiện các phép toán đó. Bảng 4.8 và 4.9
miêu tả các toán tử này.

Bảng 4.8. Tìm số chiều của ma trận và vectơ.

Tìm Lệnh Maple


Số dòng của ma trận A rowdim(A)
Số cột của ma trận A coldim(A)
Số thành phần của vectơ v vectdim(A)
102 Chương 4. Maple với đại số tuyến tính

Bảng 4.9. Các toán tử về cấu trúc trên ma trận và vectơ.


Toán tử Lệnh Maple
Tạo lập một ma trận tượng tự như A, addrow(A,r1,r2,m)
ngoại trừ dòng r2 là tổng của dòng r2
của A và m lần dòng r1.
Giống như addrow ở trên, nhưng dành addcol(A,c1,c2,m)
cho cột.
Tạo một ma trận tượng tự như A, ngoại mulrow(A, i, exp)
trừ dòng (cột) i được nhân với exp.
Tạo một vectơ từ dòng (cột) i của ma row(A,i), col(A,i)
trận A.
Tạo một ma trận bao gồm các cột của agument(A,B),
hai ma trận A và B (kết hợp theo chiều concat(A,B)
ngang). agument(A, B), concat(A, B) có
cùng một tác dụng.
Tạo lập một ma trận bằng việc ghép các stack(A, B)
dòng của hai ma trận A và B vào nhau
(kết hợp theo chiều dọc).
Gán ma trận A vào B với các phần tử copyinto(A,B,m,n)
của A đè lên ma trận Bm,n ,mà nó là ma
trận con góc trên phải của B.
Tạo lập một ma trận được mở rộng bằng extend(A,B,m,n,x)
việc thêm vào ma trận A, m dòng và n
cột. x là giá trị vô hướng để khởi tạo
phần tử mở rộng nếu tham số tuỳ chọn
này xuất hiện.
Tạo lập một ma trận gồm có các thành submatrix(A,r1..r2,
phần từ các cột r1..r2 và từ các dòng c1..c2)
c1..c2 của ma trận A.
Tạo lập một vectơ bao gồm các phần tử subvector(v,i ..j)
từ i đến j của vectơ v.
Tạo lập một ma trận như ma trận A swaprow(A,i,j),
ngoại trừ hai dòng (cột) i và j được hoán swapcol(A,i,j)
vị cho nhau.
Tạo lập một ma trận nn và d1, d2, ..., dn diag(d1,d2,...,dn)
là các giá trị trên đường chéo.
4.6. Toán tử tạo cấu trúc ma trận và vectơ 103

Tạo lập một ma trận như ma trận A delrow(A,i..j),


ngoại trừ việc huỷ bỏ dòng (cột) từ i tới delcol(A,i ..j)
j của ma trận A.
Tạo lập ma trận với các ma trận diag(B1,B2,...,Bn)
B1, B2, ..., Bn làm thành các khối trên
đường chéo.
Tạo ma trận hệ số từ danh sách (tập genmatrix(eqs,
hợp) các phương trình và danh sách (tập valiables),
hợp) các biến. Nếu có thông số thứ ba genmatrix(eqs,
anything thì cột cuối cùng của ma trận valiable,anything)
hệ số là vectơ của vế phải phương trình
với dấu ngược lại.

Ví dụ 4.12. Một vài phép toán điều kiển cấu trúc mảng.
A. Khởi động bộ chương trình linalg

>with(linalg):

B. Đưa vào ma trận.

>A:= matrix(3, 3, [19,


 -50, 88, 53,
 85, -49, 78, 17, 72]);
19 −50 88
 
53 85 −49
 
79 17 72

C. Maple có một số toán tử ma trận đơn giản. Chúng ta sử dụng nó


để tạo ra ma trận B có các thành phần giống A ngoại trừ các giá trị
A[2, 1]
dòng thứ 2 của B được xác định bằng: B[2, i ] = A[2, i ] − .
A[1, 1]

>B:= addrow(A, 1, 2, -A[2,


 1]/A[1, 1]);

19 −50 88
 4265 5595 
B :=  0 
 19 19 
78 17 72
104 Chương 4. Maple với đại số tuyến tính

D. Hoán vị hai dòng 3 và 2.

>C:= swaprow(B, 3, 2);


 
−50
19 88
78 17 72 
 
C := 
4265 5595
 
0
19 19
E. Nhân dòng 3 với số 19.

>D:= mulrow(C, 3, 19); 


19 −50 88
 
D := 78 17
 72 
0 4265 5595

F. Tạo ra một ma trận con.

>submatrix(A, 2..3, 1..3);


" #
53 85 −49
78 17 72

G. Đưa các thành phần của một ma trận vào ma trận khác tạo ra
một ma trận lớn hơn.

>stack(B, row(C,
 1)); 4265 5595 
19 −50 88 0
 19 19 
78 17 72
 

19 −50 88

H.Sử dụng augment để tạo ra một ma trận mới và chuuyển nó


thành dạng Gauss-Jordan.

>b1:= vector(3, [3, 5, -2]):


>b2:= vector(3, [4, -5, 9]):
>b3:= vector(3, [21, 4, 7]):
>augmenr(A, b1,
 b2, b3); 
19 −50 88 3 4 21
 
53 85 −49 5 −5 4 
 
78 17 72 −2 9 7
4.7. Gọi lệnh của gói lệnh thông qua with 105

>gaussjord(%);
56399 42938 43729
 
1 0 0
 9855 9855 3285 
 20528 15761 15913 
0 1 0 − 
 3285 3285 3285 
 46832 36584 35782 
0 0 1 −
9855 9855 9855

4.7. Gọi lệnh của gói lệnh thông qua with


Ta có thể tránh việc phải gọi tất cả các hàm trong gói lệnh
linalg, khi muốn sử dụng một hàm trong gói gói lệnh này ta sử
dụng linalg[<Tên hàm>](<Đối số>). Ví dụ, ta có thể thực hiện câu
lệnh linalg[add](u, v) tại bất kỳ lúc nào cần không thực hiện câu
lệnh with trước đó.
Lệnh with(linalg, <Tên hàm>) chỉ gọi duy nhất một thủ tục
<Tên hàm>, thay vì tất cả các thủ tục trong gói này. Như vậy khi
ta thực hiện câu lệnh with(linalg, add); ta có thể sử dụng add(u,
v) sau đó, nhưng không thể sử dụng được các thủ tục multiply,
transpose ... như khi dùng with(linalg).

Ví dụ 4.13. Đại số tuyến tính không dùng with.


A. Định nghĩa I như là matrận đơn vị 3 × 3. Mắc lỗi vì I là tên một
hằng số của Maple (căn bậc hai của -1).

>I:= array(1..3, 1..3, identity);


Error, Illegal use of an object as a name
>Id:= array(1..3, 1..3, identity);
Id := array(identity, 1..3, 1..3, [])

B. Tạo một ma trận bằng hàm linalg không cần có with.

>linalg[add](Id, Id);  
2 0 0
 
0 2 0
 
0 0 2

C. Hàm randmatrix(n, m) tạo ra một ma trận m dòng và n cột với


các phần tử là các số nguyên ngẫu nhiên.
106 Chương 4. Maple với đại số tuyến tính

>with(linalg, randmatrix);
[randmatrix]
>R:= randmatrix(2, 2); " #
−85 −55
R :=
−37 −35

4.8. Gói lệnh đại số tuyến tính mới


Phiên bản Maple 17 có một gói lệnh LinearAlgebra khác với gói
lệnh linalg các lệnh và hàm trong hai gói lệnh này không trùng
nhau. Tuy nhiên nhiều hàm có tên khác nhau nhưng cũng làm
những tính toán như nhau trong đại số tuyến tính. Gói lệnh Lin-
earAlgebra mới được thiết kế lại cho Đại số tuyến tính nên các lệnh
chạy tốt hơn. Theo tài liệu hướng dẫn gói lệnh LinearAlgebra và
gói lệnh vector dần dần sẽ thay gói lệnh linalg.
Các lệnh của trong LinearAlgebra là nguyên từ hoặc kết hợp
các từ tiếng Anh.Ví dụ ColumnDimension, LinearSolve,...là lệnh tìm
chiều của cột, lệnh giải hệ phương trình tuyến tính dạng ma trận.

Ví dụ 4.14. A. Các lệnh trong gói lệnh LinearAlgebra


>with(LinearAlgebra);
‘&x‘, Add, Adjoint, BackwardSubstitute, BandMatrix, Basis,
BezoutMatrix, BidiagonalForm, BilinearForm, CARE,
CharacteristicMatrix, CharacteristicPolynomial, Column,
ColumnDimension, ColumnOperation, ColumnSpace,
CompanionMatrix, ConditionNumber, ConstantMatrix,
ConstantVector, Copy, CreatePermutation, CrossProduct,
DARE, DeleteColumn, DeleteRow, Determinant, Diagonal,
DiagonalMatrix, Dimension, Dimensions, DotProduct,
EigenConditionNumbers, Eigenvalues, Eigenvectors, Equal,
ForwardSubstitute, FrobeniusForm, GaussianElimination,
GenerateEquations, GenerateMatrix, Generic,
GetResultDataType, GetResultShape, GivensRotationMatrix,
GramSchmidt, HankelMatrix, HermiteForm, HermitianTranspose,
HessenbergForm, HilbertMatrix, HouseholderMatrix,
IdentityMatrix, IntersectionBasis, IsDefinite,
IsOrthogonal, IsSimilar, IsUnitary, JordanBlockMatrix,
JordanForm, KroneckerProduct, LA_Main, LUDecomposition,
LeastSquares, LinearSolve,
4.8. Gói lệnh đại số tuyến tính mới 107

LyapunovSolve, Map, Map2, MatrixAdd, MatrixExponential,


MatrixFunction, MatrixInverse, MatrixMatrixMultiply,
MatrixNorm, MatrixPower, MatrixScalarMultiply,
MatrixVectorMultiply, MinimalPolynomial, Minor, Modular,
Multiply, NoUserValue, Norm, Normalize, NullSpace,
OuterProductMatrix, Permanent, Pivot, PopovForm,
QRDecomposition, RandomMatrix, RandomVector, Rank,
RationalCanonicalForm, ReducedRowEchelonForm, Row,
RowDimension, RowOperation, RowSpace, ScalarMatrix,
ScalarMultiply, ScalarVector, SchurForm, SingularValues,
SmithForm, StronglyConnectedBlocks, SubMatrix,
SubVector, SumBasis, SylvesterMatrix, SylvesterSolve,
ToeplitzMatrix, Trace, Transpose, TridiagonalForm,
UnitVector, VandermondeMatrix, VectorAdd, VectorAngle,
VectorMatrixMultiply, VectorNorm, VectorScalarMultiply,
ZeroMatrix, ZeroVector, Zip

B. Các lệnh trong gói lệnh này các từ tiếng Anh thường dùng với ký
tự đầu tiên hoa. Không những như vậy lệnh Vector là vectơ cột chứ
không phải vectơ hàng.

>with(linalg): with(LinearAlgebra):
>u:= Vector([-1,3-s,-4]);  
−1
 
u := 
3 − s 

−4
>v:= vector([-1,3-s,-4]);
h i
v : = −1 3 − s −4
>A:= Matrix([[1, 2, 3],  [3, -1, 6], [4, 8, 12]]);
1 2 3
 
A : = 3 −1
 6
4 8 12
>B:= matrix([[1, 2, 3], 
[3, -1, 6], [4, 8, 12]]);
1 2 3
 
B := 
3 −1 6  
4 8 12

C. Giải hệ phương trình tuyến tính bằng lệnh LinearSolve. Nghiệm


sử dụng lệnh trên là một vectơ cột.
108 Chương 4. Maple với đại số tuyến tính

>LinearSolve(A,u);  
5 + 5_t12 − s
 

 _t12 

−2 − 73 _t12 + 31 s
>linsolve(B,v);
h i
5 + 5_t1 − s _t1 −2 − 73 _t1 + 13 s

D. Kết hợp các ma trận A, B và u, v thì hai lệnh giải hệ phương trình
tuyến tính dạng ma trận không thực hiện được:
>LinearSolve(B,v);
Error, (in LinearAlgebra:-LinearSolve) invalid input:...

>LinearSolve(A,v);
Error, (in LinearAlgebra:-LinearSolve) invalid input:
>LinearSolve(B,u);
Error, (in LinearAlgebra:-LinearSolve) invalid input:
E. Nhưng có nhiều kết hợp vẫn có kết quả
>linsolve(A,u);
h i
5 + 5_t1 − s _t1 −2 − 73 _t1 + 13 s
>linsolve(A,v);
h i
5 + 5_t1 − s _t1 −2 − 73 _t1 + 13 s
>linsolve(B,u);
h i
5 + 5_t1 − s _t1 −2 − 73 _t1 + 13 s

Tóm lại, những lệnh trong gói lệnh LinearAlgebra được thiết kế
chặt chẽ, dữ liệu đầu vào phải chính xác. Còn gói lệnh linalg có
những lệnh chưa chặt chẽ khi đầu vào với dạng khác nhau, nhưng
có thể mềm dẻo khi sử dụng.

4.9. Bài tập luyện tập


. 4.1. Cho hai vectơ a = (2, 3, 1, 2), b = (1, 2, −2, 1). Tính tích vô
hướng ( a, b) và góc giữa hai vectơ a và b.
. 4.2. Tìm tích vectơ c = [ a, b] và tích vô hướng ( a, c) với a = (2, −2, 1),
b = (2, 3, 6).
. 4.3. Tìm chuẩn của vectơ a = (2, −2, 1).
4.9. Bài tập luyện tập 109
" # " # " #
4 3 −28 93 7 3
. 4.4. Cho ma trận A = , B = ,C = .
7 5 38 −126 2 1
Tính ( AB)C, detA, detB, detC, det[( AB)C ].
 
2 5 7
−1
  T
. 4.5. Cho ma trận A =  6 3 . Tính det A.A , A , det( M22 ).
4 
5 −2 −3
 
8 −4 5 5 9
1 −3 −5 0 −7
 
. 4.6. Tìm rank của ma trận A =  7 −5 1 4 1 .

 
3 −1 3 2 5
" #
3 −1
. 4.7. Tính eT với T = .
1 1
 
5 1 4
 
. 4.8. Cho ma trận A =  3 3 2 . Tính giá trị của đa thức

6 2 10
P( A) = A3 − 18A2 + 64A.
" #
3 2−i
. 4.9. Cho ma trận B = . Tính vectơ riêng và giá trị
2+i 7
riêng của B.
 
3 −i 0
 
. 4.10. Cho matrận A = 
i 3 . Tính vectơ riêng, giá trị riêng,
0
0 0 4
đa thức đặc trưng, đa thức nhỏ nhất và dạng Jordan.
 
1 −3 4
 
. 4.11. Cho ma trận A =   4 − 7 8 . Chuyển ma trận A về dạng

6 −7 7
Jordan, dạng tam giác, tìm ma trận đặc trưng.
. 4.12. Tìm nghiệm chung và một nghiệm riêng của hệ phương trình

2x − 3y + 5z + 7t
 =1
4x − 6y + 2z + 3t =2

2x − 3y − 11z − 15t = 1.

110 Chương 4. Maple với đại số tuyến tính

. 4.13. Giải
" phương# trình
" ma # trận AX = B,
1 2 3 5
ở đây A = ,B= .
3 4 5 9
 
1 1 0
 
. 4.14. Cho ma trận A =  0 2 −1. Tìm rank của ma trận và

1 3 −1
d( a) = n − r ( A), ở đây n chiều ma trận vuông, r là rank của ma trận.
Tính nhân của A.

4.10. Bài tập tự giải


. 4.15. Cho hai vectơ a = (1, 2, 2, 3), b = (3, 1, 5, 1). Tính ( a, b) và góc
ϕ giữa hai vectơ.

. 4.16. Cho 3 vectơ a = (2, −3, 1), b = (−3, 1, 2) và c = (1, 2, 3). Tính
[[ a, b], c] và [ a, [b, c]].

. 4.17. Cho hệ các vectơ a1 = (2, 1, 3, −1), a2 = (7, 4, 3, −3), a3 =


(1, 1, −6, 0), a4 = (5, 3, 0, 4). Tìm hệ vectơ cơ sở và hệ thống veactơ
trực giao.

. 4.18. Cho ma trận


   
5 7 −3 −4 1 2 3 4
−4 −5
   
7 6
 và B = 2 3 4 5

A= .
6 4
 −3 −2 1
 3 5 7
8 5 −6 −1 2 4 6 8

Tính AB, BA, det A, det B.

. 4.19. Cho ma trận


 
1 2 3 4
 
2 3 1 2 
A=
 .
 1 1 1 − 1 

1 0 −2 −6

Tính det A, A−1 , A T và M3×2 -matrận 3 hàng, 2 cột tính từ góc trên
bên trái của .
4.10. Bài tập tự giải 111

. 4.20. Tính rank của ma trận


 
−6 4 8 −1 6
 
 −5 2 4 3 1
 
A= 7 2 4 1 3 .
 
 
 2
 4 8 −7 6
3 2 4 −5 3

Chuyển ma trận A về dạng tam giác.


. 4.21. Cho ma trận
 
5 4 3 2 1
 
4 8 6 4 2
 
A = 3 6 9 6 3 .
 
 
2 4 6 8 4
 
1 2 3 4 5

Tính giá trị riêng và đa thức đặc trưng của ma trận.


. 4.22. Cho ma trận  
4 2 −5
 
T=
6 4 −9 .

5 3 −7
Tính e T , det(e T ), vectơ riêng và giá trị riêng của e T và nhân của ma
trận T.
. 4.23. Cho ma trận
 
3 −4 0 2
4 −5 −2 4 
 
A=
 .
0 0 3 −2
0 0 2 −1

Tìm dạng chuẩn Jordan, các vectơ riêng và giá trị riêng, tìm đa thức
đặc trưng và đa thức nhỏ nhất.
" #
1 5 7
. 4.24. Cho ma trận A = . Tìm cỡ, số hàng và số cột của
2 1 6
ma trận A.
112 Chương 4. Maple với đại số tuyến tính

. 4.25. Cho ma trận


 
a b t 3
 
A=
 5 1 7 2.
t+1 9 1 5

Dùng lệnh trong


LinearAlgebra lấy dòng thứ 2 làm vectơ; rút ra dòng thứ 1 và thứ
3 cùng một lúc; rút cột thứ 2 và thứ 4 thành dãy vectơ cột.

. 4.26. Giải hệ phương trình tuyến tính


(
x + 3y + 2z =3
2x − 4y + 5z = 7

bằng lệnh solve và lệnh linsolve trong Maple.

. 4.27. Giải phương trình ma trận AX = B, ở đây


   
1 2 −3 1 −3 0
   
A= 3 2 −4
 B=10 2 7 .

2 −1 0 10 7 8
CHƯƠNG 5
VẼ HÌNH TRONG MAPLE

5.1. Một số hệ tọa độ trong không gian hai chiều . . . . . . . . . . . 113


5.2. Hàm vẽ đồ thị trong không gian hai chiều . . . . . . . . . . . . . . 119
5.3. Hàm polarplot vẽ đồ thị trong tọa độ cực . . . . . . . . . . . . . . . 124
5.4. Ánh xạ bảo giác. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.5. Một số lệnh khác vẽ đồ thị trên mặt phẳng . . . . . . . . . . . . . 128
5.6. Đồ thị trong không gian ba chiều . . . . . . . . . . . . . . . . . . . . . . . . 130
5.7. Các lệnh vẽ đồ thị đặc biệt trong không gian . . . . . . . . . . 139
5.8. Vẽ khối đa diện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
5.9. Làm hoạt hình đồ thị . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
5.10. Bài tập có lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
5.11. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

Ngoài thế mạnh tính toán phục vụ nghiên cứu các ngành khoa
học, Maple còn thể hiện kết quả bằng hình ảnh các dạng đồ thị. Đồ
thị trong Maple dùng rất đơn giản bằng một số lệnh.
Chương này mô tả cách vẽ đồ thị một số hàm vẽ đồ thị với những
hàm số đã cho hoặc tập dữ liệu số đã biết. Hàm plot, plot3d cùng
một số hàm khác cung cấp những cách thức khác nhau để vẽ đồ thị
trong không gian 2 chiều và không gian 3 chiều.

5.1. Một số hệ tọa độ trong không gian hai chiều


Tọa độ mặc định của Maple là hệ tọa độ Đề các. Thông qua hàm
coords chúng ta có thể thay các loại hệ tọa độ khác nhau như liệt
kê dưới đây. Bằng cách gán vào coords tên hệ tọa độ (ví dụ co-
ords=polar), thì Maple sẽ vẽ đồ thị trên hệ tọa độ được gán.
Trong không gian hai chiều: Maple có các hệ tọa độ bipolar, car-
dioid, cassinian, cartesian, elliptic, hyperbolic, invcassinian, invel-
liptic, logarithmic, logcosh, maxwell, parabolic, polar, rose, và tan-
gent.
- Chuyển đổi từ các tọa độ khác nhau về hệ tọa độ Đề các trong
không gian 2 chiều: (u, v) → ( x, y) được cho bằng công thức:
114 Chương 5. Vẽ hình trong Maple

+ bipolar: ( Spiegel ) + hyperbolic:


p√
sinh v x = p √ u2 + v2 + u
x=
cosh v − cos u y= u2 + v2 − u
sin u
y=
cosh v − cos u
+ polar: + logarithmic:
x = u cos v a
x=
y = u sin v π ln u2 + v2
2a
y=
π arctan uv
+ elliptic: + parabolic:
x = cosh u cos v u2 − v2
x=
y = sinh u sin v 2
y = uv

Trong Maple có lệnh đổi một biểu thức từ hệ tọa độ này sang hệ
tọa độ khác như sau:

>changecoords(<Biểu thức>,[x, y],<Tên hệ tọa độ>) ;


>changecoords(<Biểu thức>,[x, y],<Tên hệ tọa độ>,[u, v]) ;

Lệnh thứ nhất biến đổi <Biểu thức> có biến x, y theo tọa độ Đề
các vào hệ tọa độ <Tên hệ tọa độ> với cùng tên biến.
Lệnh thứ hai giống như lệnh thứ nhất với kết quả là biến u, v ở
hệ tọa độ mới.

Ví dụ 5.1. Chuyển biểu thức y = x2 + y2 + a sang hệ tọa độ polar.

>restart: expr := x^2+y^2+a:


changecoords(expr, [x, y], polar);
x2 cos(y)2 + x2 sin(y)2 + a
>changecoords(expr, [x, y], polar, [r, alpha]);
r2 cos(α)2 + r2 sin(α)2 + a
>simplify(%);
α + r2

Ví dụ 5.2. A. Kiểm tra những công thức chuyển đổi từ các hệ tọa đồ
sang hệ tọa độ Đề các. Công thức biến đổi hệ tọa độ parabolic vào hệ
tọa độ Đề các;
5.1. Một số hệ tọa độ trong không gian hai chiều 115

>t:=changecoords([x,y], [x, y], bipolar,[u,v]);



1 2 1 2
t := u − v , uv
2 2
.x:=t[1]; y:=t[2];
1 1
x : = u2 − v2
2 2
y := uv
So với công thức trên hoàn toàn trùng nhau.
B. Thay vào vị trí parabolic là các tên hệ tọa độ khác sẽ có công thức
chuyển đổi tương ứng sang hệ tọa độ Đề các.
>t:=changecoords([x,y],
 [x, y], bipolar,[u,v]);

sinh v sin u
t := ,
cosh v − cos u cosh v − cos u
>t:=changecoords([x,y],
hp√ [x, y], hyperbolic,[u,v]);
p√ i
t := 2 2
u + v + u, u2 + v2 − u

Trong Maple có lệnh in ra mặt phẳng tọa độ và lưới trên mặt


phẳng này.

>coordplot(<Tên hệ tọa độ>);


>coordplot(<Tên hệ tọa độ>,<Tùy chọn>) ;
<Tên hệ tọa độ> là tên một trong các hệ tọa độ liệt kê ở phần
trên. <Tùy chọn> có giá trị sau đây:
• [a..b, c..d] với a, b, c, d là những số thực. Giả sử <Tên hệ tọa độ>
là Đề các, các biến trên trục tọa độ x, y thay đổi tương ứng trong
khoảng [ a, b] và [c, d] và miền xác định R = {( x, y) : a ≤ x ≤ b, c ≤
y ≤ d}. Lưới tọa độ S trong R gọi là tập hợp các điểm ( xi , x j ) với
i = 1, 2, ..., n; y = 1, 2, ..., m sao cho a = x1 < x2 < ... < xn = b;
c = y1 < y2 < ... < ym = d. Dễ thấy trong R có thể cho nhiều lưới
tọa độ. Nếu xk+1 − xk = h1 và ys+1 − ys = h2 (k = 1, 2, ..., n − 1; s =
1, 2, ..., m − 1), thì lưới gọi là đều.
Những lưới tọa độ trong hệ tọa độ Đề các cho bằng những đường
thẳng đồng mức theo nghĩa với tất cả các điểm ( x, y) của đường
thẳng x = xi (i = 1, 2, ..., n) tọa độ thứ nhất chỉ có một giá trị xi .
Tương tự với tất cả các điểm của đường thẳng y = y j ( j = 1, 2, ..., m)
tọa độ thứ hai chỉ có một giá trị y j . Trường hợp <Tên tọa độ>
không phải là Đề các thì các đường lưới trên gọi là đường đồng
mức. Trường hợp không có tùy chọn thì a = c = −2 và b = d = 2.
116 Chương 5. Vẽ hình trong Maple

• color = [c1, c2] với c1, c2 là tên màu được tô trục tọa độ hoặc
các đường song song với trục, ví dụ color = ["Red", "Blue"]
• grid = [n, m] với n, m là những số nguyên, số lượng đường tương
ứng mỗi trục của hệ tọa độ.
• labelling = ty với ty ∈ { f alse, true, f ront, middle, rear }, mặc định
không có nhãn của trục.
• linestyle = [u, v], với u, v ∈ {solid, dot, dash, dashdot, . . . } nét vẽ
trục và các đường đồng mức.
• view = [p1..p2, q1..q2] với p1, p2, q1, q2 là các số thực, mà trục
tọa độ vẽ ra trong khoảng trục thứ nhất [ p1, p2] và trục thứ hai
[q1, q2].

Ví dụ 5.3. Lưới tọa độ của các hệ tọa độ trên mặt phẳng (Hình 5.2)
Trong mặt phẳng có 11 hệ tọa độ khác nhau. Mỗi hệ tọa độ đều có
mục đích sử dụng riêng, những bài toán áp dụng riêng thuận lợi cho
hệ tọa độ đó. Thường thường trong hệ tọa độ đề các ta xây dựng lưới
các nút điểm và vẽ đồ thị theo các nút điểm này. Còn các tọa độ khác
có lưới như thế nào? Các đường lưới và nút lới ra sao ta khó tượng
tượng ra. Đoạn chương trình sau đây sẽ mô tả các lưới trong các hệ
tọa độ khác nhau. Ta lưu các tên hệ tọa độ vào mảng hai chiều, mỗi
ô một hệ tọa độ. Dùng hàm coordplot() vẽ các hệ tọa độ và một ô
coa tên tọa độ đó.
>with(plots):
s := array(1..4, 1..4): t := s:
s[1, 1] := cartesian: s[1, 2] := bipolar:
s[1, 3] := cardioid: s[1, 4] := cassinian:
s[2, 1] := elliptic: s[2, 2] := hyperbolic:
s[2, 3] := invcassinian: s[2, 4] := invelliptic:
s[3, 1] := logarithmic: s[3, 2] := logcosh:
s[3, 3] := maxwell: s[3, 4] := parabolic:
s[4, 1] := polar: s[4, 2] := rose:
s[4, 3] := tangent: s[4, 4] := cartesian:
for i from 1 to 4 do
for j from 1 to 4 do
t[i, j]:=coordplot(s[i,j],title=s[i, j],thickness=3,
color = ["Black", "Red"], grid = [10, 10]);
end do; end do:
>display(t);
5.1. Một số hệ tọa độ trong không gian hai chiều 117

Bảng 5.2. Lưới tọa độ trong các hệ tọa độ trên mặt phẳng

cartesian bipolar cardioid cassinian

elliptic hyperbolic invcassinian invelliptic

logarithmic logcosh maxwell parabolic

polar rose tangent cartesian

Ví dụ 5.4. Vẽ hệ trục tọa độ và các đường mức đồng thời vẽ trên hệ


tọa đó hàm số cos(3x + sin 3x ) trong khoảng x ∈ [0, 6].(Hình 5.1).
>with(plots):
>a := plot(cos(3*x+sin(3*x)), x = 0..6, coords = polar,
color = "Black", thickness = 3):
>b := coordplot(polar, [0..1, 0..2*Pi],
grid = [5, 5], color = ["Black", "Brown"]):
>display(a, b);

Ví dụ trên chỉ cần thay hệ tọa độ polar bằng hệ tọa độ elliptic


118 Chương 5. Vẽ hình trong Maple

Hình 5.1. Hệ tọa độ polar Hình 5.2. Hệ tọa độ elliptic


và đồ thị trong polar và đồ thị trong elliptic

ta có hình 5.2. Một hàm số có thể vẽ trong các hệ đồ thị khác nhau
trong Maple và thấy rằng những hình ảnh khác nhau của cùng một
hàm số.

Ví dụ 5.5. Vẽ đồ thị hàm số cos( x + x ∗ cos( x )) trên các hệ trục tọa


độ đã liệt kê ở trên (Hình 5.3). Cùng một hàm số ở hệ tọa độ khác
nhau sẽ có hình dáng khác nhau. Ta thấy với cách nhìn khác nhau
thông qua hệ tọa độ thấy hình ảnh của nó rất phong phú và khác xa
với hệ tọa độ mà chúng ta thường dùng.
>with(plots):
>s := array(1..4, 1..4): t := s:
s[1, 1] := cartesian: s[1, 2] := bipolar:
s[1, 3] := cardioid: s[1, 4] := cassinian:
s[2, 1] := elliptic: s[2, 2] := hyperbolic:
s[2, 3] := invcassinian: s[2, 4] := invelliptic:
s[3, 1] := logarithmic: s[3, 2] := logcosh:
s[3, 3] := maxwell: s[3, 4] := parabolic:
s[4, 1] := polar: s[4, 2] := rose:
s[4, 3] := tangent: s[4, 4] := cartesian:
for i from 1 to 4 do
for j from 1 to 4 do
t[i, j] := plot(cos(x+x*cos(x)), x = -6..6,axes=none,
color = "Black", coords = s[i, j]):
end do:
end do:
>display(t, thickness = 3);
5.2. Hàm vẽ đồ thị trong không gian hai chiều 119

Bảng 5.3. Đồ thị hàm cos( x + x cos x ) trong các hệ tọa độ


cartesian bipolar cardioid cassinian

elliptic hyperbolic invcassinian invelliptic

logarithmic logcosh maxwell parabolic

polar rose tangent cartesian

5.2. Hàm vẽ đồ thị trong không gian hai chiều


Trong Maple hàm plot vẽ đồ thị của một hay nhiều hàm số. Công
thức chung để vẽ đồ thị là
>plot(<Biểu thức>,<Biến>=<Khoảng biến thiên>,<Dãy tùy chọn>);

5.2.1. Hoạt động của hàm plot


Maple tính toán tốt nhất (phụ thuộc vào độ phân giải màn
hình máy tính) để chia <Khoảng biến thiên> thành hữu hạn
điểm, Maple tính giá trị của <Biểu thức> tại những điểm trong
120 Chương 5. Vẽ hình trong Maple

<Khoảng biến thiên>. Sau đó Maple lại chia nhỏ khoảng hai điểm
đã chia và tính giá trị <Biểu thức> và vẽ điểm, cứ tiếp tục như vậy
cho đến hai điểm được chia gần nhau tới một giá trị đã cho. Cách vẽ
hình như thế này gọi là kỹ thuật in cập nhật điểm. Vì số lượng vị trí
của các điểm tạo ra đồ thị phụ thuộc vào thông tin đã có như số điểm
chia khoảng biến thiên, nên kỹ thuật vẽ này đưa ra đồ thị với chất
lượng khác nhau.
Trước khi vẽ đồ thị chúng ta có thể thay đổi danh sách các điểm
tính đoạn con hay nói cách khác là định dạng lại cách vẽ đồ thị.
Maple thực hiện định dạng cách vẽ bằng <Dãy tùy chọn> cho plot.
Do độ phân giải màn hình của máy tính khác nhau, ta dùng tùy chọn
này để đồ thị vẽ ra đẹp và chính xác hơn.

Bảng 5.4. Các tùy chọn cho hàm plot.


Tùy chọn Công dụng
title=’plot title’ Xác định tiêu đề ghi trên phía trên của đồ
thị

xtickmarks = n Trục X vẽ ít nhất n vạch, n là số nguyên


lớn hơn 1. Maple tính toán thích hợp với
độ phân giải màn hình, nhiều khi thấy số
vạch nhiều hơn khi ta đặt. Nếu chọn n số
quá lớn thì những vạch trên trục bị đè lên
nhau.

ytickmarks = n Trục Y vẽ ít nhất n vạch. Tương tự như


phần trên về độ phân giải màn hình.

Lựa chọn style = point thì đồ thị vẽ


style = point line bằng các điểm,không lối giữa các điểm.
style = line nối các điểm trên đồ thị
bằng các đường thẳng.
numpoints = n Xác định số điểm tối thiểu để vẽ đồ thị
theo kỹ thuật vẽ cập nhật. Giá trị mặc định
là 25 hoặc 49.
resolution = n Thông báo cho plot độ phân giải trên trục
hoành là n điểm. Giá trị mặc định là 200.
5.2. Hàm vẽ đồ thị trong không gian hai chiều 121

coords = polar Vẽ đồ thị trên tọa độ cực. Tùy chọn hệ tọa


độ.

5.2.2. Vẽ đồ thị từ danh sách giá trị số


I. Vẽ đồ thị của danh sách điểm

>plot( [[x1, y1], [x2, y2],..., [xn, yn]],<Tùy chọn>);


>plot( [x1, y1, x2, y2,..., xn, yn,], <tùy chọn>);
II. Vẽ đồ thị của tập danh sách các điểm.

>plot({list1, list2,...,listn}, <Tùy chọn>);


Công thức này dùng vẽ đồ thị cho bởi tập hợp các điểm tọa độ đã
cho (x,y). Tập hợp điểm được đưa vào một danh sách liệt kê lần lượt
từ điểm đầu đến điểm cuối. Có thể cho danh sách điểm gồm danh
sách con các hệ tọa độ như công thức đầu tiên. Tùy chọn của các
công thức trên cũng như bảng 5.4 nên ta cũng có thể điều chỉnh đồ
thị bằng style=line hoặc style=point.

Ví dụ 5.6. Đồ thị của các điểm (3,0),(0,1),(1,1),(2,2),(1,2),(2,3) và


(3,2) nối bằng đường thẳng. (Hình 5.3).
>plot([[3, 0], [0, 1], [1, 1], [2, 2], [1, 2], [2, 3],
[3, 2]], style = line, thickness = 3);

Hình 5.3. Đồ thị danh sách điểm Hình 5.4. Đồ thị giao động tắt dần

1 √
Ví dụ 5.7. Đồ thị giao động tắt dần √20 e− 20 t sin 399 t. (Hình 5.4).
399 20

>disp:=20*exp(-(1/20)*t)*sin((1/20)*399^(1/2)*t)/(399^(1/2));
>plot(disp, t =0 ..80);
122 Chương 5. Vẽ hình trong Maple

5.2.3. Vẽ đồ thị với tiêu đề, chấm điểm và đoạn thẳng


Theo bảng tùy chọn trên chúng ta có thể chủ động vẽ đồ thị có
tiêu đề, hay chỉ các đường chấm điểm.

Ví dụ 5.8. Vẽ Parabola, sử dụng hàm plot với tùy chọn


title=Parabol.(Hình 5.5).
>plot({y, y^2, y = -10 .. 10}, title = Parabol);

Hình 5.5. Đồ thị parabol Hình 5.6. Đồ thị với style=point

Ví dụ 5.9. Sử dụng style=point. (Hình 5.6)


>plot({x-(1/6)*x^3+(1/120)*x^5,sin(x)},x=-4..4,style=point);

Ví dụ 5.10. Đồ thị sử dụng giá trị mặc định numpoints (Hình 5.7).
>plot(sum((-1)^i*abs(x-(1/10)*i), i=0..30), x = -1..4);

Hình 5.7. Đồ thị với giá trị mặc định của numpoints

5.2.4. Điều chỉnh khoảng biến thiên giữa hai trục

>plot(<Biểu thức>,<Biến>=<KBT trục hoành>);


>plot(<Biểu thức>, <Khoảng biến thiên trục hoành>);
>plot(<Biểu thức>,<KBT trục hoành>,<KBTtrục tung>);
>plot(<Tập biểu thức>,<Biến>=<KBT trục hoành>);
5.2. Hàm vẽ đồ thị trong không gian hai chiều 123

Hàm plot vẽ đồ thị của <Biểu thức> dựa vào độ biến thiên của
<Biến> trong khoảng biến thiên. Nếu ta xác định hai khoảng biến
thiên cho hàm plot thì khoảng biến thiên thứ nhất cho trục hoành
còn khoảng biến thiên thứ hai cho trục tung. Nếu muốn vẽ đồ thị
của nhiều hàm trên cùng một trục tọa độ thì đưa các hàm dố vào
<Tập biểu thức> ở tham số thứ nhất của hàm plot.
 
1 −x
Ví dụ 5.11. Đồ thị sin e trong khoảng [0.15, 1.15] (Hình 5.8).
x
>plot(sin(1/x)*exp(-x), x = .15 .. 1.15);

Hình 5.8. Đồ thị trong Hình 5.9. Vẽ hai đồ thị trên một
khoảng hẹp hệ tọa độ

Ví dụ 5.12. Hai hàm sin x; x − 16 x3 + 1 5



120 x trên cùng một tọa độ
(Hình 5.9) .
>plot({x-(1/6)*x^3+(1/120)*x^5,sin(x)},x=-4..4);
sin x
Ví dụ 5.13. Vẽ đồ thị hàm đặc biệt y = trong khoảng
x
[0, ∞].(Hình 5.10)
>plot(sin(x)/x, x = 0..infinity, numpoints = 200);

Ví dụ 5.14. Rất nhiều tùy chọn thể hiện các đồ thị trên hệ tọa độ,
cần thiết ta tra trong trợ giúp của Maple.(Hình 5.11).
plot([sin, cos], -Pi .. Pi, title = "Hàm số lượng giác",
legend=["Hàm sine","Hàm cosine"],titlefont=["ROMAN",20],
labels=["Giá trị x","Giá trị y"],labelfont=["ROMAN",12],
labeldirections=["horizontal","vertical"], locatio =right],
linestyle=[solid, longdash],axesfont=["ROMAN","ROMAN",8],
legendstyle = [font = ["ROMAN", 10], thickness = 3);
124 Chương 5. Vẽ hình trong Maple

Hình 5.10. Đồ thị hàm đặc Hình 5.11. Đồ thị các hàm cos x và
biệt y = sin x/x sin x với nhiều tùy chọn

5.2.5. Vẽ đồ thị theo tham số


Trong mặt phẳng ta có thể vẽ đồ thị với tham số. Mỗi điểm (x,y)
được xác định theo một thông số trong một khoảng biến thiên cho
trước. Công thức vẽ như sau
plot([<x-biểu thức>,<y-biểu thức>,<ts= khoảng xác định >]);
plot( [<x-biểu thức>, <y-biểu thức>,<ts= khoảng xác định >],
<khoảng hoành độ>,<khoảng tung độ>,<tùy chọn>);
plot({[<thông số 1>],[<thông số 2>],...,[<thông số n>]});
Tùy chọn vẫn như Bảng 5.4, công thức thứ ba vẽ đồ thị thông qua
nhiều thông số.
Ví dụ 5.15. Vẽ đồ thị theo t: x = t cos 5t, y = t sin 5t − t.
>plot([t*cos(5*t), sin(5*t)*t-t, t = 0 .. 2*Pi]);

Ví dụ 5.16. Vẽ đồ thị hàm số bằng thông số: x = sin 3t, y = cos 5t.
>plot([sin(3*t), cos(5*t), t = 0 .. 2*Pi], axes = frame);
Xem hình 5.13.

5.3. Hàm polarplot vẽ đồ thị trong tọa độ cực


Tọa độ điểm ( x, y) trong Hệ tọa độ Đề các và điểm (r, ϕ) trong
Hệ tọa độ cực liên hệ với nhau bằng quan hệ: x = r cos ϕ, y = r sin ϕ
(−π ≤ ϕ ≤ π). Đại lượng r và ϕ tương ứng gọi là bán kính vectơ
và góc cực. Để dựng đồ thị trong tọa độ cực có hai khả năng: Hoặc
dùng plot với tùy chọn coord=polar hoặc dùng trực tiếp polarplot.
Tùy chọn của các lệnh trên thêm tính chất cho đồ thị.
5.3. Hàm polarplot vẽ đồ thị trong tọa độ cực 125

Hình 5.12. Vẽ đồ thị theo Hình 5.13. Vẽ đồ thị theo


thông số t thông số lượng giác

I. Đồ thị tọa độ cực


>with(plots, polarplot);
>polarplot(<r ( ϕ)>,<ϕ = ϕ1..ϕ2>,<Tùy chọn>);
Đối số r ( ϕ) có thể là biểu thức bất kỳ một ẩn trong Maple theo ϕ.
Đưa vào r ( ϕ) có thể là một danh sách, hàm số hoặc một quy trình.
Lệnh trong phần này vẽ đồ thị r ( ϕ) (ϕ1 ≤ ϕ ≤ ϕ2) trong tọa độ cực.
Nếu không cho góc ϕ thì Maple lấy giá trị −π ≤ ϕ ≤ π.
II. Vẽ đồ thị trong tọa độ cực rút gọn
>polarplot(<r>,<ϕ1..ϕ2>,<Tùy chọn>);
Đối số r là danh sách, hàm số hoặc quá trình.Đồ thị trong tọa
độ cực cửa r trong khoảng ϕ1..ϕ2. Mặc định khoảng xác định này là
−π..π.
III. Vẽ nhiều đồ thị trong tọa độ cực thông số
>polarplot(<r (t)>ϕ(t),<t = a..b>,<Tùy chọn>);
Đối số r (t) và ϕ(t) là biểu thức bất kỳ thông số t, còn a và b biểu
thức giá trị số. Ta cũng có thể xác định tiêu đề, kiểu đồ thị,.. cho đồ
thị trong tọa độ cực bằng các giá trị của tham số <tùy chọn> trong
bảng 5.4.
Tạo độ cực thường được dùng vẽ các đường cong thuận tiện hơn
khi người ta dùng tọa độ bình thường.
Ví dụ 5.17. Vẽ đường tròn đơn vị trên hai hệ tọa độ
>plot([sin(t),cos(t),t=0..2*Pi]);
>plots[polarplot](1);
Xem hình 5.14, hình 5.15
126 Chương 5. Vẽ hình trong Maple

Hình 5.14. Đường tròn đơn Hình 5.15. Đường tròn đơn
vị trên hệ tọa độ Đề các vị trên hệ tọa độ cực

Ví dụ 5.18. Vẽ đồ thị trong tọa độ cực những hàm sau đây có áp dụng
p
các cách vẽ ở trên. f ( x ) = | x | cos 2x; g( x ) = 10 sin(sin 3x + x cos x.
(Hình 5.16; 5.17; 5.18 )
>with(plots): s := array(1..3): setoptions(color = "Black"):
fa := x -> sqrt(abs(x))*cos(2*x):
s[1] := polarplot(10*sin(sin(3*x)+x*cos(x))):
s[2] := polarplot(5*fa, -Pi..Pi):
s[3] := polarplot([x, fa(x), x = -2*Pi..2*Pi]):
>display(s, thickness = 2);

Hình 5.16. Hệ tọa độ Hình 5.17. Hệ tọa độ Hình 5.18. Hệ tọa độ


cartesian bipolar polar

Ví dụ 5.19. Sử dụng hàm polarplot vẽ đồ thị hai hàm sin(t) và


cos(t) với tùy chọn title= Demo.(Hình 5.19).
>with(plots, polarplot);
>polarplot({cos(t)^2,sin(t)^5},t=0..2*Pi,title=’Demo’);
5.4. Ánh xạ bảo giác 127

Hình 5.19. Vẽ đồ thị theo Hình 5.20. Vẽ đồ thị theo


tọa độ cực nhiều hàm tọa độ cực hàm t2

Ví dụ 5.20. Vẽ đồ thị tọa độ cực dạng III. (Hình 5.20).


>plots[polarplot](t^2);

5.4. Ánh xạ bảo giác


with(plot, conformal);
conformal(f);
conformal(f, z = c1..c2 );
conformal(f, z = c1..c2,<tùy chọn>);
Hàm conformal vẽ đồ thị hàm số phức. Hàm f chứa biến số
phức z. conformal tính các giá trị của hàm f thông qua các giá trị
số phức z. Đồ thị biểu diễn số phức bao gồm một phần thực và một
phần ảo. Vẽ giá trị số phức sử dụng phần số thực trên trục hoành và
phần số phức trên trục tung.
Hàm conformal vẽ đồ thị của hàm số phức với tham số z được
tạo ra bởi các gía trị nằm trên một lưới những đường thẳng cách đều
nhau trong mặt phẳng phức, mặc định conformal sử dụng loại lưới
có kích thước 11*11. Lưới này có góc dưới bên trái ứng với z = 0 và
góc trên bên phải ứng với z = 1 + i. Ví dụ sau thể hiện hàm bảo giác
của z2 . Đây là đồ thị kết quả tính z2 tại những điểm mắt lưới hình
chữ nhật của giá trị phức.
Hàm conformal dạng ba có các tùy chọn trong Bảng 5.5, cùng
với các tùy chọn được trình bày trong bảng sau:
128 Chương 5. Vẽ hình trong Maple

Bảng 5.5. Các tùy chọn khác cho hàm conformal.


<Tùy chọn> Tác dụng
d1..d2 Xác đinh kích cỡ khung chữ nhật bao quanh
mặt phẳng phức. Hình chữ nhật bao quanh
đồ thị là từ góc dưới trái −3 − 3i đến góc trên
phải 3 + 3i.
grid = [m, n] Chọn giao điểm của lưới với chiều ngang m và
chiều đứng n đường thẳng. Mặc định là 11 ×
11.
numxy = [i, j] i là những điểm được lựa chọn cho đường
thẳng đứng j là những điểm được lựa chọn
cho đường thẳng ngang. Giá trị mặc định là
21 điểm mỗi loại.

Ví dụ 5.21. Đồ thị của ánh xạ bảo giác với các tùy chọn.
>conformal(1/z, z = -1-I .. 1+I, -6-6*I .. 6+6*I,
color = magenta, numxy = [80, 80]);
>conformal((z-I)/(z+I),z = -3-3*I ..3+3*I,-4-4*I ..4+4*I,
grid = [30, 30], style = line);

1 z−i
Hình 5.21. Đồ thị hàm số . Hình 5.22. Đồ thị hàm số
z z+i

5.5. Một số lệnh khác vẽ đồ thị trên mặt phẳng


Lệnh vẽ đồ thị từ danh sách điểm.

>listplot([[x1, y1], [x2, y2],..., [xn, yn]],<Tùy chọn>);


>listplot([y1, y2, ..., yn], <Tùy chọn>);
5.5. Một số lệnh khác vẽ đồ thị trên mặt phẳng 129

Lệnh nối điểm liên tiếp và <Tùy chọn> như các lệnh vẽ đồ thị khác.
>pointplot([[x1, y1], [x2, y2],..., [xn, yn]],<Tùy chọn>);
>pointplot([y1, y2, ..., yn], <Tùy chọn>);
Lệnh có thể chấm điểm nhưng không nối nếu không đưa tùy chọn
connect = true.
Ví dụ 5.22. Sử dụng lệnh chấm điểm và nối các điểm.

with(plots):
lis := [[1, 6], [3, 4], [5, 2], [7, 4],[8, 1],
[9, 3],[10, 5],[11,1]]:
s := Vector[row](1..2):
s[2] := pointplot(lis, symbolsize = 30,symbol = solidcircle,):
r := listplot(lis, thickness = 3):
s[1] := display(s[2], r):
display(s, axesfont = [TIMES, bold, 8]);

Hình 5.23. Dùng lệnh listplot. Hình 5.24. Dùng lệnh pointplot

polygonplot([[x1, y1], [x2, y2],..., [xn, yn]], <Tùy chọn>);


polygonplot([li1, li2, ...], <Tùy chọn>);
Những lệnh này như các lệnh trên nhưng nối tạo thành đa giác.
Ví dụ 5.23. Vẽ hình đa giác đều có đỉnh nằm trên đường tròn và tô
màu bên trong (Hình 5.25).
>with(plots):
>t := array(1..2):
poly:= (n)->[seq([cos(2*Pi*k/n), sin(2*Pi*k/n)],k=1..n)]:
p := polygonplot(poly(8), color = "Gray"):
q := polygonplot(2*poly(8), color = "Yellow"):
a := polygonplot(poly(200), color = "Gray"):
b := polygonplot(2*poly(200), color = "Yellow"):
130 Chương 5. Vẽ hình trong Maple

Hình 5.25. Nối 8 điểm trên Hình 5.26. Nối 200 điểm
đường tròn. trên đường tròn.

t[1] := display(p, q):


t[2] := display(a, b):
>display(t, thickness = 2);

5.6. Đồ thị trong không gian ba chiều


5.6.1. Hệ tọa độ trong không gian ba chiều
Maple có các hệ tọa độ: bipolarcylindrical, bispherical, car-
dioidal, cardioidcylindrical, casscylindrical, confocalellip, confocal-
parab, conical, cylindrical, ellcylindrical, ellipsoidal, hypercylindri-
cal, invcasscylindrical, invellcylindrical, invoblspheroidal, invpro-
spheroidal, logcoshcylindrical, logcylindrical, maxwellcylindrical,
oblatespheroidal, paraboloidal, paraboloidal2, paracylindrical, pro-
latespheroidal, rectangular, rosecylindrical, sixsphere, spherical,
tangentcylindrical, tangentsphere, và toroidal.
Chuyển đổi những hệ tọa độ khác nhau về tọa độ Đề các trong
không gian ba chiều. Tọa độ Đề các ( x, y, z) nhận được từ tọa độ
(u, v, w) của các hệ khác. Ký hiệu (u, v, w) → ( x, y, z).
Sau đây là một số ví dụ công thức chuyển đổi, còn đầy đủ sự
chuyển đổi xem ở trợ giúp của Maple.
• bipolarcylindrical • ellcylindrical
a sinh(v)
x= x = a cosh(u) cos(v)
cosh(v) − cos(u)
a sin(u)
y= y = a sinh(u) sin(v)
cosh(v) − cos(u)
z = w. z=w
5.6. Đồ thị trong không gian ba chiều 131

Lệnh đổi hệ tọa độ changecoords vẫn còn đúng với với số biến là
3. Giống như trường hợp 2 chiều, ta cũng có thể tìm ra công thức
biến đổi các hệ tọa độ 3 chiều vaề hệ tọa độ Đề các.

Ví dụ 5.24. A. Chuyển đổi một biểu thức 3 biến


>changecoords(x*y*z,[x,y,z], bipolarcylindrical);

sinh (y) sin ( x ) z


(cosh (y) − cos ( x ))2

B. Tìm công thức chuyển hệ tọa độ về hệ tọa độ Đề các.


>changecoords([x,y, z],[x,y,z],spherical,[r,theta,phi]);

[r sin(φ) cos(θ ), r sin(φ) sin(θ ), r cos(φ)]

Trong Maple có lệnh vẽ không gian ba chiều với những mặt hệ


tọa độ và lưới trong hệ tọa độ này.

>coordplot3d(<Hệ tọa độ>);


>coordplot3d(<Hệ tọa độ>, <Tùy chọn>);

• [a..b, c..d, e..f] với a, b, c, d, e, f là các số thực. Hoàn toàn


tương tự như trong hệ tọa độ hai chiều với tọa độ Đề các, ta có
R = {( x, y, z) : a ≤ x ≤ b, c ≤ y ≤ d, e ≤ z ≤ f } và tọa độ lưới là các
bộ ba số. Lưới tọa độ cũng xác định bới các mặt phẳng đồng mức.
Không có tùy chọn thì a = c = e = −2, b = d = f = 2
• [li1, li2, li3], là các danh sách trên các trục tọa đô li1 =
[ x1 , x2 , . . . , xn ], li2 = [y1 , y2 , . . . , ym ] li3 = [z1 , z2 , . . . , z p ].
• color = [c1, c2, c3], với c1, c2, c3 tên màu xác định màu
trên trục tọa độ và các mặt phẳng mức. Ví dụ color =
[”Red”, ”Green”, ”Blue”];.
• grid = [n, m], với n và m là các số nguyên dương. Nó xác định số
lượng mặt phẳng mức trong miền xác định.
• labelling = ty, với ty ∈ { f alse, true, [u, v, w]}.
• style = α, với α ∈ {hidden(wire f rameopaque), sur f ace,
sur f acewire f rame, contour, sur f acecontour, wire f rame, point}.
• view = [p1..p2, q1..q2, r1..r2], với đặt hình trong miền xác
định mới.
132 Chương 5. Vẽ hình trong Maple

Ví dụ 5.25. In ra mặt của các hệ tọa độ trong không gian ba chiều.


with(plots):
s := array(1..3, [rectangular, cylindrical, spherical]):
for j in [1, 2, 3] do
coordplot3d(s[j], title = s[j], thickness = 3,
grid = [6, 8], color = ["Red", "Black", "Blue"])
end do;

Hình 5.27. Hệ tọa độ Hình 5.28. Hệ tọa độ Hình 5.29. Hệ tọa độ


rectangular cylindrical spherical

Xem hình 5.27, 5.28, 5.29 các mặt của những hệ tọa độ khác
nhau.

5.6.2. Lệnh vẽ hình ba chiều bằng plot3d


Vẽ đồ thị hàm f trong không gian ba chiều.

>plot3d(f, biến1 = a..b,biến2 = c..d );


>plot3d(f, biến1 = a..b, biến2 = c..d,<tùy chọn>);
Hàm plot3d ba dạng đầu có thể tạo ra đồ thị ba chiều của những
hàm chứa hai tham số biến1 và biến2, trong đó tham số biến1 biến
thiên trong khoảng từ a tới b còn biến2 biến thiên trong khoảng từ c
tới d. plot3d tính giá trị trên tập giá trị của biến1 và biến2. Nó chọn
giá trị này tự động từ cỡ xác định của biến1 và biến2. Giá trị mặc
định hai biến này là 25 điểm trên mỗi trục tọa độ, như vậy ta vẽ mặt
trên tổ hợp 625 = 25 × 25 cặp giá trị khác nhau.
Mỗi tổ hợp điểm trong không gian ba chiều với tọa độ tương ứng
là (giá trị biến1, giá trị biến2, giá trị f). Hai điểm được coi là cạnh
nhau nếu giá trị của biến1 như nhau và biến2 liên tiếp hoặc ngược
5.6. Đồ thị trong không gian ba chiều 133

lại. Mặc định plot3d nối các điểm cạnh nhau bằng đường thẳng.
Mặt lưới khi tạo ra bởi các đường cắt nhau có thể coi như là mặt
phẳng trong không gian ba chiều. Mặt phẳng như vậy gọi là đồ thị
do plot3d vẽ ra trong không gian ba chiều.

Ví dụ 5.26. Vẽ đồ thị của hàm số | x − y| + | x + y| trong miền giới


hạn x = −5..5, y = −5..5.(Hình 5.30)
>plot3d(abs(x-y)+abs(x+y), x = -5..5, y = -5..5,
grid = [10, 10], color = "LightGray");

Hình 5.30. Đồ thị hàm số Hình 5.31. Hai đồ thị trong


| x − y| + | x + y| không gian ba chiều.

Ví dụ 5.27. Vẽ trong hệ tọa độ Đề các trong không gian 3 chiều hai


hàm số f ( x, y) = x2 + y và g( x, y) = x + y2 trong miền dàng buộc
x = −5..5, y = −5..5.(Hình 5.31).
>f := (x, y) -> x^2+y: g:=(x, y) -> x+y^2:
>plot3d([f(x, y), g(x, y)], x = -5..5, y = -5..5,
grid = [10, 10], color = [x*y, "LightGray"]);

II. Vẽ đồ thị nhiều hàm

>plot3d(f,a..b,c..d,<tùy chọn>);
>plot3d([f1, f2, ..,fk],a..b,=c..d,<tùy chọn>);
Các f , f 1, f 2, ..., f k là các hàm, dang sách điểm, một thủ tục vẽ
hình. Các biến ràng buộc bởi các số a, b và c, d
p
Ví dụ 5.28. Vẽ đồ thị của hàm số | xy| cos( xy) trong miền ràng
buộc x = −3..3, y = −3..3. (Hình 5.32).
134 Chương 5. Vẽ hình trong Maple

>h := (x, y) -> sqrt(abs(x*y))*cos(x*y):


>plot3d(h, -3..3, -3..3, color = "green",
orientation = [17, 33], grid = [15, 15]);

Hình 5.32. Đồ thị với miền xác Hình 5.33. Đa đồ thị trên một
định ẩn hệ tọa độ.

p
Ví dụ 5.29. Vẽ đồ thị của hàm số | xy| cos( xy) trong miền ràng
buộc x = −3..3, y = −3..3.(Hình 5.33).
>h := (x, y) -> sqrt(abs(x*y))*cos(x*y):
>plot3d(h, -3..3, -3..3, color = "green",
orientation = [17, 33], grid = [15, 15]);

5.6.3. Tùy chọn của lệnh plot3d


Có rất nhiều tùy chọn để vẽ mặt phẳng của hàm plot3d như
trong trường hợp hai chiều. Các giá trị <tùy chọn> của hàm plot3d
trong công thức cuối như sau .

Bảng 5.6. Những tùy chọn cho plot3d


Tùy chọn Công dụng
title = plot title Xác định tiêu đề ghi trên phía trên của đồ
thị
scaling = un- unconstrained tự điều chỉnh độ chia các
constrained, con- trục tọa độ để hình vẽ thể hiện ra màn
strained hình tốt nhất.
constrained đồ thị vẽ với trục có độ chia
nguyên bản.Giá trị mặc định là uncon-
strained
5.6. Đồ thị trong không gian ba chiều 135

projection = r 0 < r < 1 giá trị mặc định là r =


1. projection=1 góc chiếu vuông projec-
tion=0 góc nhìn rộng nhất.
view=zmin..zmax Thiết lập khung nhìn cho hệ tọa
[xmin..xmax,ymin.. độ, mặc định view nhận giá trị:
ymax,zmin..zmax] [xmin..xmax,ymin..ymax,zmin..zmax]
có nghĩa là vẽ toàn bộ mặt màn hình.
orientation = [θ, φ] Xác định góc nhìn cho hệ tọa độ.
Mặc định q=45 và Thiết lập cách thể hiện đồ thị trên hệ tọa
f=45. style = point, độ. Đồ thị vẽ ra như các điểm (point), đồ thị
hidden, patch, wire- ẩn chỉ nhìn thy lưới (hidden). Các đường có
frame mầu (patch), đồ thị có cả đường lưới (wire-
frame)
shading =XYZ, XY, Thiết lập kiểu hiển thị cho hệ tọa độ bằng
Z màu hoặc đậm nhạt theo XYZ hoặc XY
hoặc theo Z.
axes = boxed, nor- normal trục tọa độ qui định là mặt phẳng
mal, frame, none ngang có trục x, y còn phía trên mặt phẳng
là z. boxed đồ thị được đưa vào hộp. frame
đồ thị đưa vào khung có chia du tỷ lệ.
không có khung hệ tọa độ là none, đây là
giá trị mặc định.
grid = [ m, n ] Mặt được tạo bởi một lưới hình chữ nhật có
kích cỡ m * n. Giá trị mặc định là 25*25
numpoints = n Xác định số điểm cho lưới để biểu diễn đồ
thị.
coords = cartesian, Xác định hệ tọa độ để biểu diễn đồ thị. Mặc
spherical, cylindri- định là hệ tọa độ Đềcác (coords = carte-
cal, sian).

5.6.4. Ví dụ cho plot3d với tùy chọn


Ví dụ 5.30. Ví dụ sau mô tả sự khác biệt khi sử dụng tùy chọn
scaling cho plot3d.
A.Giá trị mặc định của scaling = unconstrained.(Hình 5.34).
>plot3d(sin(x^2+y^2), x = -5 .. 5, y = -5 .. 5);
136 Chương 5. Vẽ hình trong Maple

Hình 5.34. Tùy chọn scaling = Hình 5.35. Tùy chọn scaling =
unconstrained constrained

B. Thiết lập giá trị scaling = constrained.(Hình 5.35).


>plot3d(sin(x^2+y^2), x = -5 .. 5, y = -5 .. 5,
scaling = constrained);

Ví dụ 5.31. Miêu tả sự khác biệt của đồ thị sử dụng tùy chọn view.
A. View toàn bộ mặt - Đây là giá trị mặc định trong Maple.(Hình
5.36).
>plot3d(1/(x^2+y^2+0.1e-1), x = -.5 .. .5, y = -.5 .. .5,
axes = box, orientation = [106, 75], style = patch)

Hình 5.36. plot3d tùy chọn Hình 5.37. plot3d tùy chọn
axes = box view=0..40

B. Thiết lập khung view = 0..40.(Hình 5.37).


>plot3d(1/(x^2+y^2+0.1e-1), x = -.5 .. .5, y = -.5 .. .5,
axes = box,orientation=[106,75],style=patch,view=0..40);

Ví dụ 5.32. Miêu tả sự khác biệt của biểu đồ khi sử dụng tùy chọn
A. style = point (Hình 5.38).
5.6. Đồ thị trong không gian ba chiều 137

Hình 5.38. Chọn style = point Hình 5.39. Chọn style = patch

>plot3d(y^2*sin(x)+x^2*cos(y),x=-3*Pi..3*Pi,y=-3*Pi..3*Pi,
grid=[59, 59], axes=framed,style=point);
B. style = patch.(Hình 5.39).
>plot3d(y^2*sin(x)+x^2*cos(y),x=-3*Pi..3*Pi,y=-3*Pi..3*Pi,
grid=[59, 59], axes=framed,style=patch);
C. style = wireframe.(Hình 5.40).
>plot3d(y^2*sin(x)+x^2*cos(y),x=-3*Pi..3*Pi,y=-3*Pi..3*Pi,
grid=[59, 59], axes=framed,style=wireframe);

Hình 5.40. Tùy chọn style = Hình 5.41. Chọn style = hid-
wireframe den

D. style = hidden.(Hình 5.41).


>plot3d(y^2*sin(x)+x^2*cos(y),x=-3*Pi..3*Pi,y=-3*Pi..3*Pi,
grid=[59, 59], axes=framed,style=hidden);

Ví dụ 5.33. Miêu tả khác biệt của đồ thị khi sử dụng tùy chọn axes.
A. axes = none (Hình 5.42).
>plot3d(binomial,0..5,0..5,
grid=[10,10],axes=none, orientation=[83,53]);
138 Chương 5. Vẽ hình trong Maple

Hình 5.42. plot3d tùy chọn Hình 5.43. plot3d tùy chọn
axes = none axes = frame

B. axes = frame (Hình 5.43).


>plot3d(binomial,0..5,0..5,
grid=[10,10],axes=nframe, orientation=[83,53] );
C. axes = box (Hình 5.44).
>plot3d(binomial,0..5,0..5,
grid=[10,10],axes=box, orientation=[83,53]);

Hình 5.44. plot3d tùy chọn Hình 5.45. plot3d tùy chọn
axes = box axes = normal

D. axes = normal (Hình 5.45).


>plot3d(binomial,0..5,0..5,
grid=[10,10],axes=normal, orientation=[83,53] );

Ví dụ 5.34. Biểu diễn nhiều đồ thị trên một hệ tọa độ - Sử dụng hàm
plot3d với định nghĩa 4 hàm c1, c2, c3.
>c1:= [cos(x)-2*cos(0.4*y), sin(x)-2*sin(0.4*y),y]:
>c2:= [cos(x)+2*cos(0.4*y), sin(x)+2*sin(0.4*y),y]:
>c3:= [cos(x)+2*sin(0.4*y), sin(x)-2*cos(0.4*y),y]:

Vẽ bốn đồ thị trên một tọa độ (Hình 5.46).


5.7. Các lệnh vẽ đồ thị đặc biệt trong không gian 139

>plot3d([c1, c2, c3],x=0..2*Pi, y=0..10, grid=[25,15],


color=[default,green,yellow], plotlist,axes = boxed);

Hình 5.46. Biểu diễn nhiều đồ Hình 5.47. Đồ thị hàm thông
thị trên một hệ tọa độ số

Ví dụ 5.35. Vẽ đồ thị thông số x = 2 cos s, y = 2 sin s, z = 2 cos 12s với


x ∈ [0, 2π ] (Hình 5.47).
>plot3d(2*[cos(s), sin(s), cos(12*s)], s = 0..2*Pi, t = 0..1,
axes = boxed, thickness = 2, numpoints = 15000);

5.7. Các lệnh vẽ đồ thị đặc biệt trong không gian


Ngoài những hàm chuẩn vẽ đồ thị ba chiều ở phần trước, Maple
còn cung cấp một số hàm vẽ các mặt đặc trưng trong toán học như
hình cầu, hình trụ, hình xuyến,...Các tùy chọn của các hàm này cũng
tương tự như hàm ta đã biết, chỉ có khác tên hàm. Ta hãy xem bảng
dưới đây.

plots[sphereplot](<d-biểu thức>,<q=khoảng góc1>,


<f=khoảng góc1>,<tùy chọn>);
sphereplot([<d-biểu thức>,<f-biểu thức>,<q-biểu thức>],
<biến1=độ lớn1>,<biến2= độ lớn2>,<tùy chọn>);
plots[cylinderplot](<r-biểu thức>,<q = khoảng góc>,
<z = z-độ lớn>,<tùy chọn>);
cylinderplot([<r-biểu thức>,<q-biểu thức>,<z-biểuthức>,
< biến1 = khoảng1>, <biến2 =khoảng2>,<tùy chọn>);
plots[spacecurve]([<x-biểuthức>,<y-biểuthức>,<z-biểuthức>],
<biến= khoảng>,<tùy chọn>);
plots[spacecurve](<danh sách mặt>,biến=khoảng,<tùychọn>);
plots[tubeplot](<không gian danh sách mặt>,biến=khoảng);
plots[tubeplot](<mặt không gian>,<biến=khoảng>,<tùy chọn>);
plots[pointplot]({[x1,y1,z1],..,[xn,yn, zn]},<tùy chọn>);
140 Chương 5. Vẽ hình trong Maple

plots[pointplot]([<x-biểu thức>,<y-biểuthức>,<z-biểuthức>],
<biến = khoảng>,<tùy chọn>);
Các ví dụ trình bày sau đây phân theo loại:
Plot3d, Tubeplot, Sphereplot, Cylinderplot, Pointplot.

5.7.1. Thêm tùy chọn plot3d


Ví dụ 5.36. Tùy chọn style = patchcontour cho mặt vẽ mịn
(Hình 5.48).
>with(plots);
>plot3d(sin(x+y),x =-1..1,y = -1..1,style = patchcontour,
orientation = [158, 71], axes = boxed);

Hình 5.48. plod3d tùy chọn Hình 5.49. plod3d tùy chọn góc
style = patchcontour nhìn orientation

Ví dụ 5.37. Tùy chọn orientation = [-29, 39] góc nhìn


(Hình 5.49).
>plot3d({x^2+y^2-3, x+y}, x = -Pi .. Pi, y = -Pi .. Pi,
axes = frame, orientation = [-29, 39],style = patch);

Hình 5.50. plod3d tùy chọn Hình 5.51. plod3d tùy chọn
filled = true filled = false

Ví dụ 5.38. plot3d với tùy chọn tô mặt (Hình 5.50) hoặc không tô
mặt (Hình 5.51) .
5.7. Các lệnh vẽ đồ thị đặc biệt trong không gian 141

>plot3d(1+sin(x)*cos(y), x = 0..2*Pi, y = 0..2*Pi,


axes = boxed, grid = [15, 15], axes = frame,
color = [0.9, 0.9, 0.9], filled = true);

5.7.2. Tubeplot vẽ các ống


Ví dụ 5.39. Vẽ khối rỗng
A. Các tùy chọn style = contour (Hình 5.52).
>tubeplot([cos(t), sin(t),0,t=Pi..2*Pi,radius=.25*(t-Pi)],
axes=box,contours=30,style=contour,orientation=[75, 60]);

Hình 5.52. tubeplot tùy chọn Hình 5.53. tubeplot tùy chọn
style=contour style = patch nét lưới

B. Tùy chọn style = patch (Hình 5.53).


>tubeplot([cos(t),sin(t),0],t = 0 .. 2*Pi,
radius =.5,orientation = [90, 47],style = patch);
Ví dụ 5.40. Vẽ khối rỗng

Hình 5.54. tubeplot tùy chọn Hình 5.55. tubeplot vẽ nhiều


tiêu đề hàm một lúc

A. Tùy chọn tiêu đề title = ‘Maple Tubeplot‘ (Hình 5.54).


>tubeplot([sin(t),t,cos(t)],t =0..2*Pi,radius=1.2+sin(t),
numpoints=40,style=patch,title =‘MapleV Tubeplot‘,
orientation = [-140, 61])
142 Chương 5. Vẽ hình trong Maple

B. Vẽ nhiều hàm (Hình 5.55).


>tubeplot({[0,sin(t),cos(t)],[cos(t),sin(t),0]},t = 0..2*Pi,
radius=(1/10)*t,style=patch,orientation=[43,82],shading=XY,
ambientlight = [.2, .5, .5],light = [60, 70, .6, .6, .9]);

Ví dụ 5.41. Vị trí của ba hình (Hình 5.56).


>tubeplot({[cos(t)-2,sin(t)-2,0,t=Pi..2*Pi,radius=.25*(t-Pi)],
[cos(t)+2, sin(t)+2, 0, t = Pi .. 2*Pi,radius = .25*(t-Pi)],
[cos(t), sin(t), 0, t = Pi .. 2*Pi,radius = .25*(t-Pi)]},
axes =box,style=patchcontour,orientation=[133, 69])

Hình 5.56. tubeplot chọn vị trí Hình 5.57. tubeplot vẽ bốn


của ba hình. khuyên

Ví dụ 5.42. Bốn khuyên (Hình 5.57).


>tubeplot({[cos(t)-2,sin(t)-2, 0],[cos(t)-2,sin(t)+2,0],
[cos(t)+2,sin(t)-2,0],[cos(t)+2,sin(t)+2,0]},t=0..2*Pi,
radius = .5,scaling=constrained,orientation=[90,47],
title = ‘FOUR TIRES IN.....SPACE‘);

Ví dụ 5.43. Hình đưa vào bằng hàm thông số.

Hình 5.58. tubeplot vẽ hình Hình 5.59. tubeplot vẽ đối


xoắn xứng

A. Hình xoắn (Hình 5.58).


5.7. Các lệnh vẽ đồ thị đặc biệt trong không gian 143

>tubeplot([-10*cos(t)-2*cos(5*t)+15*sin(2*t),
-15*cos(2*t)+10*sin(t)-2*sin(5*t), 10*cos(3*t)],
t=0..2*Pi,radius=3*cos((1/3)*t*Pi)+4);
B. Hình đối xứng (Hình 5.59).
>tubeplot({[0,sin(t),cos(t)],[cos(t),sin(t),0]},t=0..2*Pi,
radius = 1/4,orientation = [35, 70]);

Ví dụ 5.44. Đường soắn ốc xung quanh một đường cong


A. Ba khuyên lồng nhau (Hình 5.60).
>tubeplot({[cos(t), sin(t), 0],[0, sin(t)-1.5, cos(t)],
[0, sin(t)+1.5, cos(t)]},t = 0..2*Pi, radius = 1/6);

Hình 5.60. tubeplot vẽ ba Hình 5.61. tubeplot vẽ đường


khuyên lồng nhau xoắn

B. Đường xoán xung quanh một đường cong (Hình 5.61).


with(plots): R:= 10;
tubeplot({[cos(t)*(10+4*sin(9*t)),sin(t)*(10+4*sin(9*t)),
4*cos(9*t),t = 0 ..2*Pi,radius=1,numpoints=trunc(37.5*R),
tubepoints = R], [10*cos(t), 10*sin(t), 0, t = 0 .. 2*Pi,
radius = 2, numpoints = 10*R, tubepoints = 2*R]},
scaling = unconstrained, orientation = [77, 24]);

5.7.3. Lệnh sphereplot vẽ mặt cầu


Ví dụ 5.45. Vẽ mặt cầu
q
A. sphereplot vẽ hàm số x = 3 sin2 y − 1) với x ∈ [−π, π ] và y ∈
[0, π ] (Hình 5.62).
>sphereplot((3*sin(x)^2-1)*(1/2),x=-Pi..Pi, y =0..Pi,
orientation = [36, 32], style = patch);
144 Chương 5. Vẽ hình trong Maple

Hìnhq5.62. sphereplot vẽ hàm


Hìnhp5.63. sphereplot vẽ hàm
x = 3 sin2 y − 1) x = 5 cos2 y − 1)

p
B. sphereplot vẽ hàm số x = 5 cos2 y − 1) với x ∈ [0, 2] và y ∈
[−π, π ] (Hình 5.63).
>sphereplot((5*cos(y)^2-1)*(1/2), x=0..2*Pi, y=-Pi..Pi,
style = patch, orientation = [-158, 83]);

5.7.4. Lệnh cylinderplot vẽ ống trụ


Ví dụ 5.46. Lệnh vẽ mới (Hình 5.64).
>cylinderplot([z*theta, theta, cos(z^2)],
theta = 0 .. Pi,z = -2 .. 2, axes = box,
style=patchcontour,orientation=[45,67]);

Hình 5.64. Khối hình nón Hình 5.65. Khối tròn theo từng
cylinderplot mở nấc

Ví dụ 5.47. Hình vẽ ống hướng quay (Hình 5.65).


>cylinderplot((5*cos(y)^2-1)*(1/3),
x = -Pi .. Pi, y = 0 .. 2*Pi, orientation = [45, 80]);

5.7.5. Ví dụ về một bài toán thực tế


Ví dụ 5.48. Mô hình sóng giao thoa khi có hai viên sỏi rơi xuống
nước. Định nghĩa hàm pebbles chứa bốn tham số đặc trưng cho biên
5.8. Vẽ khối đa diện 145

độ của sóng hai chiều, tách các tâm của chúng và thời điểm chúng
được hiển thị. Ta vẽ hàm này trong không gian ba chiều tạo ra mặt
sóng giao thoa.
>pbls:=(amp1,amp2,dist, t) ->sin(t+sqrt((x-dist)^2+y^2))*
amp1/sqrt((x-dist)^2+y^2)+sin(t+sqrt((x+dist)^2+y^2))*
amp2/sqrt((x+dist)^2+y^2):
>pebbles:= proc (amp1, amp2, dist, t)
plot3d(pbls(amp1, amp2, dist, t), x = -2*dist .. 2*dist,
y=-10..4*dist-10,grid=[round(5*dist), round(5*dist)])
end:
>pebbles(1, 1, 10, 0);

Hình 5.66. Mô hình sóng giao thoa

5.8. Vẽ khối đa diện


5.8.1. Lệnh vẽ khối đa diện

>polyhedra_supported();
>polyhedraplot([x, y, z], <Tùy chọn>);
>polyhedraplot([[x1, y1, z1], [x2, y2, z2], ...,
[xn, yn, zn]], <Tùy chọn>);
Một đa diện mà tất cả các mặt của nó là những đa giác đều giống
nhau và tất cả các góc ở tất các mặt có chung đỉnh bằng nhau thì đa
diện đó gọi là đa diện đều.
Tồn tại năm dạng đa diện lồi đều: Tứ diện đều (tetrahedron, 4
mặt), Lục diện đều (hexahedron, 6 mặt), Bát diện đều (octahedron,
146 Chương 5. Vẽ hình trong Maple

8 tám mặt ), (icosahedro... dodecahedron, 12 mặt), (icosahedron, 20


mặt). Một đa diện thường được đặt tên tương ứng với số mặt nó
có, ví dụ như Ngũ diện pentahedron (5), hexahedron (6) ... Lệnh
polyhedraplot có thể vẽ đến 123 đa diện khác nhau.
• Lệnh polyhedra_supported() liết kê tên tất cả các đa diện có thể
vẽ được bằng lệnh polyhedraplot với tùy chọn polytype=....
• Lệnh polyhedraplot([x, y, z], <Tùy chọn>); vẽ ra đa diện
có tâm tại x, y, z. Thể hiện thuộc tính của khối đa diện bằng
<Tùy chọn>:
– polytype = <Tên đa diện> vẽ đa diện có <Tên đa diện>,
những tên đa diện này lấy từ lệnh trên.
– polyscale = sc điều khiển "Cỡ" của khối đa diện ta nhìn thấy.
Mặc định sc = 1.
• Lệnh verb!>polyhedraplot([[x1, y1, z1], [x2, y2, z2], . . . , [xn, yn,
zn]], <Tùy chọn>);! như lệnh phía trước, nhưng trong một hệ tọa
độ đồng thời vẽ n đa diện cùng loại với tâm ở các điểm ( xk, yk, zk )
với k = 1, 2, ...n.

Ví dụ 5.49. Vẽ tất cả các khối đa diện đều (Hình 5.7).


>restart: with(plots):
>spi := [tetrahedron, hexahedron, octahedron,
dodecahedron, icosahedron, GreatStellatedDodecahedron]:

for i from 1 to nops(spi) do


polyhedraplot([0, 0, 0], polytype =spi[i],
style = patch, scaling = constrained, title = spi[i])
end do;

Bảng 5.7. Khối đa diện đều

tetrahedron hexahedron octahedron


5.8. Vẽ khối đa diện 147

dodecahedron icosahedron GreatStellatedDodecahedron

Lệnh polyhedra_supported() đưa ra tên tất cả khối đã diện


mà Maple có, ta có thể vẽ từng khối đa diện hoăch một số khối đa
diện bằng tên của nó.

Ví dụ 5.50. Ta vẽ khối đa diện MetabiaugmentedTruncatedDodec-


ahedron (Hình 5.67) và khối đa diện echidnahedron (Hình 5.68).
>polyhedraplot([0,0,0], scaling=constrained,
polytype=MetabiaugmentedTruncatedDodecahedron);
>polyhedraplot([0,0,0],polytype=echidnahedron,
scaling=constrained);

Hình 5.67. Khối Metabiaug- Hình 5.68. Khối đa diện echid-


mentedTruncatedDodecahedron nahedron

Ta có thể xem tất cả các khối đa diện bằng cách cho hiện ra lần
lượt khối cùng với tên theo lệnh display với tùy chọn insequence.

Ví dụ 5.51. Ta vẽ ra lần lượt các khối đa diện được định nghĩa


trong lệnh polyhedra_supported(). Ta thiết kế một hàm số và thể
hiện nó trong chế độ hoạt hình đồ thị. Biến pol chức toàn bộ danh
sách khối đa diện, tạo ra mảng ma chứa cấu trúc vẽ hình của từng
khối đa diện. Say cùng dùng lệnh display với tùy chọn insequence
(Hình 5.69).
148 Chương 5. Vẽ hình trong Maple

>restart: with(plots):
>pol := polyhedra_supported():
pol := sort(convert(pol, list)):
n := nops(pol):
ma := array(1..n):
for i from 1 to n do
ma[i] := polyhedraplot([0, 0, 0], polytype = pol[i],
scaling = constrained, title = pol[i])
end do:
>display(convert(ma, list), insequence = true);

Nhấn chọn hình 5.69 thanh công


cụ hoạt hình xuất hiện. Nhấn vào
nút thực hiện hoạt hình sẽ chạy
thuật toán trên vẽ lần lượt các
khối đa diện.
Hướng dẫn sử dụng thanh công
cụ hoạt hình sẽ được trình bày ở
phần sau.
Hình 5.69. Hoạt hình danh
sách khối đa diện

5.9. Làm hoạt hình đồ thị


Phần trước ta đã sử dụng lệnh display với tùy chọn insequence
làm hoạt hình. Trong mục này ta quan tâm tới lệnh animatecurve
là quá trình hoạt hình trên những đồ thị vẽ trong hệ tọa độ hai chiều.
Lệnh animate thực hiện hoạt hình trên đồ thị 2chiều (2-D) và 3
chiều (3-D) theo số đối số và danh sách. animate3d làm hoạt hình
3-D theo số đối số và danh sách. Các lệnh này đều dùng thanh công
cụ hoạt hình của Maple để thực hiện quá trình hoạt hình. Ngoài ra
lệnh interactiveparams thực hiện hoạt hình trên một cửa sổ riêng.

5.9.1. Chức năng nút hoạt hình trên thanh công cụ


Trước khi tìm hiểu cụ thể các lệnh và ví dụ ta xét thanh công cụ
có caccs nút với chức năng sau
5.9. Làm hoạt hình đồ thị 149

Bảng 5.8. Chức năng của nút hoạt hình

Nút Chức năng


Nút dừng quá trình hoạt hình.
Bắt đầu chạy hoạt hình.
Chuyển tới ảnh kế tiếp.
Chuyển tới ảnh ngay phía trước.
Khi thực hiện hoạt hình thanh trượt sẽ chạy. Ta
dùng chuột dừng và xê dịch thanh trượt để xem
từng ảnh.
Nút chứa danh sách các nút điều khiển khác, ta có
thể chọn trong danh sách đó.
Đặt chế độ chạy từ ảnh đầu tiên liên tục đến ảnh
cuối.
Nút đặt chế độ chạy từ đầu đến cuối rồi lại từ ảnh
cuối tới ảnh đầu.
Đặt chế độ hoạt hình từ ảnh cuối cùng tới ảnh đầu
hoăc từ vị trị thanh trượt đến hình đầu tiên.
Danh sách các chức năng đặt chu trình theo ảnh.
Đặt chế độ hoạt hình một vòng.
Đặt chạy chu trình vòng tròn, chỉ dừng khi dùng
nút "dừng".
Đặt số lương ảnh chạy qua trong một dây FPS
(frames per second).
Làm thay đổi hệ tọa độ như phóng ảnh to hoặc nhỏ.
Làm di chuyển vị trí ảnh.

5.9.2. Vẽ hoạt hình trong không gian hai chiều

>animatecurve(f(x), x = a..b, <Tùy chọn>);


>animatecurve(f, a..b, <Tùy chọn>);
>animatecurve({f(x), g(x), ...}, x = a..b, <Tùy chọn>);
>animatecurve({f, g, ...}, a..b, <Tùy chọn>);
• Lệnh thứ nhất: f ( x ) là một biểu thức một biến x. Lệnh này
tạo ra một clip quá trình hoạt hình trong 2-D của f ( x ) trong
khoảng [ a, b]. Mặc định lệnh này làm 16 ảnh. Nếu tùy chọn có
150 Chương 5. Vẽ hình trong Maple

frames = n thì lệnh này tạo ta n ảnh (n là số nguyên bất kỳ).


Những tùy chọn khác của animatecurve giống như lệnh plot.
Còn vận tốc chạy ảnh FPS (frame per second) có thể thiết lập
trong khoảng từ 1 đến 75.
• Lệnh thứ hai: f có thể là một hàm số, một quy trình hoặc toán tử
hàm. Hàm số và quy trình ở đây bắt buộc phải có một biến.
• Lệnh thứ ba và thứ tư: Tương tự như lệnh thứ nhất nhưng làm
hoạt hình nhiều hàm một lúc.

Ví dụ 5.52. Vẽ hoạt hình hàm f ( x ) = 2x sin x và f ( x + 0.2), f ( x + 0.4)


với khung 50 ảnh (Hình 5.70).
>with(plots):
>f := x -> 2*x*sin(x):
>animatecurve({f(x), f(x+0.2), f(x+0.4)}, x = -Pi..Pi,
frames = 50, thickness = 2, color = "Black");

Hình 5.70. Vẽ hoạt hình với khung Hình 5.71. Vẽ hoạt hình hàm
50 ảnh có thông số

Ví dụ 5.53. Vẽ hoạt hình một hàm bằng thông số (Hình 5.71).


>f := t -> t^2*cos(3*t): g := t -> log(t+5):
>animatecurve([f, g, 0..Pi],color="Black",thickness = 2);

5.9.3. Vẽ hoạt hình trong không gian hai và ba chiều

>animate(graphproc, [args, opts], t = a..b, <Tùy chọn>);


>animate(graphproc,[args, opts],t=[t1,t2, ...],<Tùy chọn>);

Lệnh làm hoạt hình trong không gian 2 hoặc 3 chiều thông qua
lệnh vẽ đồ thị graphproc mà nó này có đối số args và tùy chọn opts
hoặc <Tùy chọn>. Thủ tục graphproc người ta hay dùng là plot,
plot3d, implicitplot, spacecurve,... Các ảnh làm hoạt hình phụ
5.9. Làm hoạt hình đồ thị 151

thuộc vào biến t thay đổi trong khoảng [ a, b]. Làm hoạt hình có thể
bằng một số hàm số. Tùy chọn có frame, trace, paraminfo, digits,
background:
• frame=n số lượng ảnh được tạo ra bằng n. Mặc định là n = 25.
• trace=m không có tùy chọn này hoặc m = 0 mỗi ảnh được thay
bằng ảnh mới và xóa ảnh trước đó. Nếu m > 0 thì một số ảnh
không xóa đi mà vẫn còn nhìn thấy khi ảnh mới xuất hiện.
• paraminfo=α, ở đây α ∈ {true, f alse}. Mặc định hiện lên phía trên
ảnh thông tin thông số t = giá trị.
• digits=n với n là số nguyên. Tùy chọn lấy số thập phân sau dấu
phẩy để tính toán. Mặc định n = 5.
• background=p với p ∈ {nu, plot(...), plot3d(...), ...)}.
Lệnh thứ hai ở trên với t có giá trị t1, t2, ...

Ví dụ 5.54. Làm hoạt hình đồ thị x sin x + a trên khoảng [0, 2π ] với
a biến đổi trong [2, 2]. (Hình 5.72).
Ta đưa thêm vào hệ tọa độ hai đồ thị hám số y = 1 và y = −1. Dùng
mặc định 25 hình và trace = 2.
>with(plots):
>p := plot([1, -1], x = 0..2*Pi, color = "Black"):
animate(plot, [x*sin(x)+a, x = 0..2*Pi], a = -2..2,
thickness = 2, background = p, trace = 2);

Hình 5.72. Vẽ hoạt hình đồ thị Hình 5.73. Vẽ hoạt hình đồ thị
chuyển động lên. chuyển động tròn

Ví dụ 5.55. Lập đoạn chương trình dùng hàm hoạt hình điều khiển
một hình tròn nhỏ có tâm chạy trên một đường tròn (Hình 5.73).
152 Chương 5. Vẽ hình trong Maple

Điểm xuất phát chuyển động và điểm cuối trùng nhau, ta có thể
thiết lập trên thanh công cụ cho đường tròn chuyển động vô hạn
vòng. Để thực hiện được mục đích ta dùng công cụ sau:
• Dùng gói lệnh plots và plottools.
• Dùng lệnh polarplot để vẽ hình tròn nhỏ chuyển động trong hệ tọa
độ cực.
• Dùng lệnh disk vẽ hình tròn nhỏ mầu đỏ ở tâm hệ tọa độ cực.
• Dùng display hiện hai hình tròn xuất phát và trong một thủ tục
tác động bởi lệnh hoạt hình animate.
>restart: with(plots): with(plottools):
r := 6: r1 := 1:
setoptions(scaling = constrained):
ba1:= polarplot(r,t = 0..2*Pi, color="Black", thickness=2):
ba2:= disk([0, 0], r1, color = "Red"):
back := display(ba1, ba2):
di:=proc(x, y, a) display(disk([x, y],a,color="Blue"))end:
>animate(di, [r*sin(t), r*cos(t), r1],
t = 0..2*Pi, frames = 100, background = back);
Ví dụ 5.56. Hãy làm hoạt hình theo thông số t ∈ [−1, 1] trong hàm
số
2 2
z( x, y) = 4te− x −y
xác định trong miền R = {( x, y) : −2 ≤ x ≤ 2, −2 ≤ y ≤ 2}.
Ta thực hiện hoạt hình bằng vẽ hình 3 chiều z( x, y):
>restart: with(plots):
>animate(plot3d, [4*t*exp(-x^2-y^2),
x = -2..2, y = -2..2, grid = [10, 10]],
t = -1..1, orientation = [20, 40],
scaling = constrained, color = "LightGray");
Hình 5.74 là hình đầu tiên của dãy hoạt hình, hình 5.75 là hình thứ
18 trong 25 hình đã tạo ra.

5.9.4. Lệnh vẽ hoạt hình trong không gian 3 chiều

>animate3d(f(x, y, t),x=x1..x2,y=y1..y2,t=a..b,<Tùy chọn>)


f ( x, y, t) phụ thuộc vào biến x, y và thông số t hoạt hình có 25
khung ảnh thể hiện hình 3D của hàm số f ( x, y, t). Biến x = x1..x2
5.9. Làm hoạt hình đồ thị 153

Hình 5.74. Khung hình đầu tiên Hình 5.75. Khung hình thứ 18
của dãy hoạt hình. của dãy 25 hình

thay đổi trên trục hoành, biến y = y1..y2 thay đổi theo trục tung và
biến t = a..b với a, b là những số thực.

Ví dụ 5.57. Thực hiện hoạt hình với hàm f ( x, y, z) = sin x cos t · u với
x ∈ [1, 3], t ∈ [1, 4], u ∈ [ 14 , 27 ] trong hệ tọa độ cylindrical. (Hình 5.76).

>restart;with(plots):
animate3d(sin(x)*cos(t*u),x=1..3,t=1..4,u=1/4..7/2,
coords=cylindrical,frames = 100);

Hình 5.76. Hoạt hình dùng Hình 5.77. Hoạt hình trên
lệnh animate3d hàm vẽ hình 3D.

Ví dụ 5.58. Mặt phẳng S(b) với hai thông số u, v mà v phụ thuộc b.

x = (7 sin u + 20)v sin v,


y = (7 sin u + 20)v cos v,
z = 7v cos u + 60v,
u ∈ [0, 2π ], v ∈ [0, bπ ].

Làm hoạt hình trong không gian ba chiều với b thay đổi trong [2, 8].
154 Chương 5. Vẽ hình trong Maple

>restart: with(plots):
x := (7*sin(u)+20)*sin(v)*v:
y := (7*sin(u)+20)*cos(v)*v:
z := 7*cos(u)*v+60*v:
>animate(plot3d, [[x, y, z], u = 0..2*Pi, v = 0..b*Pi,
grid = [10,100]],b=2..8,orientation=[0, 80],frames=100);
(Hình 5.77).

5.10. Bài tập có lời giải


sin x
. 5.1. Vẽ đồ thị của hàm số y = trong khoảng [−4π, 4π ].
x
x
. 5.2. Vẽ đồ thị hàm gián đoạn y = 2 .
x −1
. 5.3. Vẽ đồ thị hàm thông số y = sin 2t, x = cos 3t, 0 ≤ t ≤ 2π với
style=frame.

. 5.4. Vẽ đồ thị trong tọa độ cực cho bằng hàm ρ = 1 + cos ϕ cùng với
tên "Cardioida".

. 5.5. Vẽ hai đồ thị trên cùng hệ tọa độ: hàm số y = ln(3x − 1) và


3
y = x − ln 2.
2
x2 y2
. 5.6. Vẽ đồ thị hàm ẩn − = 16.
4 2
. 5.7. Vẽ đồ thị hàm x = 4 cos3 t, y = 2 sin3 t(0 ≤ t ≤ 2π ) nằm trong
x2 y2
hình Elip + = 1.
16 4
. 5.8. Vẽ miền giới hạn bởi 3 đường thẳng x + y > 0, x − y ≤ 1, y = 2.
p
. 5.9. Vẽ đồ thị hai mặt z = x sin(2y) + y cos(3x ) và z = x2 + y2 − 7
trong miền ( x, y) ∈ [−π, π ] với tùy chọn màu là x + y.

. 5.10. Vẽ mặt
1 0.2 0.3
z= + + .
( x 2 + y2 ) 2
( x + 1.2) + (y − 1.5) 2
( x − 0.9) + (y + 1.1)2
2

. 5.11. Vẽ hình cầu tâm O bán kính bằng 2: x2 + y2 + z2 = 4.


5.11. Bài tập tự giải 155

. 5.12. Vẽ hình bằng hàm thông số x = sin(t), y = cos(t), z = exp(t)


trong khung hộp.
. 5.13. Dùng lệnh animate3d vẽ hoạt hình hàm z = cos(tx ) sin(ty)
trong x, y ∈ [−π, π ] và t ∈ [1, 2].
. 5.14. Vẽ đồ thị phương trình ẩn số phụ.
(
x = t + sin 2t
y = t + sin 3t
với −2π ≤ t ≤ 2π.
. 5.15. Vòng
 xoắn
 Cornu cho theo ẩn sốphụ
R1 1 2 R1 1 2
x = 0 sin u du và y = 0 cos u du. Hãy vẽ đồ thị hàm này.
2 2
. 5.16. Vẽ đường Lituus cho bởi công thức tọa độ cực r2 = 1/θ, 0.1 ≤
θ ≤ 10π.
. 5.17. Vẽ con bướm cho bởi r = ecos θ − 2 cos 4θ + sin5 (θ/12) với 0 ≤
θ ≤ 24π.
. 5.18. Khối Umbilic Torus NC cho bởi hàm đơn vị hai đối số r (s, t) =
x (s, t)i + y(s, t) j + z(s, t)k, −π ≤ s ≤ π, −π ≤ t ≤ π, ở đây
    
1 1
x = 7 + cos s − 2t + 2 cos + t sin s
3 3
    
1 1
y = 7 + cos s − 2t + 2 cos + t cos s
3 3
   
1 1
z = sin s − 2t + 2 sin +t .
3 3
Hãy vẽ đồ thị này.
. 5.19. Hãy vẽ hình hyperboloid cho bằng phương trình
1 2 1 2
x + y − z2 = 1
16 4

5.11. Bài tập tự giải


. 5.20. Dựng đồ thị của hàm Bessel Jn ( x ) với các bậc n khác
nhau trong khoảng −20 < x < 20. (Trong Maple hàm Bessel là
Bessel J (n, x ), ở đây n là số Bessel, x là biến độc lập). Hãy vẽ đồ thị
cho 6 hàm Bessel với n = 0, 1, 2, 3, 4, 5 và đưa ra nhận xét.
156 Chương 5. Vẽ hình trong Maple

. 5.21. Vẽ đồ thị của hàm số ρ = cos3 ( ϕ3 ) trong tọa độ cực với 0 <
ϕ < 4π và nét vẽ mầu là magenta.

. 5.22. Hãy vẽ đồ thị của hàm y = x + 2 arctan x và tiếp tuyến của nó


là y = x và y = x + 2π. Khi vẽ dùng màu vàng cho nét hàm chính,
mầu đỏ cho nét đường tiếp tuyến , trục toạn độ có chia tỷ lệ.

. 5.23. Vẽ hình Mebiuss bằng công thức ẩn số phụ:


 v  v v
x = 5 + u cos cos v, y = 5 + u cos sin v, z = u sin ,
2 2 2
v ∈ [0, 2π ], u ∈ [−1, 1].

. 5.24. Vẫn hàm số ở bài 5.23, hãy vẽ đồ thị trong khoảng 0 <
v < 2π, −1 < u < 1 bằng plot3d với các tùy chọn grid=[60,10],
orientation=[-106,70], axes=framed, tickmarks=[5,8,3].
1
. 5.25. Hãy vẽ đồ thị của hàm trong khoảng hẹp [-0.1,0.1]
| x | + 0.02
và số điểm nhiều numpoints=999.

. 5.26. Vẽ đồ thị đồng thời các hàm f 1 ( x ) = x, f 2 ( x ) = x2 , f 3 ( x ) = e x


trên cùng hệ tọa độ với x ∈ [−3, 3], y ∈ [−5, 12] và các đồ thị trong
khung hình chữ nhật cùng tiêu đề các hàm số.

. 5.27. 1. Vẽ đồ thị hàm tan x và cot x trong mặt phẳng với −4π ≤
x ≤ 4π và −10 ≤ y ≤ 10.

. 5.28. Vẽ đồ thị hàm sin x và cos x trong khoảng −3 ≤ x ≤ 3 có chú


thích tại điểm cực đại và cực tiểu.

. 5.29. Vẽ đồ thị của hàm số





 x3 + 8 x ≤ −1,

7 + 2x x ≤ 2,
f (x) =


 11 − cos( x ) x ≤ 4,

3x khoảng còn lại.
CHƯƠNG 6
LẬP TRÌNH TRONG MAPLE

6.1. Cơ sở dữ liệu của Maple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158


6.2. Các câu lệnh có cấu trúc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
6.3. Toán tử break và next trong while - for . . . . . . . . . . . . . . . . . . 164
6.4. Tạo lập thủ tục hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
6.5. Tạo lập thủ tục đơn giản trong Maple . . . . . . . . . . . . . . . . . . . 167
6.6. Biến cục bộ, hàm return và hàm error . . . . . . . . . . . . . . . . . . . 168
6.7. Những toán tử tính toán trong Maple . . . . . . . . . . . . . . . . . . . . 175
6.8. trace và printlevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
6.9. Xem mã thư viện nguồn của Maple . . . . . . . . . . . . . . . . . . . . . 181
6.10. Chuyển mã Maple ra C, fortran, latex . . . . . . . . . . . . . . . . . . 182
6.11. Một số thuật toán cổ điển. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
6.12. Phương pháp Newton trong giải tích số . . . . . . . . . . . . . . . . 192
6.13. Bài tập luyện tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
6.14. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

Cho đến chương này chúng ta tiếp xúc với Maple qua từng câu
lệnh, đó là các lệnh qua các biểu thức hoặc là lệnh gán dữ liệu. Chúng
ta có thể tập hợp tất cả thao tác lại và soạn thảo thành một tệp chứa
các lệnh ta cần để Maple thực hiện liên tục khi Maple đọc tệp này.
Như vậy ta đã tạo ra tập nguồn của chương trình với ý đồ xây dựng
của ta, lúc cần ta lại cho Maple thực hiện lại. Việc lập trình kiểu đơn
giản như vậy ai cũng làm được. Để có thể làm tốt hơn việc sắp xếp
các lệnh, chương này chúng ta thiết lập một số qui tắc xắp xếp các
lệnh đơn giản và hiệu quả nhất. Ngày nay nếu Pascal, C là các ngôn
ngữ chủ yếu để học cách lập trình thì Maple gắn bó với giới chuyên
môn, ở đó họ tìm thấy đáp án cho các yêu cầu của mình, đó là tính
hiệu quả , đơn giản và cô đọng khi viết, nhưng cũng cho phép truy
nhập được vào nguồn tư liệu và chương trình hệ thống.
158 Chương 6. Lập trình trong Maple

6.1. Cơ sở dữ liệu của Maple


Nhắc lại những dữ liệu mà Maple có ngay từ chương đầu tiên đó
là: các loại số, số nguyên, số chấm động, các ký tự, mảng, bảng, ...;
các loại biến, hằng và hàm; các phép toán thực hiện trên dữ liệu. Khi
viết chương trình ta coi các dữ liệu trên là có sẵn, không khai báo
hoặc định nghĩa lại mà cứ dùng tự nhiên như khi ta thực hiện tương
tác với Maple.
Vẫn chỉ bằng các lệnh gán hoặc các lệnh theo hàm thì việc tổ
chức và điều khiển rất khó, thậm chí không thể sắp xếp theo ý đồ
thực hiện công việc của ta được. Maple cung cấp một số câu lệnh cấu
trúc điều khiển thực hiện của Maple cho hiệu quả, từ dưới đây chúng
ta nghiên cứu các lệnh cấu trúc này.

6.2. Các câu lệnh có cấu trúc


6.2.1. Câu lệnh điều kiện if - then - else - fi
Mẫu 1: Lựa chọn câu lệnh

if<điều kiện> then <Dãy lệnh 1> else <Dãy lệnh 2> fi;

Maple xác định giá trị biểu thức <điều kiện>:


1. Nếu giá trị của <điều kiện> bằng true Maple thực hiện:
<Dãy câu lệnh 1>
Sau đó kết thúc câu lệnh điều kiện.
2. Nếu giá trị của <điều kiện> bằng false Maple thực hiện:
<Dãy câu lệnh 2>
Sau đó kết thúc câu lệnh điều kiện.

Ví dụ 6.1. Sử dụng câu lệnh if mẫu 1


A. Gán giá trị cho hai biến a và b. Sử dụng câu lệnh if mẫu 1 để xác
định số lớn nhất trong hai số a và b.
>a:=12: b:=37:
>if a>= b then
print(‘số lớn nhất có giá trị:‘, a);
else
print(‘số lớn nhất có giá trị:‘, b);
fi;
số lớn nhất có giá trị:37
6.2. Các câu lệnh có cấu trúc 159

B. Hàm isprime(n) cho giá trị true nếu n là số nguyên tố và false


cho những số còn lại.

>if isprime(b) then


print(‘b là số nguyên tố‘);
else
print(‘b không là số nguyên tố‘);
fi;

b là số nguyên tố

Mẫu 2: Một trong nhiều lựa chọn

if <điều kiện(1)> then <Dãy câu lệnh 1>


elif <điều kiện (2)> then <Dãy câu lệnh 2>
...
elif <điều kiện (n)> then <Dãy câu lệnh n>
else
<Dãy câu lệnh mặc định>
fi;

Maple xác định giá trị của <điều kiện (i)>(i = 1..n) theo thứ
tự lần lượt.
1. Nếu giá trị của <điều kiện (i)> bằng true, Maple thực hiện:
<Dãy câu lệnh i>
Sau đó kết thúc câu lệnh điều kiện.
2. Nếu giá trị của <điều kiện (i)> đều là false, Maple thực hiện:
<Dãy câu lệnh mặc định>. Sau đó kết thúc câu lệnh điều kiện.

Ví dụ 6.2. Sử dụng câu lệnh if mẫu 2


Gán giá trị cho hai biến c và d. Sử dụng câu lệnh if mẫu 2 để xác
định số lớn nhất trong hai số c và d.
>c:=2: d:=137:
if c>d then print(’ c lớn hơn d’);
elif c = d then print(’c bằng d’);
else print(’ c nhỏ hơn d’);
fi;

c nhỏ hơn d
160 Chương 6. Lập trình trong Maple

Ví dụ 6.3. Hãy viết một thủ tục đưa ra giá trị của hàm



 −2 x ≤ −3,
 x2 x ≤ 2,

f (x) =


 2 x < 4,

1 còn lại
và tính f (5).
f:=proc (x)
if x <= -3 then -2
elif x <= 2 then x^2
elif x < 4 then 2
else 1
fi; end:
>f(5);
1
6.2.2. Câu lệnh lặp While
Dùng để xây dựng chu trình có số lần lặp không xác định.
while <điều kiện lặp>do
<Dãy dòng lệnh>;
od;

Bước 1: Xác định giá trị của biểu thức <điều kiện lặp>.
Bước 2: -Nếu <điều kiện lặp> có giá trị là false, Maple ra khỏi chu
trình.
-Nếu <điều kiện lặp> có giá trị là true, Maple sẽ thực hiện <Dãy
dòng lệnh>, sau đó trở lại Bước 1.
Nhận xét:
1.Thông thường <Dãy dòng lệnh> được tạo thành từ một khối các
câu lệnh của Maple. Nói cách khác, thân chu trình thường là một
khối lệnh.
2.Thân chu trình trong câu lệnh while có thể được thực hiện một
lần hoặc nhiều lần và cũng có thể không được thực hiện lần nào nếu
ngay từ đầu biểu thức <điều kiện lặp> có giá trị false.
Ví dụ 6.4. Sử dụng while để tính ước chung lớn nhất. irem(a, b) là
hàm cho số dư trong phép chia a cho b. Đoạn chương trình tính ước
chung lớn nhất của hai số a và b như sau:
6.2. Các câu lệnh có cấu trúc 161

>irem(5, 3);
2
>a:=35: b:=15:
>while b <> 0 do
d:=irem(a, b);
a:=b; b:=d;
od:
>lprint(’Ước chung lớn nhất là: ’, a);
Ước chung lớn nhất là: 5

6.2.3. Câu lệnh lặp for


Mẫu 1: Dùng xây dựng chu trình lặp có số lần lặp xác định

for i from <giá trị đầu> by <thay đổi i> to <giá trị cuối>
do
<Dãy dòng lệnh>
od;

Bước 1: Biến điều khiển i nhận giá trị của biểu thức <Giá trị đầu>.
Bước 2: Maple kiểm tra điều kiện:
+ i <= <giá trị cuối> trường hợp <thay đổi i> >= 0
+ i >= <giá trị cuối> trường hợp <thay đổi i> <= 0
Bước 3: - Nếu điều kiện trên là sai thì Maple ra khỏi chu trình
- Nếu điều kiện trên là đúng thì:
a. Thực hiện <Dãy dòng lệnh>.
b. Biến điều kiện i nhận giá trị mới: i:=i + <thay đổi i>
c. Trở lại bước 2.
Chú ý: Chúng ta có thể lựa chọn việc khai báo from <giá trị đầu>
hoặc by <thay đổi i>. Nếu from <giá trị đầu> hoặc
by <thay đổi i> không được khai báo thì Maple tự động thiết
lập giá trị mặc định cho <thay đổi i>=1 và <giá trị đầu>=1.

Ví dụ 6.5. Sử dụng for và if mẫu 2 để khởi tạo một ma trận.


A. Khai báo một ma trận. Thiết lập giá trị cho các phần tử của A.

>A:=array(1..4, 1..4):
162 Chương 6. Lập trình trong Maple

>for i to 4 do
for j to 4 do
if i >j then A[i, j]:=j
elif i < j then A[i, j]:=i
else A[i, j]:=1
fi
od;
od:
>print (A);  
1 1 1 1
 
1 1 2 2
 
1 2 1 3
 
1 2 3 1
n
B. Sử dụng for tính đồng thời các tổng ∑ ji với i = 2, 4, 6. .
j =1

>for i from 2 by 2 to 6 do
lprint(Tổng, j^i, j = 1..n là:);
print(expand(sum(j^i,j = 1..n)));
od;
Tổng j^2 j=1..n là: 1/3n3 + 1/2n2 + 1/6n
Tổng j^4 j = 1..n là: 1/5n5 + 1/2n4 + 1/3n3 − 1/30n
Tổng j^6 j = 1..n là: 1/42n − 1/6n3 + 1/2n5 + 1/2n6 + 1/7n7
Ví dụ 6.6. Viết thủ tục tính tổng 12 − 32 + 52 − 72 + · · · − 992 + 1012 .
So sánh thủ tục với hàm có sẵn trong Maple:
UMMM:=proc ()
local total, k;
total:=0;
for k by 2 to 101 do
total:=total+(-1)^((1/2)*k-1/2)*k^2
od end:

>SUMMM();
5201
>sum((-1)^(k+1)*(2*k-1)^2, k = 1 .. 51);
5201
Trong mẫu 2 của câu lệnh for có sử dụng hai hàm rất quan trọng:
>op(i, <biểu thức toán học>);
6.2. Các câu lệnh có cấu trúc 163

Lệnh op cho thành phần thứ i giữa các thành phần của biểu thức.
Ví dụ: op(1,2*x*y); kết quả là 2. Còn op(2,2*x*y); kết quả là x.

>nops(<biểu thức toán học>);

Lệnh nops cho số lượng các thành phần giữa các toán tử trong
<biểu thức toán học>.
Ví dụ: >nops(2*x*y); là 3, >nops([3,4]); là 2.
Mẫu 2 của for: Sử dụng giá trị của biến đếm vào biểu thức

for i to nops(<biểu thức>) do câu lệnh (i,<biểu thức>) od;


Bước 1: Biến điều khiển i nhận giá trị đầu trong <biểu thức> qua
hàm nops().
Bước 2: Maple thực hiện câu lệnh có (i, <biểu thức>)
Bước 3: Kiểm tra điều kiện biến i:
a. Nếu i là phần tử cuối cùng của <biểu thức> thì Maple ra khỏi chu
trình.
b. Nếu điều kiện trên sai, i nhận giá trị mới, là giá trị tiếp theo trong
<biểu thức>.
c. Trở lại bước 2.

Ví dụ 6.7. Sử dụng for mẫu 2.


Ví dụ này sử dụng câu lệnh for dạng 2 để tính tổng bình phương các
số chẵn trong danh sách aList.
>aList:=[1,2,3,4,5];
>s:=0;
>for i to nops (aList) do
if irem(op(i, aList), 2) = 0 then
s:=s + op(i, aList)^2
fi
od:
>s;
20

Ví dụ 6.8. Viết thủ tục MEMBER( D, w) tìm từ w có đúng


nằm trong từ điển D hay là không? Giả sử có từ điển
L := [ abacus, number, algorithm], kiểm tra từ algorithm và ossi f rage
có nằm trong từ điển này không?.
164 Chương 6. Lập trình trong Maple

>MEMBER:=proc (D, w)
local k;
for k to nops(D) do
if w = D[k] then return(true)
fi; od; false
end:
>L:=[abacus, number, algorithm];
L := [ abacus, number, algorithm]
>MEMBER(L, algorithm); MEMBER(L, ossifrage);
true
f alse

Mẫu 3 của for: Lặp lại lệnh theo giá trị của một biến trong
biểu thức
>for x in <biểu thức> do <Câu lệnh dùng x> od;
Lặp lại theo dãy giá trị x lấy trong <biểu thức>.
Ví dụ 6.9. Sử dụng for mẫu 3.
Ví dụ này sử dụng câu lệnh for mẫu 3 để tính tổng bình phương các
số lẻ trong danh sách aList.
>aList:=[1,2,3,4,5]: s:=0:
>for n in aList do
if irem(n, 2) = 1 then
s:=s + n^2
fi
od:
>s;
35

6.3. Toán tử break và next trong while - for


Trong chu trình lặp của câu lệnh while - for:
- Khi gặp toán tử điều kiển break, ngay lập tức chu trình lặp kết
thúc.
- Khi gặp toán tử điều kiển next, ngay lập tức chuyển sang bước lặp
tiếp theo.
Ví dụ 6.10. Sử dụng toán tử điều khiển break.
A. Tìm ba số nguyên tố đầu tiên trong tập hợp các số nguyên dương.
6.4. Tạo lập thủ tục hàm 165

>i:=2: j:=0:
>while i>0 do
if isprime(i) then
print(i, ‘là số nguyên tố‘);
j:=j + 1;
if j =3 then break fi;
fi;
i:=i + 1;
od:
2 là số nguyên tố
3 là số nguyên tố
5 là số nguyên tố
B. Ví dụ dưới đây sử dụng for dạng 2 và toán tử điều khiển next để
tính tổng bình phương các số chẵn không chia hết cho 3 trong danh
sách sList.
>aList:=[1,2,3,4,5,6,7,8,9];
>s:=0;
>for i to nops (aList) do
if ((irem(op(i, aList), 2) = 0) and
(irem(op(i, aList), 2) <>0)) then
s:=s + op(i, aList)^2
else next fi; od:
>s;
84

6.4. Tạo lập thủ tục hàm


Mẫu 1: Dùng -> định nghĩa hàm

<Tên hàm>:=(<Biến 1>, <Biến 2>,...)-> <Biểu thức có biến>;


<Tên hàm> là tên hàm được dùng sau này và không có ký tự trắng.
<Biến 1>,... là các đối số của hàm sau này đưa vào.
Ví dụ 6.11. Tạo hàm bằng ký hiệu ->.
>f:=(x,y)->simplify(x^2+y^2):
>f(sin(x),cos(x));
1
Ví dụ 6.12. Viết một hàm Maple đầu vào là một danh sách các số
và đầu ra là giá trị trung bình của các số trong danh sách. Cho
L = [−1, 2, 3, 3, 4].
166 Chương 6. Lập trình trong Maple

>AVERAGE:=X ->(sum(X[i], i = 1 .. nops(X)))/nops(X):


>AVERAGE([-1, 2, 3, 3, 4]);
11
5
Ví dụ 6.13. Độ cao của một đa thức là giá trị lớn nhất của giá trị
tuyệt đối các hệ số của đa thức p( x ). Hãy viết một hàm số đưa ra độ
cao của đa thức được đưa vào.
>HEIGHT:=(p, x)->max(map(abs, {coeffs(p, x)})):
>f:=11*x^3+3*x^2-8;
>HEIGHT(f, x);
11

Mẫu 2: Dùng ký hiệu < | >

<Tên hàm>:=<Biểu thức | Biến 1, Biến 2, ...>;


<Tên hàm> vẫn như trên và các biến là đối số của hàm theo Biểu
thức.
Ví dụ 6.14. Ví dụ định nghĩa hàm kiểu mới. Hàm tính tổng hai số.
>f:=<x+y| x,y>:
>f(-x,x);
0

Mẫu 3: Sử dụng hàm unapply


<Tên hàm>:=unapply(<Biểu thức>, <Biến 1>, <Biến 2>,...);
Ý nghĩa ký hiệu trong mẫu trên như các mẫu trước. Mẫu 3 là viết
tắt của mẫu 1.
Ví dụ 6.15. Dùng hàm số định nghĩa.
>f:=unapply(diff(z(x)^2-2x,x));

f := z → 2z( x )( z( x )) − 2
∂x
>f(sin);
2 sin( x ) cos( x ) − 2

Trong Maple còn một lệnh để định nghĩa hàm từng khúc.
>f:=x->piecewise(<ĐK 1>,<giá trị 1>,<ĐK 2>,<giá trị 2>,...);

<ĐK i> là biểu thức đúng để có <giá trị i>, i = 1, 2, 3, ....


6.5. Tạo lập thủ tục đơn giản trong Maple 167

Ví dụ 6.16. Hàm từng khúc.


>f:=x->piecewise(x <= -3, -2, x <= 2, x^2, x < 4, 2, 1):
>f(x); 


 −2 x ≤ −3,
 x2

x ≤ 2,


 2 x < 4,

1 còn lại

6.5. Tạo lập thủ tục đơn giản trong Maple


<Tên thủ tục>:=proc(<Dãy thông số>)
<Biểu thức có chứa dãy thông số>;
end;
Sau khi định nghĩa thủ tục chúng ta có thể gọi như các hàm của
Maple: <Tên thủ tục>(biểu thức 1, biểu thức 2).

Ví dụ 6.17. Định nghĩa một thủ tục tính tổng của hai số bất kỳ.
A. Định nghĩa hàm f với hai tham số x, y.
>f:=proc(x, y)
x + y;
end;
B. Sử dụng hàm f để tính tổng của hai số x = 27 và y = 46.
>f(27, 46);
73
C. Kết quả của hàm với x = w và y = z + 1.
>f(w, z+1);
w+z+1
D. Xây dựng thủ tục tìm số lớn nhất trong ba số bất kỳ.
>max3:=proc(a, b, c)
print(So lon nhat trong ba so, a, b, c);
if a < b then
if b < c then c else b fi
elif a < c then c else a
fi; end;
168 Chương 6. Lập trình trong Maple

E. Sử dụng thủ tục max3.


>max3(3, 2, 1);
3
>max3(13, 24, 18);
24

6.6. Biến cục bộ, hàm return và hàm error


Để định nghĩa một thủ tục trong Maple bao gồm việc khai báo
các biến cục bộ, cùng với việc thiết lập một số tùy chọn khác cùng các
câu lệnh.

<Tên thủ tục>:=proc (<Dãy thông số>)


local <Dãy biến cục bộ>;
options <Dãy tùy chọn>;
<Câu lệnh 1>;
. . .
<Câu lệnh n>;
end;

6.6.1. Sử dụng biến cục bộ


Biến cục bộ khai báo trong thủ tục sẽ được sử dụng chỉ khi thi
hành thủ tục và bị loại bỏ khi thủ tục kết thúc.

Ví dụ 6.18. Xây dựng thủ tục tính tổng lập phương của n số tự
nhiên liên tiếp.

>sum1:=proc(n)
local result, i;
result:=0;
for i to n do
result:=result + i^3;
od;
result;
end;
>sum1(3);
36

Với mỗi thủ tục, ta có thể kiểm tra để biết được số các đối số
truyền cho nó bằng việc sử dụng từ khóa nargs. Từ khóa args chứa
6.6. Biến cục bộ, hàm return và hàm error 169

đựng giá trị các đối số khi ta truyền vào cho hàm số. Sử dụng biến
chỉ số i theo mẫu args[i ], để truy nhập và xác định giá trị từng đối số
của thủ tục.

Ví dụ 6.19. Thủ tục dưới đây đưa ra số lớn nhất trong dãy số đưa
vào như đối số của hàm MaxN bằng cách dùng biến cục bộ và từ
khóa args cho phép ta đưa vào số lượng đối số bất kỳ.
A. Định nghĩa thủ tục: Khai báo biến cục bộ, kiểm tra các thông số
truyền cho thủ tục có kiểu số hay không (nguyên, thực, phân số) ?
Sau đó so sánh các giá trị của đối số, số nào lớn hơn được được ghi
vào result. Khi duyệt hết số lượng đối số nargs thì result là giá trị lớn
nhất.
>MaxN:=proc()
local result, i;
if not(type([args],list(numeric))) then
print(’Error’);
elif nargs >0 then
result:=args[1];
for i from 2 to nargs do
if args[i] >result then
result:=args[i];
fi; od;
result;
fi;
end:
B. Sử dụng thủ tục MaxN.
>MaxN(3, 8, 36, 13, 42, 9);
42
>MaxN(22/13, 6, 118/3);
118/3
>MaxN( a, 27, t);
Error
C. MaxN sẽ không cho giá trị gì nếu không truyền thông số cho nó.
>MaxN();

D. Biến cục bộ result không có giá trị ở ngoài thủ tục.


>result;
170 Chương 6. Lập trình trong Maple

6.6.2. Sử dụng hàm return


return được sử dụng khi muốn nhận lại một giá trị được tạo ra
trong thủ tục sau khi thủ tục đó kết thúc. Mẫu khai báo có dạng:

> return(<Một giá trị>);


Cho ra một giá trị trong thủ tục.

Ví dụ 6.20. Sử dụng hàm return tính đa thức Chebyshev bậc n:


pn ( x ). Đa thức Chebyshev được xác định bằng công thức truy hồi
p0 ( x ) = 1, p1 ( x ) = x, pn+1 ( x ) = 2xpn ( x ) − pn−1 ( x ) với mọi n ≥ 1.
A. Định nghĩa thủ tục tính đa thức Chebyshev từ bậc 0 đến n, cho
ra dạng bảng. Khởi động kết quả bằng hai đa thức Chebyshev đầu.
Những đa thức tiếp sau tính theo công thức truy hồi.
>Chebyshev:=proc (n)
local p, k;
p[0]:=1; p[1]:=x;
if n <= 1 then return(eval(p)) fi;
for k from 2 to n do
p[k]:=expand(2*x*p[k-1]-p[k-2])
od;
return(eval(p));
end:

B. Sử dụng thủ tục Chebyshev.


>a:=Chebyshev(5):
>seq(a[i], i = 0 .. 5);
1, x, 2x2 − 1, 4x3 − 3x, 8x4 − 8x2 + 1, 16x5 − 20x3 + 5x

C. Đưa ra giá trị của 6 đa thức đầu Chebyshev với x = 1/4.

>x:=1/4:
>seq(a[i], i = 0 .. 5);
1, 1/4, −7/8, −11/16, 17/32, 61/64

Ví dụ 6.21. Viết một thủ tục khi đưa hai số vào theo thứ tự, đầu ra
là thứ tự đảo ngược: Với lệnh SWAP(x,y); cho kết quả y, x.
6.6. Biến cục bộ, hàm return và hàm error 171

>SWAP:=proc (x, y)
local x1, y1, temp;
x1:=x; y1:=y; temp:=x1;
x1:=y1; y1:=temp;
return(x1, y1)
end:
>SWAP(5, 9);
9,5
>SWAP(x, y);
y, x

6.6.3. Sử dụng hàm error


Để đưa ra thông báo lỗi trong thủ tục, ta sử dụng hàm error:

error(<Câu thông báo lỗi>);


error đưa ra thông báo có dạng:

Error, (in <tên hàm>) <Câu thông báo lỗi>


Kết hợp hàm error cùng với câu lệnh điều kiện if - then - else -
fi và một vài từ khóa của Maple có được một mẫu chuẩn để kiểm tra
kiểu của những thông số truyền cho thủ tục. Mẫu đó được viết theo
mẫu sau:
>if not type (argument, typename) then
error(wrong type argument to, procname,:, argument,
should be of type, typename); fi;

Ví dụ 6.22. Thủ tục tính dãy Fibonacci.Trong thủ tục này kiểm tra
tham số n.
>F:=proc (n)
option remember;
if nargs <>1 or not type(n, integer) or n < 0 then
error(wrong number or ‘in‘(type of parameters, F))
else if n < 2 then n
else F(n-1)+F(n-2) fi
fi end:
>F(10);
55
Ví dụ 6.23. A. Sử dụng error để đưa ra thông báo trong quá trình
kiểm tra kiểu đối số truyền vào cho thủ tục tìm số lớn nhất của một
172 Chương 6. Lập trình trong Maple

dãy (sửa đổi Ví dụ 6.19).


>maxN:=proc ()
local result, i;
if nargs = 0 then error(‘Khong co doi so‘) fi;
if not (type([args], list(numeric))) then
return(procname(args)) fi;
result:=args[1];
for i from 2 to nargs do
if result < args[i] then result:=args[i] fi
od;
result;
end:
B. Sử dụng thủ tục maxN
>maxN(25/7, 34/16, 9/2);
9/2
>maxN();
Error, (in maxN) Khong co doi so

Hàm traperror cho phép ta tránh việc ngắt hoặc dừng máy khi
chương trình mắc phải lỗi. Hàm traperror được sử dụng để bắt lỗi
trong khi chạy chương trình. Kiểu bắt lỗi này được sử dụng khi ta
cho rằng việc tính toán có thể mắc phải lỗi và ta muốn chương trình
thông báo lỗi này nếu có. Biến lasterror là ghi nhận lỗi phát sinh
cuối cùng của error từ đó ta có thể dùng điều khiển chương trình.

Ví dụ 6.24. Hàm traperror và lasterror.


A. Hiển thị lỗi thực tế mắc phải
>(1/3) mod 12;
Error, the modular inverse does not exist
>lasterror;
the modular inverse does not exist
B. Chúng ta có thể bao phủ quá trình tính toán cùng với hàm trap-
error. Trong trường hợp này nhiều khi đưa ra thông báo lỗi, hoặc
tính một modul ngược.
>u:=traperror((1/4) mod 12);
u:=the modular inverse does not exist
>v: = traperror((1/5) mod 12);
v := 5
6.6. Biến cục bộ, hàm return và hàm error 173

Ví dụ 6.25. Đặt bẫy lỗi.


Thủ tục dưới đây minh hoạ cách đặt bẫy lỗi cho hàm normal.Vì hàm
normal không thực hiện với số dấu chấm động, nên ta tạo ra hàm
mới mynormal tốt hơn dùng với cả phân thức.
>mynormal:=proc (a)
local result;
result:=traperror(normal(a));
if result = lasterror then
if not result = floats then
result:=normal(convert(a, rational, exact)) else
error(result)
fi else
result;
fi end:
> mynormal((2.1+5.6*x)/(2.8+8.4*x));
0.7142857143

Hàm error và traperror có thể được sử dụng đồng thời để thoát


khỏi việc đang tính toán. Ví dụ như, trong khi tính toán giai thừa
số nguyên, khi các bước hồi qui quá sâu, tới một bước nào đấy muốn
thoát ra ngay ngoài. Bằng việc đặt bẫy lỗi lựa chọn, ta có thể thoát
khỏi quá trình đang tính toán bằng thông báo lỗi hợp pháp.

Ví dụ 6.26. Sử dụng error / traperror


A. Chúng ta định nghĩa một thủ tục có đưa ra thông báo lỗi nếu giá
trị nhập vào là âm. Giá trị lỗi là âm.
>List:=[7, 13, -8, 2, -4, -9, 5];
List := [7, 13, −8, 2, −4, −9, 5]
>err_neg:=proc(x);
if x<0 then error(x) else x fi
end:
B. Thủ tục này cho số âm đầu tiên trong danh sách hoặc ngược lại
bằng không.
>first_neg:=proc(a)
local r;
r:=traperror(map(err_neg, a));
if r = lasterror then r else 0 fi
end:
174 Chương 6. Lập trình trong Maple

>first_neg(List);
−8

6.6.4. Thủ tục lồng nhau


Có thể định nghĩa các thủ tục bên trong một thủ tục khác. Ví dụ
sau minh họa việc định nghĩa một thủ tục g() bên trong thủ tục f().
Như vậy các câu lệnh trong f() không thể tham chiếu tới bất kỳ một
biến cục bộ nào của g().

Ví dụ 6.27. Hai thủ tục f() và g() đều có một biến cục bộ cùng mang
tên y nhưng giá trị của chúngkhác nhau.
>f:=proc(x)
local g, y;
y:=x + 1;
g:=proc(a); a - y end;
g(x);
end:
>f(5);
5−y

Ví dụ 6.28. Thủ tục sau gọi thủ tục trước như một phần của chương
trình. Các số
1, 2, 3, ..., 2003

được viết lên bảng với thứ tự tăng dần. Bắt đầu ta xóa số thứ nhất,
số thứ ba, số thứ bảy,...còn lại số

2, 3, 5, 6, 8, 9, 11, 12, 14, ...

Quá trình này lặp lại lần nữa và số còn lại

3, 5, 8, 9, ....

Tiếp tục quá trình này cho đến chỉ còn một số trên bảng trước khi
xóa hết. Vậy số cuối cùng để xóa là số mấy?
A. Trước tiên ta viết thủ tục SHRI NKLIST ( L) thể hiện sau một
bước lặp. Ví dụ lần đầu tiên có L := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], khi đó
SHRI NKLIST ( L) đưa ra [2, 3, 5, 6, 8, 9], nghĩa là xóa đi các phần tử
của L có vị trí chia hết cho 3. Sau đây là một phương án tạo ra thủ
6.7. Những toán tử tính toán trong Maple 175

tục SHRI NKLIST ( L), trong thủ tục có dùng hàm nops( A) là số phần
tử trong danh sách A, op( L) dãy phần tử trong danh sách L.
>SHRINKLIST:=proc (A)
local L, newindex, k, C;
L:=[]; newindex:=1;
for k to nops(A) do if mod(k, 3) <>1 then
C[newindex]:=A[k]; L:=[op(L), C[newindex]];
newindex:=newindex+1
fi; od;
eval(L)
end:
>L:=[1,2,3,4,5,6,7,8,9,10];
L := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>L:=SHRINKLIST(L);
L := [2, 3, 5, 6, 8, 9]
B. Chương trình chính: Dùng SHRI NKLIST () lặp lại trên mảng L
cho đến khi L chỉ còn 1 phần tử. SHRI NKLIST () tạo ra danh sách
mới L không còn phần tử để xóa. Phần tử cuối cùng là số ta cần tìm.
>COMPUTELAST:=proc (X)
local Y; Y:=X;
while 1 < nops(Y) do Y:=SHRINKLIST(Y) od;
return(Y[1])
end:
>COMPUTELAST([seq(k, k = 1 .. 2003)]);
1598

6.7. Những toán tử tính toán trong Maple


Trong Maple những hàm có thể được coi như những biến, chúng
ta có thể thực hiện các phép toán trên chúng và tạo ra các biểu thức
hoặc tạo ra lớp hàm mới từ các hàm đã có. Maple có phép toán trên
hàm để xây dựng các hàm mới từ những hàm đã có, ta gọi phép toán
như vậy là toán tử.

Bảng 6.1. Một số toán tử trong Maple.


Toán tử Chức năng
@ Toán tử hợp f@g tạo ra một hàm bằng cách hợp f và g. Như
(f@g)(x) là f ( g( x ))
176 Chương 6. Lập trình trong Maple

D (Toán tử lấy Với hàm f thì biến D ( f ) lấy đạo hàm của hàm
đạo hàm riêng) số f . Với hàm có một vài biến g, D [1]( g) là
hàm số, do kết quả lấy đạo hàm của g ứng với
đối số thứ nhất, D [2]( g) là hàm số, do lấy đạo
hàm của g với đối số thứ hai, ...
@@ (Toán tử kết f@@n (với n là số nguyên không âm) là
hợp nhiều lần) hàm hợp n lần hàm f . Như (f@@3)(x) là
f ( f ( f ( x ))).

Ví dụ 6.29. Các toán tử.


A. Sử dụng toán tử D.
>f:=x ->x^2:
>df:=D(f);
d f := x − > 2x
>df(3);
6

B. Nếu đạo hàm của một hàm số không tường minh thì kết quả
đưa ra là công thức đó. Ví dụ dưới đây tính đạo hàm của hàm hợp
g( g( x )).

>D(g@@2);
D ( g)@gD ( g)

C. Lấy giá trị của hàm vừa tính tại x = 1.

>h:=%(1);
h := D ( g)( g(1))(1) D ( g)(1)(1)
>g:=log@tan + x^2;
g := log@tan + x2
>h;
4 ln(tan(1)) + 4

Ta có thể định nghĩa toán tử mới bằng việc thiết lập định nghĩa
thủ tục với tuỳ chọn option operator. Ví dụ sau minh hoạ cách định
nghĩa một toán tử hàm.
6.8. trace và printlevel 177

Ví dụ 6.30. Định nghĩa một toán tử mới.


A. Định nghĩa một toán tử sai phân.
>Shift1:=proc(f)
local x;
option operator;
unapply(simplify(f(x+1) - f(x)), x);
end:
B. Áp dụng Shift cho sin chúng ta được một hàm.
>SSin:=Shift1(sin);
SSin := x − > sin( x + 1) − sin( x )
C. Tính giá trị hàm này tại các điểm cụ thể.
>SSin(Pi);
− sin(1)
>SSin(1.0);
.0678264420
D. Tính giá trị hàm này với đối số là ký hiệu.
>SSin(x^2);
sin( x2 + 1) − sin( x2 )

E. Áp dụng Shift hai lần hàm toán tử


>Shift1((x) -> x^2);
x − > 2x + 1
>Shift(%);
x− > 2

6.8. trace và printlevel


trace và printlevel đưa ra các thông tin chi tiết thực hiện từng
bước khi chạy một chương trình trên Maple. Ta có thể sử dụng chúng
xem các bước thực hiện của một thủ tục và từ đó có thể tìm ra vị trí
lỗi.
printlevel là một biến toàn cục (giá trị mặc định bằng 1) dùng
để điều khiển thông tin đưa ra của mỗi bước thực hiện chương trình.
Những thông tin này gồm: các phép gán, biểu thức, toàn bộ một
thủ tục và danh sách kết quả tính toán trong khi thực hiện chương
trình. Biến printlevel chỉ nhận giá trị nguyên dương. Với giá trị mặc
định printlevel = 1, thì Maple đưa ra kết quả của các câu lệnh trong
178 Chương 6. Lập trình trong Maple

Maple, những câu lệnh lặp trong vòng lặp for/while và if cũng sẽ
được hiển thị ra. Nếu gán printlevel = 0 thì kết quả của các câu lệnh
nồng nhau ở mức bất kỳ sẽ không được hiển thị ra, chỉ có những câu
lệnh trực tiếp trong chương trình nguồn mới hiện thị ra. Nếu gán
cho printlevel giá trị âm thì Maple không đưa ra kết quả mà chỉ đưa
ra các câu lệnh của chương trình. Nếu gán cho printlevel những giá
trị lớn hơn khác, thì kết quả bao gồm nhiều thông tin về kết quả tính
toán trong thủ tục và những câu lệnh lồng nhau trong for/while, if
và toàn bộ thủ tục.
trace(<Tên thủ tục>) là một hàm dùng tìm kiếm những kết
quả của thủ tục đang thực hiện. Hàm trace thực hiện giống như
printlevel gán giá trị lớn, nhưng chỉ tác dụng trên <Tên thủ tục>.
Để thoát khỏi thủ tục trace, ta sử dụng hàm
untrace(<Tên thủ tục>).

Ví dụ 6.31. Dùng biến toàn cục printlevel


A. Gán cho printlevel giá trị đủ lớn để nó sẽ in ra tất cả những kết
quả trung gian trong quá trình tính toán.
>printlevel:=11: sum(i^2, i=1..n);
{--> enter sum, args = i^2, i = 1 .. n
input := i = 1..n
{--> enter Preprocess, args = i^2, i = 1 .. n
ind := i = 1..n
di f f s := {}
has_di f f s := f alse
<-- exit Preprocess (now in sum)=[[i^2,i,1,n],false,FAIL]}
input := [[i2 , i, 1, n], f alse, FAIL]
subsIndexed := {}
{--> enter SumTools:-DefiniteSum:-ClosedForm,
args = [[i^2, i, 1, n], false, FAIL]
input, has_di f f s, parametric := [i2 , i, 1, n], f alse, FAIL
s, x := i2 , i
ro f := f alse
<-- exit SumTools:-DefiniteSum:-ClosedForm
(now in sum) = (1/3)*(n+1)^3-(1/2)*(n+1)^2+(1/6)*n+1/6}
1 1 1 1
( n + 1)3 − ( n + 1)2 + n +
3 2 6 6
<-- exit sum (now at top level) = (1/3)*(n+1)^3
-(1/2)*(n+1)^2+(1/6)*n+1/6}
6.8. trace và printlevel 179

1 1 1 1
( n + 1)3 − ( n + 1)2 + n +
3 2 6 6
B. Giảm bớt giá trị của printlevel để nó sẽ chỉ in ra nhưng thông
tin cần thiết trong quá trình tính toán.
>printlevel:=6; sum(i^2, i = 1 .. n);
{-->enter sum, args = i^2, i = 1 .. n
input := i = 1..n
input := [[i2 , i, 1, n], f alse, FAIL]
subsIndexed := {}
1 1 1 1
( n + 1)3 − ( n + 1)2 + n +
3 2 6 6
<-- exit sum (now at top level) = (1/3)*(n+1)^3
-(1/2)*(n+1)^2+(1/6)*n+1/6}
1 1 1 1
( n + 1)3 − ( n + 1)2 + n +
3 2 6 6
C. Thiết lập lại giá trị mặc định ban đầu cho printlevel để nó sẽ chỉ
in ra kết quả cuối cùng của quá trình tính toán.
>printlevel:=1; sum(i^2, i = 1 .. n);
1 1 1 1
( n + 1)3 − ( n + 1)2 + n+
3 2 6 6

Ví dụ 6.32. Gỡ rối chương trình bằng trace


A. Định nghĩa một thủ tục tính giá trị: Đưa vào là tập hợp số S, trong
thủ tục có đa thức p( x ) tính giá trị tại mỗi giá trị của S. Thủ tục đưa
ra kết quả như là một tập hợp điểm các kết quả tính p( x ). Sau đây
là thủ tục có lỗi nên kết quả đưa ra không như mong muốn mà lại là
đa thức.
>EvalPolyAt:=proc(S)
local t, p, x, answer;
p:=x^4 - 3*x^3 - 1;
answer:={};
for t in S do
x:=t;
answer:=answer union {p};
od;
return(answer);
end:
>EvalPolyAt({2975, 5556, -1187});
x4 − 3x3 − 1
180 Chương 6. Lập trình trong Maple

B. Như vậy thủ tục trên đã không cho kết quả tính toán như thiết
kế. Ta xem thông tin thủ tục tực hiện bằng trace. Lưu ý rằng ở đây
mặc dù x được gán, nhưng nó không có tác dụng đối với giá trị biến
p. Chúng ta thấy thủ tục chỉ thực hiện một bậc tính toán trong biểu
thức.

>trace(EvalPolyAt);
EvalPolyAt
>EvalPolyAt({2, 3, 4});
-->enter EvalPolyAt, args = {2, 3, 4}
p := x4 − 3x3 − 1
answer := {}
x := 2
answer := { x4 − 3x3 − 1}
x := 3
answer := { x4 − 3x3 − 1}
x := 4
answer := { x4 − 3x3 − 1}
<-- exit EvalPolyAt = { x**4 - 3*x**3 - 1}
{ x4 − 3x3 − 1}

C. Chúng ta có thể minh hoạ việc p đã xác định bởi công thức. Với
giá trị x, p không được gán giá trị theo hàm đánh giá kết quả tại
bậc 1.

>p:=x^4 - 3*x^3 - 1;
p := x4 − 3x3 − 1
>x:=4;
x := 4
>eval(p, 1);
x4 − 3x3 − 1

D. Tuy nhiên ở mức cao nhất của Maple phép tính được thực hiện.

>p;
63

E. Bây giời ta sửa để thủ tục EvalPolyAt bằng cách dùng hàm sub.
Chú ý rằng thủ tục đưa ra tập hợp và liệt kê ra giữa {}. Khi ta thay
đổi nôi dung thủ tục thì Maple tự động tắt trace kiểm tra.
6.9. Xem mã thư viện nguồn của Maple 181

>EvalPolyAt:=proc(S)
local t, p, x, answer;
p:=x^4 - 3*x^3 - 1;
answer:=NULL;
for t in S do
answer:=answer, subs(x = t, p);
od;
return({answer});
end:

F. Chúng ta thấy thủ tục thực hiện đúng.

>EvalPolyAt({2, 3, 4});
{−9, −1, 63}
>EvalPolyAt({295756, 585756, -101987});
{7651205213943063955647, 117723931975457965555647,
108190226139646787969}

6.9. Xem mã thư viện nguồn của Maple


Như đã trình bày trong phần mở đầu, nhiệm vụ cơ bản của Maple
là thực hiện những công việc tính toán toán học. Nó bao gồm: những
phép toán trên số nguyên và đa thức, đưa ra màn hình hoặc một tệp
đưa vào, một tệp đưa ra và một phần hệ thống mà Maple đưa vào
bằng ngôn ngữ lập trình. Hạt nhân cơ bản của Maple được viết bằng
ngôn ngữ C.
Thư viện của Maple chứa đựng hầu hết hàm chức năng của hệ
thống toán học và ta có thể xem được mã nguồn của chúng. Để liệt
kê mã nguồn của một thủ tục trong thư viện của Maple bằng câu
lệnh interface(verboseproc = 2) ; sau đó là lệnh print cho thủ tục mà
ta muốn biết mã nguồn. Ví dụ muốn xem mã nguồn thủ tục đại số
tuyến tính trong gói thủ tục linalg và iroot.

Ví dụ 6.33. Hiển thị mã lập trình một thủ tục thư viện của Maple
A. Hiển thị một thủ tục tính đa thức đặc trưng của ma trận. Thủ tục
này kiểm tra tính đúng đắn của các lựa chọn tham số trước khi gọi
thủ tục để tính ma trân đặc trưng và định thức.
182 Chương 6. Lập trình trong Maple

>interface(verboseproc = 2);
>print(linalg[charpoly])
proc(AA,l)
option ‘Copyright (c) 2000 Wiss. Rech., ETH Zurich.
All rights reserved.‘;
local localA,A,n,m,i,j,t,cp;
localA:=AA;
if not type(localA,’:-matrix’) then
localA:=traperror(evalm(localA));
if localA=lasterror then error "invalid arguments" end if;
if localA=0 then "first argument is zero, need zero matrix"
end if
end if;
................................

B. Một vài thủ tục được viết hoàn toàn bằng ngôn ngữ C thì không
thể xem được
>print(min);
proc() options builtin; 98 end

6.10. Chuyển mã Maple ra C, fortran, latex


Trong Maple có một thư viện CodeGeneration gồm những hàm
chuyển mã nguồn Maple sang các ngôn ngữ lập trình tương ứng như
C, Fortran, Matlab,...
>with(CodeGeneration);
[C, CSharp, Fortran, IntermediateCode, Java, LanguageDe f inition,
Matlab, Names, Save, Translate, VisualBasic]

Ta quan tâm tới những lệnh dưới đây dịch mã nguồn Maple:
• Lệnh C dịch mã nguồn Maple sang mã nguồn C,
• Lệnh CSharp dịch mã nguồn Maple sang mã nguồn CShap,
• Lệnh Fortran dịch mã nguồn Maple sang mã nguồn Fortran,
• Lệnh Java dịch mã nguồn Maple sang mã nguồn Java,
• Lệnh Matlab dịch mã nguồn Maple sang mã nguồn Matlab,
• Lệnh VisualBasic dịch mã nguồn Maple sang mã nguồn Visual-
Basic.
Cú pháp tổng quát cho việc chuyển đổi:
6.10. Chuyển mã Maple ra C, fortran, latex 183

>C(<Biểu thức>, <Tùy chọn>);

• Lệnh C có thể thay bởi các lệnh khác CSharp, Fortran,


Java,Matlab, VisualBasic.
• <Biểu thức> là biểu thức toán học, danh sách, mảng, thủ tục và
modul.
• <Tùy chọn> là biến resultname (biến ghi lại kết quả chuyển đổi);
biến điều khiển optimize (thực hiện dịch sang mã nguồn tối ưu
nhất),...
Các lệnh trên có cách viết giống nhau khi thực hiện chuyển đổi
nên chỉ triển khai trên một số ngôn ngữ.

6.10.1. Ví dụ chuyển đổi mã Maple sang ngôn ngữ C


Ví dụ 6.34. A. Dùng biến resultname ghi nhận kết quả

>with(CodeGeneration):
>C(x+y*z-2*x*z, resultname="w");
w = x + y * z - 2 * x * z;
>C([[x, 2*y], [5, z]], resultname="w");
w[0][0] = x;
w[0][1] = 2 * y;
w[1][0] = 5;
w[1][1] = z;

B. Dùng biến dịch tối ưu optimize.

>cs := [s=1.0+x, t=ln(s)*exp(-x), r=exp(-x)+x*t]:


>C(cs, optimize);
s = 0.10e1 + x;
t1 = log(s);
t2 = exp(-x);
t = t1 * t2;
r = t2 + x * t;

C. Chuyển một thủ tục với tùy chọn defaulttype=integer

>f := proc(x, y, z) return x*y-y*z+x*z; end proc:


184 Chương 6. Lập trình trong Maple

>C(f, defaulttype=integer);
int f (int x, int y, int z)
{
return(x * y - y * z + x * z);
}

D. Định dạng số trong thủ tục khi biến có dâu chấm động hoặc khai
báo là numeric.

>f := proc(x::Array(numeric, 5..7))


return x[5]+x[6]+x[7];
end proc:
>C(f);
double f (double x[3])
{
return(x[0] + x[1] + x[2]);
}

6.10.2. Ví dụ chuyển đổi mã Maple sang ngôn ngữ Matlab


Ví dụ 6.35. A. Dùng biến resultname ghi nhận kết quả

>with(CodeGeneration):
>C(x+y*z-2*x*z, resultname="w");
w = x + y * z - 2 * x * z;
>C([[x, 2*y], [5, z]], resultname="w");
w = [x 2 * y; 5 z;];

B. Dùng biến dịch tối ưu optimize.

>cs := [s=1.0+x, t=ln(s)*exp(-x), r=exp(-x)+x*t]:


>C(cs, optimize);
s = 0.10e1 + x;
t1 = log(s);
t2 = exp(-x);
t = t1 * t2;
r = t2 + x * t;

C. Chuyển một thủ tục với tùy chọn defaulttype=integer


6.10. Chuyển mã Maple ra C, fortran, latex 185

>f := proc(x, y, z) return x*y-y*z+x*z; end proc:


>C(f, defaulttype=integer);
function freturn = f(x, y, z)
freturn = x * y - y * z + x * z;

D. Định dạng số trong thủ tục khi biến có dâu chấm động hoặc khai
báo là numeric.
>f := proc(x::Array(numeric, 5..7))
return x[5]+x[6]+x[7];
end proc:
>C(f);
function freturn = f(x)
freturn = x(1) + x(2) + x(3);

E. Chuyển thủ tục có biến khai báo là nguyên.


>f := proc(a::integer, p::integer)
printf("The integer remainder of %d divided by %d is:
%d\n", a, p, irem(a, p));
end proc:
>Matlab(f);
function freturn = f(a, p)
disp(sprintf(’The integer remainder of %d divided by %d is:
%d’,a,p,mod(a, p)));

6.10.3. Đưa ra dạng LaTeX


LATEX là hàm lấy từ thư viện, mà nó biến đổi biểu thức của Maple
vào định dạng tương ứng của chương trình soạn thảo văn bản TEX.
Ví dụ 6.36. Tạo ra văn bản LaTeX của biểu thức
A. Dùng hàm latex sinh ra văn bản LaTeX của biểu thức ghi vào
biến a.
>a:=(4+(x^2+1)/(sin(x)^2+x^2))/
>(3/(sqrt(x)+1/(y+1))+binomial(3,n)):
>latex(a);

\left( 4+{\frac {{x}^{2}+1}{ \left( \sin \left( x \right)


\right) ^{2}+{x}^{2}}} \right) \left( 3\, \left( \sqrt {x}+
\left( y+1\right)^{-1}\right)^{-1}+{3\choose n}\right)^{-1}
186 Chương 6. Lập trình trong Maple

B.Ta có thể dùng biến % chuyển đổi biểu thức sang LaTeX.
>Int(x^3*cos(x),x)=int(x^3*cos(x),
R 3 x);
3 2
x cos ( x ) dx = x sin ( x ) + 3 x cos ( x ) − 6 cos ( x ) − 6 x sin ( x )
>latex(%);
\int {x}^{3}\cos \left( x \right) {dx}={x}^{3}
\sin \left( x \right)+3\,{x}^{2}\cos \left( x \right)
-6\,\cos \left( x \right) -6\,x\sin \left( x \right)

6.11. Một số thuật toán cổ điển


Một số thuật toán cổ điển mà sách lập trình nào cũng có về số học
như: sàng Eratosthenes, Thuật toán Euclid và một số thuật toán sắp
xếp sẽ được triển khai trong Maple dưới đây. Những thuật toán này
trong Maple đã có, ở đây ta làm lại để học cách lập trình trên Maple.

Ví dụ 6.37. (Sàng Eratosthenes) Cho n > 0 là số phức hợp. Khi đó


phân tích ra thừa số n thành n = ab với những số nguyên dương
1 < a ≤ b < n. Cho p là ước số nguyên tố nhỏ nhất của n. Khi đó

p2 ≤ ab = n, và như vậy n có ước số nguyên tố p ≤ n. Nghĩa là nếu
một số dương không có ước số nhỏ hơn hoặc bằng căn bậc hai của nó,
thì nó là số nguyên tố.
Ví dụ kiểm tra số 103 là nguyên tố, ta chia 103 cho mọi số nguyên

dương trong khoảng 2 và b 103c = 10. Vì 103 không chia hết số nào
từ 2 đến 10 suy ra 103 là số nguyên tố.
Chương trình được viết như sau:
>TISPRIME:=proc(x)
local k,flag;
k:=2; flag:=true;
if x =1 then print("1 là đơn vị.");
flag:=false;
else
while k <= f loor(sqrt(x)) and flag
do if x mod k = 0 then flag:=false; fi;
k:=k +1; od;
fi;
if (flag) then print(x,"is prime")
elif x >1
then print(x,"chia hết cho",k-1);
fi;end;
6.11. Một số thuật toán cổ điển 187

Ví dụ 6.38. (Thuật toán Euclid) Nếu a và b là hai số nguyên dương


khác nhau, thì ước số chung lớn nhất của chúng ký hiệu là gcd( a, b)
là số nguyên dương lớn nhất mà đồng thời a, b đều chia hết cho nó.
Ví dụ gcd(20, 30) = 10, gcd(44, 45) = 1 và nếu p 6= q là các số nguyên
tố thì gcd( p, q) = 1.
Với mọi số nguyên dương a > 0 và b > 0, ta có thể tìm được duy nhất
các số nguyên q, r
a = qb + r, 0 ≤ r < b.

q, r gọi tương ứng là thương và số dư.


Ví dụ nếu a = 1004, b = 75 thì 1004 = 13 · 75 + 29, ở đây q = 13 và
r = 29.
Thuật toán chia hết như sau: Cho hai số a, b nguyên dương. Ta áp
dụng thuật toán phép chia lặp lại và nhận được dãy số

a = bq1 + r2 , 0 < r2 < b,


b = r2 q2 + r3 , 0 < r3 < r2 ,
r2 = r3 q3 + r4 , 0 < r4 < r3 ,
.. .. ..
. . .
r n −2 = r n −1 q n −1 + r n , 0 < r n < r n −1 ,
r n −1 = r n q n

Dãy {rn } giảm dần tới 0, vì dãy b, r2 , r3 , ... các số nguyên dương đơn
điệu giảm thực sự và không vượt quá b số hạng.
Thuật toán Euclid là dãy

gcd( a, b) = gcd(b, r2 ) = gcd(r2 , r3 ) = ... = gcd(rn−1 , rn ) = rn .

Thủ tục trong Maple là:


>EUCLIDALGO:=proc(a,b)
local x,y;
x:=a; y:=b;
while (x <>0 and y <> 0) do
if x >= y then x:=x mod y
else y:=y mod x fi;
od;
188 Chương 6. Lập trình trong Maple

if x =0 then return(y)
else return(x)
fi;
end:
>EUCLIDALGO(20,30);
10

Ví dụ 6.39. (Tính lũy thừ số nguyên dương) Viết thủ tục tính x n , ở
đây x là một số thực đã cho và n là một số nguyên dương.
Để giảm số lượng tính toán lũy thừa một số người ta tính lũy thừa n
theo bội của 2. Bằng cách bình phương liên tiếp của số x có dãy:
k
x → x2 → x4 → x8 → ... → x2 ,

và ta dừng khi 2k ≤ n < 2k+1 . Ví dụ nếu n = 11 ta có x → x2 → x4 →


x8 . Ta tính được 11 = 8 + 2 + 1 và như vậy x11 = x8 x2 x1 .
>POWER:=proc(x,n)
product:=1; c:=x; k:=n;
while k <>0 do
if k mod 2 = 0 then k:=k/2; c:=c*c;
else k:=k -1; product:=product*c;
fi;
od;
return(product);
end;

>POWER(3,45);
2954312706550833698643

Ví dụ 6.40. Viết thủ tục đưa ra chữ số thứ i kể từ phải qua trái của
một số nguyên dương x: ITHDIGIT ( x, i ).
>ITHDIGIT:=proc (x, i)
local b, n, z;
b:=x*10^(-i);
n:=b-floor(b);
z:=10*n;
return(floor(z))
end:
>ITHDIGIT(397812749, 6);
8
6.11. Một số thuật toán cổ điển 189

Ví dụ 6.41. Số palindrome là một số biểu diễn theo cơ số 10 mà khi


ta đọc từ chữ số đầu đến chữ số cuối hoặc từ chữ số cuối đến chữ
số đầu cho cùng một số. Ví dụ: 2, 11, 3010103, 19988991 là các số
palindrome. Hãy viết thuật toán ISPALI NDROME( x ) xác định một
số nguyên dương x là số palindrome.

>MAKEMEINTOLIST:=proc (x)
local L, k; L:=[];
for k to length(x) do
L:=[op(L), ITHDIGIT(x, length(x)-k+1)];
od;
eval(L);
end:
>ISPALINDROME:=proc (x)
local L, k;
L:=MAKEMEINTOLIST(x);
for k to (1/2)*length(x) do
if L[k] <> L[nops(L)-k+1] then
return(false);
fi; od;
true;
end:
>ISPALINDROME(19988991);
true

Ví dụ 6.42. Số nguyên tố Mersen là một số nguyên tố có


dạng 2 p − 1, ở đây p là số nguyên tố. Ví dụ 3 = 22 −
1, 7 = 23 − 1, 31 = 25 − 1 là những số nguyên tố Mersen,
nhưng 211 − 1 = 23 × 89 không phải là số Mersen. Hãy viết
chương trình sinh ra tất cả các số nguyên tố Mersen đến
2500 − 1. Có thể dùng hàm của Maple: isprime().

>MARINMERSENNE:=proc ()
local k;
for k to 500 do
if isprime(2^k-1) then
print(2^k-1, "là số nguyên tố Mersenne.")
fi; od;
end:
190 Chương 6. Lập trình trong Maple

>MARINMERSENNE();

3, "là số nguyên tố Mersenne."


7, "là số nguyên tố Mersenne."
31, "là số nguyên tố Mersenne."
127, "là số nguyên tố Mersenne."
8191, "là số nguyên tố Mersenne.."
131071, "là số nguyên tố Mersenne."
524287, "là số nguyên tố Mersenne."
2147483647, "là số nguyên tố Mersenne."
2305843009213693951, "là số nguyên tố Mersenne."
618970019642690137449562111, "là số nguyên tố Mersenne."
162259276829213363391578010288127, "là số nguyên tố
Mersenne."
170141183460469231731687303715884105727, "là số nguyên tố
Mersenne."

Ví dụ 6.43. (Phương pháp Horner) Viết thuật toán Horner ( p, x0 )


tính giá trị đa thức

p = a0 + a1 x + a2 x2 + ... + an x n .

tại x = x0 .
Ta có thể viết đa thức thành dãy theo sơ đồ Horner

an , an x0 + an−1 , x0 ( x0 an + an−1 ) + an−2 , x0 ( x0 ( x0 an + an−1 ) + an−2 ) + an−3 , ...

Mỗi bước lặp số trước nhân với x0 và cộng thêm hằng số. Ta nhập
vào các hệ số p := [ a0 , a1 , ..., an ].
Biết rằng n + 1 = nops( p) và ak = p[k + 1].
>HORNER:=proc(p,x0)
total:=0;
for k from 1 to nops(p)
do total:=total*x0+p[nops(p)-k +1]; od;
end:

Ví dụ 6.44. (Sắp xếp theo phương pháp sủi bọt) Ta muốn sắp xếp
một danh sách L = ( x1 , x2 , ..., xn ) các số theo thứ tự tăng dần. Phương
pháp là ta so sánh hai số và đổi chỗ chúng nếu số sau nhỏ hơn số
trước (nhẹ thì nổi lên). Sắp xếp trên danh sách được lặp lại cho đến
6.11. Một số thuật toán cổ điển 191

khi không còn chuyển chỗ được nữa. Ta xem xét hai vòng lặp: Vòng
ngoài chạy trên các số với chỉ số i, 1 ≤ i ≤ nops( X ) − 1 và vòng thứ
hai chạy với chỉ số j, 1 ≤ j ≤ nops( X ) − i. Ví dụ
[3, 4, 5, 2, 1] → [3, 4, 2, 1, 5] → [3, 2, 1, 4, 5] → [2, 1, 3, 4, 5] → [1, 2, 3, 4, 5].
Thủ tục như sau:

>BUBBLE:=proc(X)
Y:=X;
for i from 1 to (nops(Y )-1)
do f or j from 1 to (nops(Y )-i)
do if Y[j] >Y[j +1] then
temp:=Y[j];
Y[j]:=Y[j +1];
Y[j +1]:=temp;
fi; od;
od;
eval(Y ); end;

Ví dụ 6.45. (Sắp xếp nhanh) Sắp xếp nhanh là phương pháp chia để
trị trên dữ liệu sắp xếp. Ta chọn một số x từ danh sách sắp xếp và ta
dồn tất cả các số nhỏ hơn x về bên trái và các số lớn hơn về bên phải.
Khi đó ta có hai danh sách nhỏ hơn và lặp lại cách làm với mỗi danh
sách mới,...
Thủ tục tính toán có thể như sau:

>partition:=proc(m,n)
i:=m;
j:=n; x:=A[j];
while i < j do
if A[i]>x then
A[j]:=A[i]; j:=j -1; A[i]:=A[j];
else i:=i +1 fi;
od;
A[j]:=x;
p:=j;
end:
192 Chương 6. Lập trình trong Maple

>QUICKIE:=proc(A,m,n)
if m <n then partition(m,n);
QUICKIE(A,m,p -1);
QUICKIE(A,p +1,n);
fi;
eval(A);
end;

6.12. Phương pháp Newton trong giải tích số


Cho một hàm có đạo hàm f ( x ), phép lặp

f ( x k −1 )
x k = x k −1 − , k = 0, 1, 2, ...
f 0 ( x k −1 )

Gọi là phép lặp Newton. Nếu ta bắt đầu từ điểm x0 gần với điểm
nghiệm x ∗ của hàm f ( x ), phép nặp sinh ra dãy điểm x1 , x2 , ... mà nó
hội tụ tới nghiệm x ∗ . Thường thì phương pháp Newton hội tụ nhanh,
nếu nó hội tụ.

Ví dụ 6.46. Cho hàm số f ( x ) = x − cos(πx ). Nó có một nghiệm là


0.3769670099. Thực hiện phương pháp Newton để tìm nghiệm gần
đúng và so sánh các nghiệm.

Nếu ta bắt đầu từ x0 = 5


> x:=array(0..10) ;
x := array(0..10, [])
> f:=x->x-cos(Pi*x) ;
f := x → x − cos(πx )
> g:=D(f); #find the derivative of f
g := x → 1 + sin(πx )π
> x[0]:=0.5;
x0 := .5
> x [1] : =evalf (x [0] -f (x [0] ) /g(x [0] ) ) ;
xi := .3792734965
Hai chữ số đúng sau một bước
> x [2] : =evalf (x [1] -f (x [1] ) /g(x [1] ) ) ;
x2 := .3769695051
Năm chữ số thập phân đúng sau hai bước
6.12. Phương pháp Newton trong giải tích số 193

> x [3] : =evalf (x [2] -f (x [2] ) /g(x [2] ) ) ;


x3 := .3769670094

Chỉ bằng ba bước đã nhận được nghiệm đúng đến 9 chữ số thập
phân. Quá trình trên có thể dùng phép lặp

> f:=x->x-cos(Pi*x) ;
g:=D(f);
x[0]:=0.5;
for k from 1 to 10 do
delta:=evalf(f(x[k-1])/g(x[k-1])):
x[k]:= x[k-1] - delta:
printf("x[\%2d]= \%15.10f delta = \%15.10f \n",
k, x[k] , delta):
od:
x[ 1]= 0.3792734965 delta = 0.1207265035
x[ 2]= 0.3769695051 delta = 0.0023039914
x[ 3]= 0.3769670094 delta = 0.0000024957
x[ 4]= 0.3769670092 delta = 0.0000000002
x[ 5]= 0.3769670093 delta = -0.0000000001
x[ 6]= 0.3769670094 delta = -0.0000000001
x[ 7]= 0.3769670092 delta = 0.0000000002
x[ 8]= 0.3769670093 delta = -0.0000000001
x[ 9]= 0.3769670094 delta = -0.0000000001
x[10]= 0.3769670092 delta = 0.0000000002
Một số chú ý quan trong khi sử dụng phương pháp lặp Newton:
• Phép lặp Newton là địa phương. Nghĩa là nó có thể sai nếu điểm
xuất phát x0 không ở gần nghiệm x ∗ .
• Thậm trí Nếu phép lặp Newton không hội tụ, thì chúng ta cũng
không kết luận được có nghiệm hay bao nhiêu bước nữa thì dừng.
Do những lí do trên ta phải đặt một số tiêu chuẩn để phép lặp
dừng lại:
1. Đơn giản là phải cho số bước lặp cụ thể , nghĩa là đầu vào có n
để phép lặp Newton dừng lại tại xn .
2. Phép lặp dừng lại khi độ chính xác của nghiệm đủ tốt. Phép
lặp Newton chỉ ra rằng độ chính xác của xk phụ thuộc vào

f ( x k −1 )
δk = .
f 0 ( x k −1 )
194 Chương 6. Lập trình trong Maple

Như vậy ta sẽ cho |δk | ≤ e, một số e đủ nhỏ để dừng phép lặp Newton.
Như vậy có hai cách đặt để phép lặp dừng lại. Điều này có thể
thực hiện kết hợp giữa hai vòng lặp for-do và while-do:

for loop-index from ... to ... while condition do


câu lệnh chuẩn bị
od;

Ta có ví dụ sau:
delta:=1.0:
for k from 1 to 10 while abs(delta)>10.0^(-8) do
delta:=evalf(f(x [k-1])/g(x[k-1])):
x[k]:= x[k-1] - delta:
printf("x[\%2d]= \%15.10f delta=\%15.10f \n",
k, x[k], delta):
od:
x[ 1]= 0.3792734965 delta= 0.1207265035
x[ 2]= 0.3769695051 delta= 0.0023039914
x[ 3]= 0.3769670094 delta= 0.0000024957
x[ 4]= 0.3769670092 delta= 0.0000000002

Vòng lặp dừng lại tại bước thứ 4 vì δ > 10(−8) sẽ đúng sau đó.
Phương pháp Newton có thể thực hiện theo cách giả mã sau đây:
1. Đầu vào: f , điểm xuất phát x0 , bước giới hạn n, dung sai tol;
2. Tính đạo hàm của f và gán nó vào g;
3. Tạo ra mảng x với chỉ số từ 0 đến n;
4. Gán giá trị cho x0 ;
5. Đặt giá trị ban đầu của của δ lớn hơn tol;
6. Dùng cấu trúc "for ... from ... to ... while ... do" thực hiện vòng
lặp;
7. Kiểm tra nếu |δ| < tol;
8. Nếu đúng thì in ra phép lặp này
9. Ngược lại thoát khoải chương trình và thông báo sai.

Ví dụ 6.47. Ta xét ví dụ áp dụng phương pháp Newton tìm nghiệm


của f ( x ) = x3 − 5x2 + 2x − 10.
6.12. Phương pháp Newton trong giải tích số 195

>f:=x->x^3-5*x^2+2*x-10;
f := x → x3 − 5x2 + 2x − 10
>plot(f,-3..7);

80

40

0
-2 0 2 4 6

-40

-80

Hình 6.1. Ví dụ phép lặp Newton

Đồ thị của hàm số f ( x ) thấy có nghiệm xấp xỉ x = 5. Bây giờ ta


áp dụng phép lặp Newton.
> newton:=proc(f,x0,n,tol)
local g,x,delta,k;
g:=D(f);
x[0]:=x0;
delta:=1.0;
for k from 1 to n while abs(delta) > tol do
delta:=evalf(f(x[k-1])/g(x[k-1]));
x[k]:= x[k-1] - delta;
printf("x[\%2d]= \%15.10f delta = \%15.10f \n", k,
x[k] , delta);
od;
if abs(delta) < tol then
printf("Phep lap Newton den \%2d vong lap \n",k-1);
printf("Nghiem cua no la \%15.10f \n",x[k-1]);
else
printf("Lap Newton khong hieu qua buoc \%2d",k-1);
fi;
end;
196 Chương 6. Lập trình trong Maple

> newton(f,4.0,10, 10.0^(-8));


x[ 1]= 5.8000000000 delta = -1.8000000000
x[ 2]= 5.1652715940 delta = 0.6347284061
x[ 3]= 5.0092859510 delta = 0.1559856433
x[ 4]= 5.0000317760 delta = 0.0092541752
x[ 5]= 5.0000000010 delta = 0.0000317752
x[ 6]= 4.9999999970 delta = 0.0000000037
Phep lap Newton den 6 vong lap
Nghiem cua no la 4.9999999970
Nếu bắt đầu từ một điểm bất kì thì phép lặp Newton có thể sai:
>x0:=-3.0;
>newton(f,x0,10, 10.0^(-8));
x[ 1]= -1.5084745760 delta = -1.4915254240
x[ 2]= -0.3447138130 delta = -1.1637607630
x[ 3]= 1.6065726800 delta = -1.9512864930
x[ 4]= -0.8521934710 delta = 2.4587661510
x[ 5]= 0.4039993150 delta = -1.2561927860
x[ 6]= -6.0088494810 delta = 6.4128487960
x[ 7]= -3.5470641800 delta = -2.4617853010
x[ 8]= -1.8900892560 delta = -1.6569749240
x[ 9]= -0.6757701210 delta = -1.2143191350
x[10]= 0.7009957210 delta = -1.3767658420
Phep lap Newton khong hieu qua buoc 10

6.13. Bài tập luyện tập


. 6.1. Viết thủ tục Maple sao cho tập hợp đầu ra là các chữ số của
một số nguyên dương đưa vào.
. 6.2. Viết một thủ tục để tính tổng.
15 − 35 + 55 − 75 + ... − 995 + 1015 .

. 6.3. Viết thủ tục tính tổng các số tự nhiên trong {1, 2, 3..., 1000},
mà các số đó hoặc chia hết cho 5 hoặc chia hết cho 3?
. 6.4. Viết thủ tục MAXILIST ( X ) xác định phần tử lớn nhất trong
danh sách đã cho X. So sánh MAXILIST ( X ) với hàm đã có trong
Maple max().
. 6.5. (Bài toán chìa khóa phòng) Phòng chìa khóa có n chìa được
đánh số từ 1 đến n. Khởi đầu tất cả các phòng đều đóng. Người thứ
6.13. Bài tập luyện tập 197

1 tới mở tất cả các cửa có số là bội của 2. Người thứ 3 tới và nếu cửa
có số là bội của 3 mở thì được đóng lại, còn ngược lại thì lại mở ra.
Người thứ 4 tới và thay đổi trạng thái đóng/mở của các phòng có số là
bội của 4, và cứ tiếp tục như vậy cho đến người thứ n thay đổi trạng
thái đóng/mở cửa. Viết thuật toán tìm phòng số nào đã được mở.
1
. 6.6. Ta biết rằng chuỗi điều hòa ∑ hội tụ. Tìm số N nhỏ nhất
k ≥1 k
1
sao cho ∑ ≥ 10.
k ≥1 k

. 6.7. Dùng hàm isprime viết thủ tục xác định số nguyên tố đầu
tiên lớn hơn 1.000.000.001.

. 6.8. Cho mảng X := ( x1 , x2 , ..., xn ). Viết thủ tục đảo ngược các phần
tử của X thành ( xn , xn−1 , ..., x1 ).

. 6.9. Xét hàm số f : N → N sao cho


n

nếu n chẵn
f (n) = 2
3n + 1 nếu n lẻ

Thiết lập dãy


n, f (n), f ( f (n)), f ( f ( f (n))), ...
Biết rằng dãy trên tiến dần tới 1. Viết chương trình tính dãy trên
cho đến khi vượt qua 1 thì dừng.
x
. 6.10. Cho A = {1, 2, 3, 4}, B = {3, 4, 5, 6}, và f ( x ) = 2 . Viết
x +1
thủ tục Maple tìm f ( A \ B) ∪ f ( B \ A) và f (( A \ B) ∪ ( B \ A)).

. 6.11. Cho danh sách dữ liệu [ x1 , x2 , ..., xn ] phương sai được cho bởi
n
∑ ( x − µ )2
k =1
công thức , ở đây µ là giá trị trung bình của xk . Viết thủ
n
tục Maple để tính phương sai của một danh sách đã cho.

. 6.12. Không dùng biến trung gian hãy viết thủ tục SWAP2( x, y)
sao cho chuyển giá trị hai biến số. Ví dụ nếu x = 1 và y = 2, thì
SWAP2( x, y) đưa ra x = 2 và y = 1.

. 6.13. Dùng Ví dụ 6.40 và hàm Maple sum() và length() viết thủ


tục SUMDIGITS(x) tính tổng các chữ số của số dương đã cho x.
198 Chương 6. Lập trình trong Maple

. 6.14. Dùng Ví dụ 6.40 viết thủ tục PEELER( x ) đưa ra chữ số


xóa đi số đầu tiên và cuối cùng của số nguyên dương có ít nhất 3
chữ số. Số có 0 đứng trước bỏ qua. Ví dụ PEELER(1234) cho 23 và
PEELER(1023014) cho 2301.
. 6.15. Giả sử ta không biết gì về hàm Maple abs(). Viết một thủ
tục AbsVal(x) sao cho tìm được giá trị tuyệt đối của số thực.
. 6.16. Dùng hàm số của Maple ithprime(), viết thủ tục in ra N số
nguyên tố đầu tiên.
. 6.17. Viết thủ tục MAXI tìm số lớn nhất của 2 số thực bên trong
thủ tục MAXI3( x, y, z) để tìm số lớn nhất trong 3 số thực.
. 6.18. Số nguyên tố sinh đôi là số nguyên tố p và p + 2 cũng là số
nguyên tố. Viết thủ tục Maple đếm tất cả cặp số sinh đôi từ 1 đến
1000000. Ta có thể dùng hàm isprime().
n −1
. 6.19. Với n ≥ 1, đặt !n = ∑ k!. Duro Kurepa giả thuyết rằng
k =0
gcd(!n, n!) = 2 với tất cả n ≥ 2. Giả thuyết đã được kiểm tra với mọi
n < 1000000. Dùng hàm Maple gcd( a, b) viết thủ tục cho đến n = 150.

6.14. Bài tập tự giải


. 6.20. Viết một thủ tục Maple REVERSEDIGITS in ra chữ số
của một số nguyên dương theo thứ tự ngược lại. Ví dụ RE-
VERSEDIGITS(123) in ra 321. Còn số 123 và 1230 in ra như nhau
REVERSEDIGITS(1230) là 321.
. 6.21. Không dùng danh sách và không dùng kết quả Ví dụ 6.40 viết
một thủ tục Maple FIRSTISLAST(x) để kiểm tra chữ số thứ nhất và
chữ số cuối cùng của một số nguyên x > 0 trùng nhau.
. 6.22. Dùng hàm Maple rand(low..high) sinh ra số ngẫu nhiên từ số
low đến số high, mô phỏng ném con súc sắc n lần.
. 6.23. Dùng Ví dụ 6.41, tìm tổng tất cả các số palindromes giữa M
và N, với M < N.
. 6.24. (Giả thiết Goldbach) Mọi số nguyên chẵn n ≥ 6 có thể viết
thành tổng hai số nguyên tố lẻ. Dùng hàm Maple isprime() viết
thủ tục kiểm tra giả thuyết Goldbach cho bất kỳ số nguyên chẵn
≤ 1000000.
6.14. Bài tập tự giải 199

. 6.25. (Bài toán tem thư) Giả sử ta có hai loại tem thư: Một loại giá
a xu và loại kia giá b xu. Ta nói rằng một thư giá h xu là dán tem
được nếu tồn tại nghiệm nguyên dương x, y của phương trình sau
đây ax + by = h. Hãy viết thủ tục Maple POSTAGE( a, b, h) đưa vào
3 số nguyên a, b, h và trả lời thư h xu có khả năng dán tem được với
tem giá a xu và b xu.

. 6.26. (Bài toán vòng tròn) Cho số nguyên dương n viết chương trình
Maple đếm số nghiệm của x2 + y2 ≤ n, ở đây x, y là hai số nguyên
dương.

. 6.27. Hãy viết thủ tục biểu diễn mọi số trong khoảng 1 và 3999
thành các số La mã.

. 6.28. Dùng hàm ở Bài tập 6.20 REVERSELIST để làm bài toán
sau: Cho danh sách

X := ( x1 , x2 , ..., xm , xm+1 , xm+2 , ..., xm+n ).

Viết thủ tục SW ITCHLIST ( X, m, n) với đối số m và n sẽ cho kết quả

( xm+1 , xm+2 , ..., xm+n , x1 , x2 , ..., xm ).

. 6.29. Một mảng X = ( x1 , x2 , ..., xn ) cho trước, được sắp xếp x1 ≤


x2 ≤ ... ≤ xn . Đếm số các số khác nhau xk .

. 6.30. Cho hai danh sách X := ( x1 , ...xk ) and Y := (y1 , ...y` ) đã được
sắp xếp sao cho x1 < ... < xk và y1 < ... < y` . Hãy tìm có bao nhiêu
phần tử chung, nghĩa là số phần tử giao của hai tập hợp.

. 6.31. Giải phương trình sau bằng phương pháp Newton.

x = cos(πx )

trong khoảng [−2, 1].


200 Chương 6. Lập trình trong Maple
CHƯƠNG 7
MAPLE VỚI PHƯƠNG TRÌNH VI PHÂN

7.1. Lệnh biểu diễn đạo hàm và tích phân . . . . . . . . . . . . . . . . . . . 201


7.2. Giải phương trình vi phân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
7.3. Nghiệm giải tích của phương trình vi phân . . . . . . . . . . . . . 208
7.4. Giải số phương trình vi phân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
7.5. Gói lệnh Detools vẽ đồ thị nghiệm . . . . . . . . . . . . . . . . . . . . . . . 215
7.6. Vi phân của hàm nhiều biến . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
7.7. Tích phân của hàm nhiều biến. . . . . . . . . . . . . . . . . . . . . . . . . . . 222
7.8. Giải tích vectơ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
7.9. Chuỗi và tích vectơ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
7.10. Biến đổi tích phân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
7.11. Bài tập có lời giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
7.12. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234

7.1. Lệnh biểu diễn đạo hàm và tích phân


Trong chương 2 ta đã làm quen với lệnh tính đạo hàm và tích
phân một hàm số. Phần này ta ôn lại lệnh tính đạo hàm và thêm
phần biểu diễn đạo hàm theo ký hiệu.

7.1.1. Lệnh biểu diễn và tính đạo hàm


Tính đạo hàm trong Maple có lệnh:

>diff(<Hàm số>, <biến số>);

<Hàm số> là hàm số có đạo hàm, đạo hàm theo <biến số>.
Lệnh biểu diễn ký hiệu đạo hàm:

>Diff(<Hàm số>, <biến số);

Các đối số ý nghĩa như lệnh trên nhưng kết quả đưa ra ký hiệu
đạo hàm. Sau khi lấy đạo hàm rồi dùng các lệnh simplify, factor
hoặc expand để đơn giản và rút gọn.
202 Chương 7. Maple với phương trình vi phân

Ví dụ 7.1. A. Biểu diễn và tính đạo hàm một hàm số.


>Diff(sin(x^2),x)=diff(sin(x^2),x);

sin( x2 ) = 2 cos( x2 ) x
∂x
B. Đạo hàm theo bậc ký hiệu ở biến x$n đạo hàm bậc n.
>Diff(cos(2*x)^2,x$4)=diff(cos(2*x)^2,x$4);
∂4
cos(2x )2 = −128 sin(2x )2 + 128 cos(2x )2
∂x4
C. Đơn giản biểu thức và nhóm lại.
>simplify(%);
∂4
cos(2x )2 = 256 cos(2x )2 − 128
∂x4
>combine(%);
∂4 1 1 2
 
cos(4x ) + = 128 cos(4x )
∂x4 2 2

Toán tử vi phân dùng lệnh D(f) với f là một hàm.

Ví dụ 7.2. Toán tử vi phân.


A. Toán tử đạo hàm.
>D(sin);
cos
>D(sin)(Pi):eval(%);
−1
B. Toán tử trên một hàm.
>f:=x->ln(x^2)+exp(3*x):
>D(f);
1
x → 2 + 3e(3x)
x

7.1.2. Lệnh biểu diễn và tính tích phân


R
Tích phân không xác định f ( x )dx được tính bằng lệnh.

>int(<Hàm số>,<biến số>);


<Hàm số> là một hàm số để lấy tích phân theo <biến số>.
Lệnh biểu diễn tích phân đưa ra ký hiệu công thức.

>Int(<Hàm số>,<biến số>);


7.1. Lệnh biểu diễn đạo hàm và tích phân 203
R
Ví dụ 7.3. A. Tính đạo hàm không xác định cos x cos 2x cos 3xdx.
>Int(cos(x)*cos(2*x)*cos(3*x),x)=
int(cos(x)*cos(2*x)*cos(3*x), x);
R 1 1 1 1
cos x cos 2x cos 3xdx = sin(2x ) + sin(4x ) + sin(6x ) + x
8 16 24 4
R 1 + sin x x
B. Tính tích phân không xác định e dx
1 + cos x

>int( (1+sin (x))*exp(x)/(1+cos(x)),x);


1
e x tan( x )
2
Rb
Để tính tích phân xác định a f ( x )dx vẫn như công thức trên
nhưng với các cận của biến
int(<hàm số>, <biến số=cận dưới .. cận trên>):
Int(<hàm số>, <biến số=cận dưới .. cận trên>):

Ví dụ 7.4. A. Tính 0 (1 + cos( x ))2 dx.

>Int((1+cos(x))^2, x=0..Pi)= int((1+cos(x))^2, x=0..Pi);


Rπ 3
0
(1 + cos( x ))2 dx = π
2
R ln 2 4
B. Tính tích phân 0 sin xdx.
>int(sin(x)^4,x=0..ln(2));
225 3
− + ln(2)
1024 8
R3 R5
C. Tính tích phân đúp −3 y2 −4 ( x + 2y)dydx.

>Int(Int(x+2*y, x = y^2-4 .. 5), y = -3 .. 3)=


int(int(x+2*y, x = y^2-4 .. 5), y = -3 .. 3);
R3 R5 252
−3 y2 −4 ( x + 2y ) dydx = 5

Trong các lệnh tính tích phân thêm tùy chọn continuous:
int(f,x,continuous) thì Maple bỏ qua các điểm tại đó hàm f gián
đoạn. Như vậy tùy chọn này dùng để tính các tích phân đặc biệt.
Tính độ chính xác của tích phân ta dùng lệnh evalf(int(f,
x=x1..x2), e), ở đây e độ chính xác tính toán (chữ số thập phân
sau dấu phẩy).
204 Chương 7. Maple với phương trình vi phân

Ta cũng có thể tính tích phân có đối số.


R∞
Ví dụ 7.5. Tính tích phân 0 e−ax dx.
>Int(exp(-a*x),x=0..+infinity)=
int(exp(-a*x),x=0..+infinity);
R ∞ −ax e(−ax)−1
0
e dx = lim −
x →∞ a

Tính tích phân trên còn phụ thuộc vào a. Ta có thể giới hạn a
trong một khoảng nào đó khi đó Maple cũng tính nhưng kết quả là
giá trị a~ trong khoảng giới hạn mới được gán bằng lệnh assume()
và additionally():
>assume(a > -1); additionally(a <= 3);
>about(a);
Originally a, renamed a~:
is assumed to be: RealRange(Open(-1),3)
R∞
Ta quay lại áp dụng các lệnh trên tính 0 e−ax dx.
>assume(a>0);
>Int(exp(-a*x),x=0..+infinity)=
int(exp(-a*x),x=0..+infinity);
R ∞ −ax 1
0
e dx =
a∼
R π
2
sin x cos xdx
Ví dụ 7.6. Tính tích phân xác định 0 Với
( a2 cos2x + b2 sin2 x )2
điều kiện a > 0, b > 0.
>assume (a>0); assume (b>0);
>Int(sin(x)*cos(x)/(a^2*cos(x)^2+b^2*sin(x)^2),x=0..Pi/2)=
int(sin(x)*cos(x)/(a^2*cos(x)^2+b^2*sin(x)^2),x=0..Pi/2);
π
R2 sin x cos x ln(b ∼) − ln( a ∼)
2
dx =
2 2 2
0 ( a ∼ cos x + b ∼ sin x )
2 − a ∼2 + b ∼2

Trong gói lệnh student có các lệnh phục vụ giảng dạy và tính
toán tích phân.Một số hàm quan trọng của gói lệnh student:
• Doubleint(expr,x,y,Domain) tích phân đôi biểu thức expr theo
biến x,y trong miền Domain.
• Lineint(f(x,y),x,y) tính tích phân đường. Biến x phụ thuộc vào
biến y.
7.1. Lệnh biểu diễn đạo hàm và tích phân 205

• Tripleint(g,x,y,z) tính tích phân cặp ba.


• changevar(h(x)=t,int(f,x),t) đổi biến, ở đây h( x ) là biểu thức cho
để đổi tọa độ, int là một trong các hàm tích phân từ gói lệnh stu-
dent, còn t danh sách biến mới của tích phân.
• intparts(int(f,x),u) tích phân từng phần, ở đây f là biểu thức,
còn u( x ) là thành phần của biểu thức dưới dấu tích phân, có đạo
hàm.

Ví dụ 7.7. Hàm trong gói lệnh student


A. Tính từng bước theo từng phần của tích phân sau: x3 sin xdx.
R

>restart; with(student): RJ=Int(x^3*sin(x),x);


J = x3 sin xdx
>J=intparts(Int(x^3*sin(x),x),x^3);
J = − x3 cos( x ) − (−3x2 ) cos( x )dx
R
>intparts(%,x^2);
J = − x3 cos( x ) + 3x2 sin( x ) + (−6x sin( x ))dx
R
>intparts(%,x);
J = − x3 cos( x ) + 3x2 sin( x ) + 6x cos( x ) − (−6 cos( x ))dx
R
>value(%);
J = − x3 cos( x ) + 3x2 sin( x ) + 6x cos( x ) − 6 sin( x )

π/2
R dx
B. Tính tích phân xác định bằng cách đổi biến
−π/2 1 + cos( x )
x
tan = t.
2

>J=Int(1/(1+cos(x)), x=-Pi/2..Pi/2);
π/2
R 1
dx
−π/2 1 + cos (x)
>J=changevar(tan(x/2)=t,Int(1/(1+cos(x)),x=-Pi/2..Pi/2),t);
R1 1
J= dt
−1 ( 1 + cos ( 2 arctan (t)))(1 + t2 )

>value(%);
J=2
Z 2 Z 2√2 Z 1

2 8x −2y2
C. Tính tích phân chập ba xdzdydx.
0 0 0
206 Chương 7. Maple với phương trình vi phân

>Tripleint(x,z=0..sqrt((4*x-y^2)/2),y=0..2*sqrt(x),x=0..2);
Z Z √ Z 1√
2 2
2 2 8x −2y
2
xdzdydx
0 0 0
>simplify(value(%));
4√

3

7.2. Giải phương trình vi phân


Hàm dsolve dùng để giải phương trình hoặc hệ phương trình
vi phân cho nghiệm là một biểu thức hoặc một chỗi phương trình
vi phân bậc một, bậc hai hoặc cao hơn.Hàm này cố gắng giải bằng
hệ phương trình hoặc không tường minh theo phương pháp biến đổi
Laplace hoặc xấp xỉ theo chuỗi.
I. Giải phương trình vi phân bình thường

>dsolve( <Phương trình>, <Biến phụ thuộc (biến độc lập)>);

II. Giải với các giá trị điều kiện ban đầu

>dsolve(<họ PT và ĐK đầu>, <Biến phụ thuộc (biến độc lập)>);

III. Giải hệ phương trình vi phân

>dsolve(<họ phương trình và điều kiện đầu>, <Tập biến>);


IV. Giải hệ phương trình vi phân có tùy chọn

>dsolve(<họ PT và điều kiện đầu>, <Tập biến>,<Tùy chọn>);

Bảng 7.1. Lệnh dsolve có tuỳ chọn.


<Tùy chọn> dsolve thực hiện
laplace Phép giải sử dụng kiểu biến đổi Laplace để giải
phương trình hoặc hệ phương trình.
series Giải nghiệm là chuỗi luỹ thừa (giá trị của biến
toàn cục bậc lũy thừa Order, mặc định bằng 6,
giá trị này chỉ ra số các số hạng của nghiệm).
explicit Phép giải sử dụng solve kết quả trả về ở dạng
ẩn của biến độc lập.
numeric Nghiệm số của giá trị bài toán ban đầu.
7.2. Giải phương trình vi phân 207

Ví dụ 7.8. Giải các phương trình vi phân bằng dsolve.


A. Phương trình vi phân bao gồm hàm ẩn số y phụ thuộc biến
x. Nó phải được biểu diễn dưới dạng diff(y(x), x) thay vì viết
diff(y, x) bởi vì diff cần được thể hiện y phụ thuộc vào x.
>dep:= diff(y(x), x)*x^2+ y(x)=0;
d
deq := ( y( x )) x2 + y( x ) = 0
dx
B. Nghiệm của phương trình vi phân là hàm và tên của các biến tuỳ
thuộc và các biến độc lập.
>dsolve(dep, y(x));
1
y( x ) = exp( )C1
x

C. Vấn đề về giá trị ban đầu được đưa vào trong tham số đầu tiên
của dsolve cùng với tập các phương trình.
>dsolve({dep, y(1) = a}, y(x));
exp(1/x ) a
y( x ) =
exp(1)
D. dsolve có thể giải các phương trình thuần nhất bậc hai với hệ số
là hàm đa thức. Giải phương trình vi phân x2 y00 ( x ) + 5y0 ( x ) = 0.
>dsolve(x^2*diff(y(x),x,x)+5*diff(y(x),x)=0,y(x));
y( x ) = C1x exp(5/x ) − 5C1Ei (5/x ) + C2
E. dsolve không thể giải tất cả phương trình vi phân chính xác. Nó
không cho giá trị nào khi phương trình không có nghiệm. Ví dụ giải
phương trình vi phân f 0 ( x ) + x f 5 ( x ) = sin x.
>dsolve(diff(f(x), x) + f(x)^5*x = sin(x), f(x));
>
F. Khi Maple không thể tìm được nghiệm chính xác. Ta có thể tìm
nghiệm của phương trình gần đúng bằng tùy chọn của hàm dsolve.
>dsolve({f(0) = 1/2, diff(f(x), x) + f(x)^5*x = sin(x)},
f(x), series);
1 31 977 4
f ( x ) = + x2 − x + 0( x 6 )
2 64 12288

G. Giải hệ phương trình vi phân cùng với các điều kiện khởi đầu cho
bởi một tập hàm.
208 Chương 7. Maple với phương trình vi phân

>sys:={diff(y(x), x) = z(x), diff(z(x), x) = y(x),


y(0) = 0, z(0) = 2};
d
sys := z(0) = 2, y(0) = 0, (z( x )) = y( x )
dx

7.3. Nghiệm giải tích của phương trình vi phân


Nghiệm chung của phương trình vi phân
Để giải một phương trình vi phân trong Maple dùng lệnh:

dsolve(<Phương trình>,<biến số>,<Tùy chọn>);


<Phương trình> là một phương trình vi phân hoặc hệ phương
trình vi phân, thể hiện phương trình vi phân dùng lệnh diff như
ở phần trước, ví dụ y00 + y = x có dạng diff(y(x),x$2)+y(x)=x.
<biến số> nghiệm được giải theo biến này. <Tùy chọn> thông số chỉ
ra phương pháp giải phương trình, để giải nghiệm giải tích có tùy
chọn type=exact.
Nghiệm tổng quát của phương trình vi phân phụ thuộc vào hằng
số, số hằng số bằng bậc của phương trình vi phân. Trong Maple các
hằng số ký hiệu là _C1, _C2,...

Ví dụ 7.9. A. Tìm nghiệm tổng quát phương trình vi phân


y0 + y cos x = sin x cos x.
>restart;
>de:=diff(y(x),x)+y(x)*cos(x)=sin(x)*cos(x);
 

de := y( x ) + y( x ) cos( x ) = sin( x ) cos( x )
∂x
>dsolve(de,y(x));
y( x ) = sin( x ) − 1 + e(− sin(x)) _C1
B. Tìm nghiệm của phương trình vi phân bậc hai y00 − 2y0 + y =
sin x + e− x .
>restart;
>deq:=diff(y(x),x$2)-2*diff(y(x),x)+y(x)=sin(x)+exp(-x);
 2   
∂ ∂
deq := y( x ) − 2 y( x ) + y( x ) = sin( x ) + e(− x)
∂x2 ∂x
>dsolve(deq,y(x));
1 1
y( x ) = _C1e x + _C2e x x + cos( x ) + e(− x)
2 4
Chú ý: Thừa số có hằng số là nghiệm chung của phương trình và hai
7.3. Nghiệm giải tích của phương trình vi phân 209

số hạng còn lại là nghiệm riêng của phương trình vi phân.


C. Tìm nghiệm tổng quát của phương trình vi phân y00 + k2 y =
sin(qx ) với trường hợp: q 6= k và q = k.
>de:=diff(y(x),x$2)+k^2*y(x)=sin(q*x);
 2 

de := y( x ) + k2 y( x ) = sin(qx )
∂x2
>dsolve(deq,y(x));
sin(qx )
y( x ) = sin(kx )_C2 + cos(kx )_C1 + 2
( k − q2 )
>q := k; dsolve(de, y(x));
1 cos(kx ) x
y( x ) = sin(kx )_C2 + cos(kx )_C1 −
2 k
Hệ cơ sở của tập nghiệm
Lệnh dsolve còn có thể dùng tìm hệ cơ sở của nghiệm phương
trình vi phân. Lệnh này dùng tùy chọn output=basis
Ví dụ 7.10. Tìm hệ cơ sở của phương trình vi phân y(4) + 2y00 + y = 0.
>de:= diff(y(x),x$4)+2*(diff(y(x), x$2))+y(x) = 0;
∂4 ∂2
de := 4 y( x ) + 2 2 + y( x ) = 0
∂x ∂x
>dsolve(de, y(x), output = basis);
[cos( x ), sin( x ), cos( x ) x, sin( x ) x ]
Giải bài toán Côsi hoặc bài toán biên
Lệnh dsolve có thể giải được bài toán Côsi, nghĩa là phương trình
vi phân với giá trị ban đầu hoặc là điều kiện biên của hàm. Để thể
hiện điều kiện biên ta thường dùng toán tử vi phân D: Ví dụ y00 (0) =
2 có thể viết là (D@@2)(y)(0)=2, còn y0 (1) = 0 viết là D(y)(1)=0. Chú
ý đạo hàm bậc n có thể viết (D@@n)(y).
Ví dụ 7.11. A. Tìm nghiệm bài toán Côsi:
y(4) + y00 = 2 cos x, y(0) = −2, y0 (0) = 1, y00 (0) = 0, y000 (0) = 0.
>de:=diff(y(x),x$4)+diff(y(x),x$2)=2*cos(x);
∂4 ∂2
de := 4 y( x ) + 2 y( x ) = 2 cos( x )
∂x ∂x
>cond := y(0) = -2, (D(y))(0) = 1,
((D@@2)(y))(0) = 0, ((D@@3)(y))(0) = 0;
cond := y(0) = −2, D (y)(0) = 1, D (2) (y)(0) = 0, D (3) (y)(0) = 0
>dsolve({de,cond},y(x));
y( x ) = −2 cos( x ) − sin( x ) x + x
210 Chương 7. Maple với phương trình vi phân
π
B.Tìm nghiệm bài toán biên: y00 + y = 2x − π, y(0) = 0, y( ) = 0.
2
Xây dựng đồ thị của nghiệm (hình 7.1).

>restart; de:=diff(y(x),x$2)+y(x)=2*x-Pi;
∂2
de := 2 y( x ) + y( x ) = 2x − π
∂x
>cond:=y(0)=0,y(Pi/2)=0;
π
cond := y(0) = 0, y( ) = 0
2
>dsolve({de,cond},y(x));
y( x ) = 2x − π + π cos( x )
>y1:=rhs(%):plot(y1,x=-10..20,thickness=2);

Hình 7.1. Nghiệm của bài toán Côsi

Hệ phương trình vi phân


Lệnh dsolve có thể tìm nghiệm của hệ phương trình vi phân
nhiều hàm ẩn:

dsolve({sys},{x(t),y(t),...});

Với sys là tập hợp các phương trình vi phân, x (t), y(t), ... các hàm ẩn
cần tìm.

Ví dụ 7.12. Tìm nghiệm của hệ phương trình vi phân

2

x0
 = −4x − 2y +
et
−1
3
y0
 = 6x + 3yy − t
e −1
7.3. Nghiệm giải tích của phương trình vi phân 211

>sys:=diff(x(t),t)=-4*x(t)-2*y(t)+2/(exp(t)-1),
diff(y(t),t)=6*x(t)+3*y(t)-3/(exp(t)-1):
>dsolve({sys},{x(t),y(t)});
2 + 2 ln et − 1 − _C1

{ x (t) = + _C2,
et
y (t) = −2 _C2 − 3 e−t − 3 e−t ln et − 1 + 3/2 e−t _C1}


Nghiệm gần đúng của phương trình vi phân theo chuỗi lũy
thừa
Hàm dsolve có thể giải phương trình vi phân bằng phân tích
hàm ra chuỗi lũy thừa. Tùy chọn trong lệnh là type=series. Để xấp
xỉ nghiệm đến bậc nào của chuỗi lũy thừa ta đặt Order:=n.
Để chuyển nghiệm là chuỗi về thành các đa thức ta dùng con-
vert(%,polynom) hoặc lấy vế phải của kết quả rhs(%).

Ví dụ 7.13. A. Tìm nghiệm của bài toán Côsi y0 = y + xey , y(0) = 0


dưới dạng chuỗi với độ chính xác mũ bậc 5.
>restart; Order:=5:
>dsolve(diff(y(x),x)=y(x)+x*exp(y(x)),y(0)=0, y(x),
type=series);
1 1 1
y( x ) = x2 + x3 + x4 + O( x5 )
2 6 6
B.Tìm nghiệm tổng quát phương trình vi phân y00 ( x ) − y3 ( x ) =
e− x cos x dưới dạng dãy lũy thừa bậc 4. Tìm triển khai với điều kiện
ban đầu y(0) = 1, y0 (0) = 0.
>restart; Order:=4:
>de:=diff(y(x),x$2)-y(x)^3=exp(-x)*cos(x):
>f:=dsolve(de,y(x),series);  
f := y ( x ) = (y (0) + D (y) (0) x + 1/2 (y (0))3 + 21 x2
 
+ 1/2 (y (0))2 D (y) (0) − 16 x3 + O x4 )


>y(0):=1: D(y)(0):=0:f;
y ( x ) = (1 + x2 − 16 x3 + O x4 )


C. Tìm nghiệm gần đúng trong dạng dãy lũy thừa bậc 6 và nghiệm
đúng của bài toán Côsi y000 − y0 = 3(2 − x2 ) sin x, y(0) = 1, y0 (0) =
1, y00 (0) = 1. Xây dựng nghiệm đúng và nghiệm gần đúng trên cùng
hệ tọa độ.
212 Chương 7. Maple với phương trình vi phân

>restart; Order:=6:
>de:=diff(y(x),x$3)-diff(y(x),x)=3*(2-x^2)*sin(x);
d3 d
y ( x ) = 3 2 − x2 sin ( x )

dx3
y ( x ) − dx
>cond:=y(0)=1, D(y)(0)=1, (D@@2)(y)(0)=1;
cond := y(0) = 1, D (y)(0) = 1, D (2) (y)(0) = 1
>dsolve({de,cond},y(x));
y ( x ) = 43 e− x + 74 ex + 21 3 2
2 cos ( x ) + 6 sin ( x ) x − 2 cos () x − 12
>y1:=rhs(%):
>dsolve({de,cond},y(x), series);
y ( x ) = (1 + x + 12 x2 + 16 x3 + 24 7 4 1 5
x + O x6 )

x + 120

Để vẽ đồ thị ta thực hiện các lệnh


>convert(%,polynom): y2:=rhs(%):
>p1:=plot(y1,x=-3..3,thickness=2,color=black):
>p2:=plot(y2,x=-3..3, linestyle=3,thickness=2,color=blue):
>with(plots): display(p1,p2);

Hình 7.2. Nghiệm gần đúng và nghiệm chính xác

7.4. Giải số phương trình vi phân


Để giải nghiệm số của phương trình vi phân (hoặc bài toán biên)
vẫn dùng lệnh dsolve nhưng với đối số tùy chọn type=numeric
(hoặc chỉ cần numeric). Công thức tổng quát

>dsolve(<Phương trình>,<biến số>, type=numeric,<Tùy chọn>);

Những đối số của lệnh vẫn như ta đã biết chỉ có thêm


<Tùy chon> là phương pháp giải số trong Maple. Maple dùng
tùy chọn method=rkf45 phương pháp Range-Kutta-Felberg
7.4. Giải số phương trình vi phân 213

bậc 4, 5; method=dverk78 phương pháp Range-Kutta 7,8;


method=classical phương pháp Range-Kutta bậc 3; method=gear
và method=mgear là phương pháp một bước và nhiều bước của
Gippa.
Đồ thị của nghiệm số của phương trình vi phân được vẽ
bởi lệnh , ở đây dd:=dsolve({eq, cond},y(x),numeric); ode-
plot(dd,[x,y(x)],x=x1..x2);

Ví dụ 7.14. A. Tính nghiệm số và nghiệm gần đúng dưới dạng chuỗi


lũy thừa đến bậc 6 cho bài toán Côsi: y00 − x sin(y) = sin(2x ), y(0) =
0, y0 (0) = 1.
>restart; Ordev=6:
>eq:=diff(y(x),x$2)-x*sin(y(x))=sin(2*x):
>cond:=y(0)=0, D(y)(0)=1:
>de:=dsolve({eq,cond},y(x),numeric);
de := proc(rk f 45x )...end
>de(0.5);

x = .5, y( x ) = .544926369160861, y( x ) = 1.27250314476033
∂x
>with(plots):
>odeplot(de,[x,y(x)],-10..10,thickness=2);

Hình 7.3. Đồ thị nghiệm của phương trình vi phân theo giải số

Bây giờ ta tìm nghiệm gần đúng theo chuỗi lũy thừa:
>dsolve({eq, cond}, y(x), series);
y ( x ) = ( x + 13 x3 + 12
1 4 1 5
x + O x6 )

x − 15
>convert(%, polynom):p:=rhs(%):
214 Chương 7. Maple với phương trình vi phân

Vẽ hai nghiệm trên cùng đồ thị

>p1:=odeplot(de,[x,y(x)],-2..3, thickness=2,color=black):
>p2:=plot(p,x=-2..3,thickness=2,linestyle=3,color=blue):
>display(p1,p2);

Hình 7.4. Đồ thị của nghiệm theo cách giải số và nghiệm gần đúng

B. Dựng đồ thị nghiệm của bài toán Côsi cho hệ phương trình vi
phân sau:

0
 x (t) = 2y(t) sin(t) − x (t) − t

y 0 ( t ) = x ( t ),

x (0) = 1, y(0) = 2.

>restart; cond:=x(0)=1,y(0)=2:
>sys:=diff(x(t),t)=2*y(t)*sin(t)-x(t)-t,diff(y(t),t)=x(t):
>F:=dsolve({sys,cond},[x(t),y(t)],numeric):
>with(plots):
>p1:=odeplot(F,[t,x(t)],-3..7, color=black,
thickness=2,linestyle=3):
>p2:=odeplot(F,[t,y(t)],-3..7,color=green,thickness=2):
>p3:=textplot([3.5,8,"x(t)"], font=[TIMES,ITALIC, 12]):
>p4:=textplot([5,13,"y(t)"], font=[TIMES,ITALIC, 12]):
>display(p1,p2,p3,p4);

Chú ý: Để thêm vào đồ thi những tên hàm và chú thích dùng lệnh
textplot với tọa độ và dãy ký tự với phông kèm theo (hình 7.5).
7.5. Gói lệnh Detools vẽ đồ thị nghiệm 215

Hình 7.5. Đồ thị của nghiệm giải số và nghiệm gần đúng

7.5. Gói lệnh Detools vẽ đồ thị nghiệm


Vẽ đồ thị nghiệm bằng DEplot
Giải số phương trình vi phân bài toán Côsi, vẽ đồ thị nghiệm và
thể hiện môi trường pha trong Maple có gói lệnh Detools.
Lệnh DEplot từ gói lệnh DEtools xây dựng đồ thị nghiệm và hình
ảnh pha. Lệnh này cũng giống như lệnh odeplot, nhưng mở rộng hơn
nhiều giải số các phương trình vi phân.

DEplot(de, vars, range, x=x1..x2,y=y1..y2, cond, option);

de là một phương trình hoặc tập hợp phương trình vi phân; vars
danh sách các biến số; range số lượng các biến độc lập. cond là điều
kiện ban đầu đã cho; x=x1..x2, y=y1..y2 khoảng xác định của biến
hàm; option là đối số thêm vào.
Thường ta dùng các đối số sau đây: linecolor= tên mầu (đường vẽ
mầu); scene=[x,y] xác định sự phụ thuộc của đồ thị; iterations=số lặp
(tăng độ chính xác tính toán vẽ đồ thị); stepsize=số, khoảng cách giữa
hai điểm trên đồ thị (mặc định ( x2 − x1)/20); obsrange=true/false
Ngừng hoặc không tính nữa khi nghiệm đồ thị dơi vào khoảng nguy
hiểm.
216 Chương 7. Maple với phương trình vi phân

Để giải phương trình vi phân bậc n thì điều kiện ban đầu có thể
viết dưới dạng: [x0,y0,y’0,y”0,...], ở đây x0 là điểm tại đó ta cho điều
kiện ban đầu, y0 là giá trị của hàm tại x0; còn y’0 , y”0,...là giá trị
của đạo hàm bậc nhất, bậc hai,... đến bậc n − 1.
Ví dụ 7.15. Vẽ đồ thị nghiệm của phương trình vi phân
q
y000 + x |y0 | + x2 y = 0, y(0) = 0, y0 (0) = 1, y00 (0) = 1

trong khoảng x ∈ [−4, 5] (Hình 7.6).


>restart; with(DEtools):
>DEplot(diff(y(x),x$3)+x*sqrt(abs(diff(y(x),x)))+x^2*y(x)=0,
{y(x)}, =-4..5, [[y(0)=0,D(y)(0)=1,(D@@2)(y)(0)=1]],
stepsize=.1, linecolor=black,thickness=2);

Hình 7.6. Đồ thị của nghiệm giải số vẽ bằng DEplot

Xây dựng hình ảnh pha cho hệ phương trình vi phân


Lệnh DEplot có thể vẽ hình ảnh pha với hệ phương trình bậc
nhất trên mặt phẳng ( x, y):

 dx = f ( x, y, t),

dt
 dy = g( x, y, t),

dt
bằng cách thêm vào đối số scene=[x,y].
Nếu hệ phương trình vi phân là thuần nhất, thì hình ảnh pha
của hệ phương trình vi phân là vectơ trường dạng mũi tên, kích cỡ
7.5. Gói lệnh Detools vẽ đồ thị nghiệm 217

mũi tên điều khiển bằng tùy chọn arrows=small, mdium, large, line
hoặc none.
Để vẽ tất cả hình ảnh pha, với mỗi quỹ đạo pha ta cần biết
điều kiện ban đầu: Ví dụ với hệ hai phương trình bậc nhất thì điều
kiện ban đầu cho bằng :[[ x (0) = x1, y(0) = y1], [ x (0) = x2, y(0) =
y2], ..., [ x (0) = xn, y(0) = yn]].
Điều kiện ban đầu có thể cho dưới dạng: [t0, x0, y0] với t0 là điểm
tại đó được cho giá trị ban đầu; x0 và y0 là các giá trị hàm tại điểm
t0.
Hình ảnh pha của hệ hai phương trình vi phân bậc nhất có thể
vẽ bằng lệnh
>phaseportrait(sys, [x,y],x1..x2,[[cond]]);
sys là hệ hai phương trình vi phân bậc nhất; [ x, y] hàm nghiệm
cần tìm; x1..x2 là khoảng để xây dựng pha; và còn lại là điều kiện
ban đầu. Lệnh này trong gói lệnh DEtools nên trước khi dùng phải
gọi gói lệnh.
Ví dụ 7.16. Dựng ảnh pha không có mũi tên cho hệ phương trình
sau (
x 0 = y,
y0 = x − x3 ,
Với một số điều kiện ban đầu sau: x (0) = 1, y(0) = 0.2;
x (0) = 0, y(0) = 1; x (0) = 1, y(0) = 0.4; x (0) = 1, y(0) = 0.75;
x (0) = 0, y(0) = 1.5; x (0) = −0.1, y(0) = 0.7. (Hình 7.7).

Hình 7.7. Ảnh pha không mũi tên của hệ phương trình vi phân

>restart; with(DEtools);
>DEplot({diff(x(t), t)=y(t), diff(y(t), t)=x(t)-x(t)^3},
[x(t), y(t)],t = 0 .. 20,[[0, 1, .2],[0,0,1],[0,1,.4],
[0, 1, .75], [0, 0, 1.5],[0, -.1, .7]],
stepsize = .1, arrows = none, linecolor = black);
218 Chương 7. Maple với phương trình vi phân

Ví dụ 7.17. Dựng ảnh pha với vectơ trường mũi tên của hệ phương
trình: (
x0 = y
y0 = sin x

Với điều kiện ban đầu khác nhau như sau: x (0) = 1, y(0) = 0;
x (0) = −1, y(0) = 0; x (0) = π, y(0) = 1; x (0) = −π,
y(0) = 1; x (0) = 3π, y(0) = 0.2; x (0) = 3π, y(0) = 1; x (0) = 3π,
y(0) = 1.8; x (0) = −2π, y(0) = 1; . (Hình 7.8).
>restart; with(DEtools):
>sys:= diff(x(t), t)=y(t), diff(y(t), t)=sin(x(t));
>DEplot({sys},[x(t), y(t)],t= 0..4*Pi,[[0,1,0],[0, -1, 0],
[0,Pi,1],[0,-Pi,1],[0,3*Pi, .2],[0, 3*Pi, 1],[0, 3*Pi,
1.8], [0, -2*Pi, 1]], stepsize = .1, linecolor = black);

Hình 7.8. Ảnh pha vectơ trường mũi tên của hệ phương trình vi phân

Ví dụ 7.18. Dựng ảnh pha cho hệ phương trình


(
x 0 = 3x + y,
y0 = y − x

với điều kiện ban đầu như trong lệnh sau đây:(Hình 7.9)

Hình 7.9. Lệnh phaseportrait vẽ pha cho hệ phương trình


7.6. Vi phân của hàm nhiều biến 219

>restart; with(DEtools):
>sys:=diff(x(t),t)=3*x+y, diff(y(t),t)=-x+y:
>phaseportrait([sys],[x(t),y(t)],t=-10 ..10,[[0,1,-2],
[0,-3,-3], [0,-2,4], [0,5,5], [0,5,-3], [0, -5, 2],
[0, 5, 2], [0, -1, 2]], x=-30..30,y= 20..20,
stepsize = .1, colour = blue, linecolor = black);

7.6. Vi phân của hàm nhiều biến


Đa số bài toán vi tích phân cho hàm nhiều biến đều dùng cùng
một hàm trong Maple, chỉ có khác là có các thông số tùy chọn khác
đi một chút hoặc thêm ra.
Đạo hàm riêng
Tính đạo hàm riêng của hàm nhiều biến f ( x1 , ..., xn ) vẫn dùng
hàm diff. Khi đó lệnh có dạng
diff(f,x1$n1, x2$n2,...,xm$nm);
Các x1,x2,...,xm là biến số để lấy đạo hàm $ để chỉ lấy bậc mấy,
∂2 f
ví dụ diff(f,x,y) là .
∂x∂y
∂ ∂ x
Ví dụ 7.19. A. Tính và của hàm số f = arctan .
∂x ∂y y
>f:=arctan(x/y):
>iff(f,x)=simplify(diff(f,x));
∂ x y
arctan = 2
∂x y x + y2
>Diff(f,y)=simplify(diff(f,y));
∂ x x
arctan = − 2 .
∂x y x + y2

B. Đạo hàm riêng theo từng biến u = z xy


>u:=z^(x*y): diff(u,x); diff(u,y);diff(u,z);
z(xy) xy
z(xy) y ln z, z xy x ln x,
z
>factor(diff(u,z$2));
z(xy) xy( xy − 1)
z2
x−y
C. Tính tất cả đạo hàm riêng bậc hai của hàm số f ( x, y) = .
x+y
220 Chương 7. Maple với phương trình vi phân

>restart; f:=(x-y)/(x+y):
>Diff(f,x$2)=simplify(diff(f,x$2));
∂2 x − y
 
y
2
= −4
∂x x+y ( x + y )3
>Diff(f,y$2)=simplify(diff(f,y$2));
∂2 x − y
 
x
=4
∂y2 x + y ( x + y )3
>Diff(f,x,y)=diff(f,x,y);
∂2 x−y x−y
 
=2
∂x∂y x + y ( x + y )3

Cực trị địa phương và điều kiện tối ưu của hàm nhiều biến
Để nghiên cứu cực trị địa phương và điều kiện tối ưu dùng hàm
trong thư viện chuẩn:
>extrema(f,{cond},{x,y,...},’s’):
Ở đây cond là những điều kiện ràng buộc, nó có thể cho bằng dạng
đẳng thức. Sau đó là các biến có trong hàm f . Nếu không viết điều
kiện ràng buộc thì Maple tìm nghiệm địa phương. Sẽ có nhiều điểm
cực trị, muốn biết cực đại hoặc cực tiểu dùng subs để tính từng điểm
và so sánh. Tiện hơn dùng lệnh:
>maximize(f,{x1,x2,...,xn},range);
>minimize(f,{x1,x2,...,xn},range);
Ví dụ 7.20. Tìm cực trị của hàm f ( x, y) = 2x4 + y4 − x2 − 2y2 .
>restart: readlib(extrema):
>f:=2*x^4+y^4-x^2-2*y^2:
>extrema(f,{},{x,y},’s’);
−9
{0, }
9
>s;
1 −1
{{ x = 0, y = 0}, { x = , y = 0}, { x = , y = 0}, { x = 0, y = 1},
2 2
1 1
{ x = 0, y = −1}, { x = , y = 1}, { x = , y = −1},
2 2
−1 −1
{x = , y = 1}, { x = , y = −1}}
2 2
−9
Ta nhận hai gái trị f max = 0 và f min = . Dễ thấy rằng điểm (0, 0)
8
đạt cực đại hàm số. Còn lại những điểm ta có thể thử để tìm tọa độ
cực tiểu:
7.6. Vi phân của hàm nhiều biến 221

>subs([x=1/2,y=1],f);
−9
8
>subs([x=1/2,y=0],f);
−1
8
>subs([x=0,y=1],f);
−1

Như vậyta có các  cực trịđịa phương sau: f max = (0, 0) và


 điểm
1 1 9
f min = f ± ± 1 = f ± ∓ 1 = − .
2 2 8

Ví dụ 7.21. Tính giá trị lớn nhất và nhỏ nhất của hàm số f ( x, y) =
x2 + 2xy − 4x + 8y trong hình chữ nhật x = 0, y = 0, x = 1, y = 2.

>restart: readlib(maximize):readlib(minimize):
>f:=x^2+2*x*y-4*x+8*y:
>maximize(f,{x,y},{x=0..1,y=0..2});
17
>minimize(f,{x,y},{x=0..1,y=0..2});
−4

Ta có f max = 17 và f min = −4.

Ví dụ 7.22. Tìm cực trị có điều kiện của hàm số f ( x, y) = xy + yz


với x2 + y2 = 2, x + y = 2, x > 0, y > 0, z > 0.

>restart: readlib(extrema): f:=x*y+y*z:


>assume(x>0);assume(y>0);assume(z>0);
>simplify(extrema(f,{x^2+y^2=2,y+z=2},{x,y,z},’s’));
5 3√
 
2, − − 3
2 2
>s;
{{ x = −1, y = 1, z = 1}, { x = 1, y = 1, z = 1},
1 1p 1p 1 1p 5
{x = − − (3), y = (3) − , z = − (3) + },
2 2 2 2 2 2
1p 1 1 1p 5 1p
{x = (3) − , y = − − (3), z = + (3)}
2 2 2 2 2 2

5 3√
Ta có f max = 2 và f min = − − 3. Dễ thấy rằng
2 2
222 Chương 7. Maple với phương trình vi phân

>subs(s[1],f);
0
>subs(s[2],f);
2
>subs(s[3],f);
5 3√
− + 3
2 2
>subs(s[4],f);
5 3√
− − 3
2 2
vậy f max = f (−1, 1, 1) = 2 và f min = f (s[4]) = 0;

Ví dụ 7.23. Với giá trị nào của biến để hàm số f ( x, y, z) = x + 2y + 3z


đạt cực đại trong điều kiện x + 2y − 3z ≤ 4; 5x + 6y + 7z ≤ 8; 9x +
10z ≤ 11 và các biến đều dương.
>restart: with(simplex):
>f:=-x+2*y+3*z:
>cond:={x+2*y-3*z<=4, 5*x-6*y+7*z<=8,9*x+10*z<=11}:
>maximize(f,cond,NONNEGATIVE );
x = 0, y = 20 , z = 11
73

10

7.7. Tích phân của hàm nhiều biến


RRR
Để tính tích phân chập D
f ( x, y)dxdy trong Maple dùng lệnh
Doubleint(f(x,y),D), ở đây D là miền tích phân được viết dưới dạng
sau đây:
• x=x1..x2, y=y1..y2 ở đây x1,x2,y1,y2 xác định hình chữ nhật
miền tích phân.
• x=f1(y)..f2(y), y=y1..y2, ở đây f1(y), f2(y) là hai đường biên của
miền tích phân trái và phải của khoảng từ y1 đến y2.
• x=x1..x2, y=g1(x)..g2(x), ở đây g1(x), g2(x) là hai đường biên
của miền tích phân dưới và trên của khoảng từ x1 đến x2.
RRR
Để tính tích phân chập ba V
f ( x, y, z)dxdydz trong Maple dùng
lệnh Tripleint(f(x,y,z),x,y,z,V);, ở đây V là miền tích phân.
Để tính tích phân lặp lại vẫn dùng lệnh int.

R4 Ry y3
Ví dụ 7.24. A. Tính tích phân lặp lại 2
dy 0
dx vẫn dùng
x 2 + y2
lệnh int.
7.8. Giải tích vectơ 223

>Int(Int(y^3/(x^2+y^2),x=0..y),y=2..4)=
int(int(y^3/(x^2+y^2), x=0..y),y=2..4);
R 4 R y y3 14
2
dy 0 2 2
dx = π
x +y 3
RR
B. Tính tích phân D
sin( x + 2y)dxdy với miền tích phân y = 0,
π π π
y = x, x + y = .Nghĩa là D = {( x, y) : y ≤ x ≤ − y, 0 ≤ y ≤ }.
2 2 2
>restart: with(student):
>J:=Doubleint(sin(x+2*y), x=y..Pi/2-y, y=0..Pi/2);
R 12 π R 1 π −y
0 y
2
sin( x + 2y)dxdy.
>J:=value(%);
2
J :=
3
R1 R1 R2
C. Tính tích phân chập ba −1 dx x2 dy 0 (4 + z)dz.

>J:=Tripleint(4+z, y=x^2..1,x=-1..1, z=0..2);


R1 R1 R2
−1 dx x2 dy 0 (4 + z ) dz
>J:=value(%);
40
J :=
3

7.8. Giải tích vectơ


Các phép toán trong giải tích vectơ ta có thể dùng các lệnh trong
gói lệnh LinearAlgebra.
Một gradient của hàm số f ( x, y, z) là một vectơ mà tọa độ của
nó tương tứng với  các đạo hàm
 riêng theo từng biến. Nghĩa là
∂f ∂f ∂f
grand f ( x, y, z) = , , . Trong Maple được tính bằng lệnh
∂x ∂y ∂z
grad(f,[x,y,z],c);, ở đây f là hàm số [x,y,z] là các biến phụ thuộc.
Đối số c là tính vi phân trong các hệ tọa độ cong khác nhau (mặc
định là hệ Đề các.) Ta có thể tính theo hệ coords=cylindrical, co-
ords=spherical.

y
Ví dụ 7.25. A. Cho hàm số u( x, y) = arctan . Tính grad u( x, y). Góc
x
tạo lên với trục tọa độ là bao nhiêu. Hãy tính đạo hàm của u( x, y)
theo chiều vectơ q = [1, 1].
224 Chương 7. Maple với phương trình vi phân

>restart: with(linalg):
>u:=arctan(y/x): g:=simplify(grad(u,[x,
  y]));
y x
g := − 2 ,
x + y2 x 2 + y2
>alpha:=simplify(angle(g, [1, 0])); 
y
α := π − arccos  q 
( x2 + y2 ) x2 +1 y2

>beta:=simplify(angle(g,[0, 1])); 
y
β := arccos  q 
2 2 1
( x + y ) x 2 + y2

B. Côsin của những góc này là cosin hướng grad u( x, y). Ta chỉ ra
rằng tổng bình phương của nó bằng 1.
>simplify(cos(alpha)^2+cos(beta)^2);
1
C. Đạo hàm của hàm u theo hướng q bằng tích của grad của hàm
∂u q
này với vectơ chuẩn của q: = ( grad, e), với e = là chuẩn hóa
∂q ||q||
của q.
q:=vector([1,1]);e:=normalize(q);
1√ 1√
 
q := [1, 1], e = 2, 2
2 2
>udq:=simplify(dotprod(g,e)); √
1 2(−y + x )
udq :=
2 x 2 + y2

Tích phân kỳ của một hàm vectơ F ( x, y, z) gọi là một hàm (vô
∂Fx ∂Fy ∂Fz
hướng) tính theo công thức: div F ( x, y, z) = + + Trong
∂x ∂y ∂z
Maple tính theo lệnh diverge(F,[x,y,z],c);, ở đây F là hàm vectơ và
[x,y,z] là các biến phụ thuộc của hàm trên.
Rot của hàm vectơ F ( x, y, z) là một vectơ với tọa độ
     
∂Fz ∂Fy ∂Fx ∂Fz ∂Fy ∂Fx
rot F = − , − , −
∂y ∂z ∂z ∂x ∂x ∂y

Trong Maple công thức được tính bằng lệnh curl(F,[x,y,z],c);.


7.8. Giải tích vectơ 225

Ví dụ 7.26. Cho hàm vectơ F ( x, y, z) = [ x2 yz, xy2 z, xyz2 ]. Tính div F


và rot F
>F:=vector([x^2*y*z, x*y^2*z, x*y*z^2]);
>div F:=diverge(F, [x, y, z]);
div F := 6xyz
>rot F:=curl(F, [x, y, z]);
rot F := [ xz2 − xy2 , x2 x − xz2 , y2 z − x2 z]

Một toán tử Laplacian trên hàm số f ( x, y, z) theo công thức


∂2 f ∂2 f ∂2 f
∆ f = 2 + 2 + 2 . Nó được tính trong Maple là
∂x ∂y ∂z
laplacian(f,[x,y,z],c).
Ví dụ 7.27. Với giá trị nào của a, hàm số u = x3 + axy thỏa mãn điều
kiện Laplacian ∆u = 0?
>u:=x^3+a*x*y^2:
>Delta(u):=laplacian(u, [x,y]);
∆( x3 + axy2 ) := 6x + 2ax
>a=solve(%=0,a);
a = −3
e−kr + ekr
Ví dụ 7.28. Chứng minh rằng u = , ở đây
r
r = x2 + y2 + z2 thỏa mãn phương trình vi phân sau: ∆u − k2 u = 0
p

với k là hằng số.


>u:=(exp(-k*r)+exp(k*r))/r:
>Delta(u):=simplify(laplacian(u, [r, theta,phi],
coords=spherical));
k2 e−2kr + 1 ekr
 −kr 
+ ekr

e
∆ :=
r r
>simplify(%-k^2*u);
0
Một vectơ hàm F ( x, y, z) có tính bằng ma trận Jacobian.
 
∂Fx ∂Fy ∂Fz
 ∂x ∂x ∂x 
 x ∂Fy ∂Fz 
 ∂F 
J= 
 ∂y ∂y ∂y 
 ∂F
x ∂F ∂F 
y z
∂z ∂z ∂z
được tính bằng lệnh jacobian(F,[x,y,z]);
226 Chương 7. Maple với phương trình vi phân

Ví dụ 7.29. Tính ma trận Jacobian và định thức của vectơ v =


[ x, y/x ].
>v:=vector([x, y/x]): jacobian(v,
" # [x, y]);
1 0
− xy2 1
x
>det(%);
1
x

7.9. Chuỗi và tích vectơ


b
Tính tổng hữu hạn và vô hạn ∑ S(n) được tính bằng lệnh
n= a
sum(expr, n=a..b) ở đây expr là một biểu thức có chỉ số lấy tổng,
a..b là cận trên và dưới n = a, n = b.

Ví dụ 7.30. Tính tổng đầy đủ và tổng N thành phần của chuỗi với
1
số hạng chung là .
(3n − 2)(3n − 1)
>restart: a[n]:=1/((3*n-2)*(3*n+1));
1
an :=
(3n − 2)(3n − 1)
>S[N]:=Sum(a[n], n=1..N)=sum(a[n], n=1..N);
N 1 1 1 1
S N := ∑ =− +
n=1 (3n − 2)(3n − 1) 3 3N + 1 3
>S:=limit(rhs(S[N]), N=+infinity);
1
S :=
3

Nếu cần tính tổng của chuỗi, thì thay cận trên bằng đại lượng
infinity.

Ví dụ 7.31. A. Chuỗi sau đây hội tụ tới hàm nào ∑ (−1)n+1 n2 x n ?
n =1

>Sum((-1)^(n+1)*n^2*x^n, n=1..infinity)=
sum((-1)^(n+1)*n^2*x^n, n=1..infinity);
∞ x (− x + 1)
∑ (−1)n+1 n2 x n =
n =1 ( x + 1)3
∞ (1 + x ) n
B. Tính tổng của chuỗi ∑ .
n=0 ( n + 1) n!
7.9. Chuỗi và tích vectơ 227

>Sum((1+x)^n/((n+1)*n!), n=0..infinity)=
sum((1+x)^n/((n+1)*n!), n=0..infinity);
∞ (1 + x ) n e(x+1) (1 − e(− x−1) )
∑ =
n=0 ( n + 1) n! x+1

C. Tính tổng đa thức ∑ Cn4 (1 − x )n .
n =0

>Sum(binomial(n,4)*(1-x)^n, n=1..infinity)=
sum(binomial(n,4)*(1-x)^n, n=1..infinity);
∞ (1 − x )4
∑ Cn4 (1 − x )n =
n =0 x5

b
Tương tự tính tích ∏ P(n) bằng lệnh product(P(n),n=a..b); và
n= a
hiển công thức Product(P(n),n=a..b);.
∞ n3 − 1
Ví dụ 7.32. Tính tích vô hạn ∏ 3
.
n =2 n + 1

>Product((n^3-1)/(n^3+1),n=2..infinity)=
product((n^3-1)/(n^3+1), n=2..infinity);
∞ n3 − 1 2
∏ 3 =
n =2 n + 1 3

Phân tích hàm thành chuỗi lũy thừa và chuỗi Taylor


Phân tích hàm số f ( x ) thành dãy lũy thừa trong lân cận tại một
điểm a là

f ( x ) = C0 + C1 ( x − a) + C2 ( x − a)n + · · · + O( x n )

Trong Maple được thực thiện bằng lệnh series(f(x), x=a, n);, ở đây
a là một điểm mà lân cận của nó tiến hành khai triển, n số số hạng
của chuỗi.
Lệnh taylor(f(x), x=a, n); khai triển hàm f(x) tại lân cận của
x=a đến bậc n-1 theo công thức Taylor.
Ta muốn kết quả khai triển ở dạng đa thức, bỏ phần dư đi, dùng
lệnh convert(%,polynom);.

Ví dụ 7.33. A. Khai triển thành chuỗi hàm số f ( x ) = e− x x + 1 tại
lân cận điểm x0 = 0 đến bậc 5.
228 Chương 7. Maple với phương trình vi phân

>f(x)=series(exp(-x)*sqrt(x+1), x=0, 5);


1 1 13 79 4
f ( x ) = 1 − x − x2 + x3 − x + O( x5 )
2 8 48 384
2 R x − t2
B.Vẽ đồ thị hàm sai số er f ( x ) = √ e dt và khai triển nó thành
π 0
dãy Taylor trong lân cận 0.
>erf1 := x->(2/sqrt(Pi))*int_0^x*e^(-t^2)*dt:
>taylor(erf(x),x,8): p:=convert(%,polynom);
(2 √1π x − 2/3 √1π x3 + 1/5 √1π x5 − 1/21 √1π x7
>plot({erf(x),p},x=-2..2,thickness=[2,2],
linestyle=[1,3], color=[red,green]);

Hình 7.10. Đồ thị hàm sai số er f ( x )

Hàm nhiều biến f ( x1 , x2 , ..., xn ) có thể khai triển theo dãy Taylor
theo biến ( x1 , x2 , ..., xn ) tại lân cận điểm ( a1 , a2 , ..., an ). Trong Maple
dùng lệnh mtaylor(f(x), [x1,. . . ,xn],n);. Lệnh này nằm trong gói
lệnh, nên ta gọi vào trước readlib(mtaylor);.
Ví dụ 7.34. Khai triển theo dãy Taylor hàm f ( x, y) = sin( x2 + y2 )
tại lân cận (0, 0) đến bậc 6.
>readlib(mtaylor):
>f=mtaylor(sin(x^2+y^2), [x=0,y=0], 7);
1 1 1 1
f = x 2 + y2 − x 6 − y2 x 4 − y4 x 2 − y6
6 2 2 6
Khai triển hàm theo dãy Fourier
Giả sử ta muốn khai triển hàm 2l chu kỳ f ( x ) trên đoạn [ x1 , x2 ].
Khi đó công thức Fourier là
∞ ∞
a0 kπx kπx
f (x) = + ∑ ak cos + ∑ bk sin
2 k =1
l k =1
l
7.9. Chuỗi và tích vectơ 229

x1 − x1 1 Rx2 1 Rx2 kπx


ở đây l = ; và a0 = f ( x )dx; ak = f ( x ) cos dx;
2 l x1 l x1 l
1 Rx2 kπx
bk = f ( x ) sin dx. Ta xây dựng thủ tục như sau
l x1 l

>fourierseries:=proc(f,x,x1,x2,n)
local k, l,a, b, s;
l:=(x2-x1)/2;
a[0]:=int(f,x=x1..x2)/l;
a[k]:=int(f*cos(k*Pi*x/l),x=x1..x2)/l;
b[k]:=int(f*sin(k*Pi*x/l),x=x1..x2)/l;
s:=a[0]/2+sum(a[k]*cos(k*Pi*x/l)+
b[k]*sin(k*Pi*x/l),k=1..n);
end;
Sử dụng thủ tục trên fourierseries(f,x,x1,x2,n); f là hàm cần
khai triển; x là biến độc lập; x1, x2 là khoảng cách; n là số hạng cần
khai triển.
x
Ví dụ 7.35. Khai triển theo Fourier hàm số f ( x ) = với chu kỳ 2π
2
trên đoạn [0; 2π ] chứa 6 số hạng của chuỗi. Vẽ một đồ thị khai triển
và đồ thị đúng (Hình 7.11).

Hình 7.11. Đồ thị hàm khai triển theo Fourier

>f:=x/2:x1:=0:x2:=2*Pi:
>fr:=fourierseries(f,x,x1,x2,6);
1 1 1
f r := π − sin( x ) − sin(2x ) − sin(3x )
2 2 3
1 1 1
− sin(4x ) − sin(5x ) − sin(6x )
4 5 6
230 Chương 7. Maple với phương trình vi phân

>plot({fr,f}, x=x1..x2, color=[blue,black],


thickness=2, linestyle=[3,1]);

Hình 7.11 là hình ảnh khai triển hàm đường phân giác của góc
tọa độ và hàm gần đúng của nó theo Fourier.

π sin kx
f (x) =
2 ∑ k
.
k =1

Ví dụ 7.36. Phân tích hàm f ( x ) = e− x sau thành chuỗi Fourier một


số bậc khác nhau với chu kỳ 2π trên khoảng [π, −π ] theo số hạng
của 2, 4 và 8. Dựng trên cùng một hệ tọa độ các hàm phân tích trên:
>f:=exp(-x);x1:=-Pi;x2:=Pi: fr1:=fourierseries(f,x,x1,x2,2):
fr2:=fourierseries(f,x,x1,x2,4):
fr3:=fourierseries(f,x,x1,x2,8):
>plot({f,fr1,fr2,fr3},x=x1..x2,color=[black, blue,
green, red], thickness=2, linestyle= [1,3,2,2]);

Hình 7.12. Các đồ thị của một hàm khai triển theo Fourier với bậc
khác nhau

7.10. Biến đổi tích phân


Trong Maple có gói lệnh inttrans chứa đựng các lệnh biến đổi
tích phân khác nhau.
Biến đổi Fourier
Biến đổi Fourier trực tiếp hàm f ( x ) được tính theo công thức sau
Z ∞
F (k) = f ( x )e−ikx dx.
−∞
7.10. Biến đổi tích phân 231

Trong Maple là lệnh fourier(f(x),x,k); ở đây x là biến phải biến đổi,


k là biến mới như đối số biến đổi.
Biến đổi Fourier ngược lại cho bằng công thức
Z ∞
1
f (x) = F (k )eikx dk.
2π −∞

Công thức trong Maple là invfourier(F(k),k,x);.

Ví dụ 7.37. A. Cho hàm số f ( x ) = e−a| x| , a > 0, tính biến đổi Fourier


của nó?
>restart:with(inttrans): assume(a>0):
>fourier(exp(-a*abs(x)),x,k);
a∼
2
a ∼2 + k 2
1
B. Cho hàm F (k ) = , a > 0 Tính biến đổi Fourier ngược.
k2 − a2
>invfourier(1/(k^2-a^2),k,x);
sin ( a x ) (−2 Heaviside ( x ) + 1)
1/2
a
Ở đây (
1 x > 0,
Heaviside( x ) =
0 x<0

Nếu f ( x ) chỉ trên phần dương x > 0 thì ta dùng dạng biến đổi
Fourier kiểu sin và cosin. Sau đây là công thức biến đổi Fourier sin:
r Z ∞ r Z ∞
1 1
F (k) = f (k ) sin kxdx và f ( x ) = F (k ) sin ktdk..
2π −∞ 2π −∞

Do x và k đối xứng nên trong Maple có thể dùng một trong hai cách:
fouriersin(f(x),x,k) hoặc fouriersin(F(k),k,x).
Hoàn toàn tương tự cho biến đổi Fourier côsin:
r Z ∞ r Z ∞
1 1
F (k) = f (k ) cos kxdx và f ( x ) = F (k ) cos ktdk..
2π −∞ 2π −∞
Trong Maple cũng có fouriercos(f(x),x,k) và fouriercos(f(x),k,x).

Ví dụ 7.38. Cho hàm số f ( x ) = e−ax sin bx, a > 0, tìm biến đổi sin,
côsin Fourier:
232 Chương 7. Maple với phương trình vi phân

>f:=exp(-a*x)*sin(b*x):
>fouriercos(f,x,k); !
√ k+b b−k 1
2 1/2 2
+ 1/2 2

a ∼2 + ( k + b ) a ∼2 + ( b − k ) π
>fouriersin(f,x,k);

  −1   −1 
2 2 2 2 √1
1/2 2a a + (b − k) − a + (k + b) π

Biến đổi Laplace


Biến đổi Laplace của hàm f ( x ) được tính theo công thức
Z ∞
F ( p) = f ( x )e− px dx.
0

Trong Maple có lệnh laplace(f(x),x,p);. Hàm biến đổi ngược là


Z a+i∞
1
f (x) = F ( p)e px dp.
2iπ a−i∞

Trong Maple thực hiện bằng lệnh invlaplace(F(p),p,x).

Ví dụ 7.39. A. Tìm biến đổi Laplace của f ( x ) = cos ax sinh bx.


>restart:with(inttrans):
>F(p)=laplace(cos(a*x)*sinh(b*x), x, p);
b p2 − a2 − b2
F ( p) =   
( p + b )2 + a2 ( p − b )2 + a2

1
B.Tìm hàm gốc của biến đổi Laplace: F ( p) = , a > 0.
p2 + 2ap
>assume(a>0): invlaplace(1/(p^2+2*a*p),p,x):
>combine(%,trig);
1 − e−2 a ∼ x
1/2
a∼

7.11. Bài tập có lời giải


. 7.1. Tính đạo hàm f ( x ) = sin3 2x − cos3 2x.
∂24 x 2
. 7.2. Tính biểu thức (e ( x − 1)).
∂x24
sin2 x π
. 7.3. Tính đạo hàm bậc hai của y = tại điểm x = ; x = π.
2 + sin x 2
7.11. Bài tập có lời giải 233

. 7.4. Giải phương trình vi phân y( x ) = ( x + 1)(y0 ( x ))2 và thể hiện


các nghiệm thành những biến riêng.

. 7.5. Giải phương trình vi phân với a, b là các số thực.


ay( x )
y0 ( x ) = − bx3 y( x )2
x
y0 ( x )
. 7.6. Giải phương trình với điều kiện ban đầu y00 ( x ) + = x.
x
1
với y(1) = , y(2) = b và dùng hàm odetest để kiểm tra lại nghiệm
9
phương trình.

. 7.7. Giải phương trình vi phân y00 ( x ) = 3y( x ) + sin( x ) tìm nghiệm
tổng quát và nghiệm riêng với giá trị ban đầu y(0) = 0, y0 (0) = 1;
tìm nghiệm với tùy chọn method = laplace và method =series; vẽ các
đường cong của tất cả các loại nghiệm trên cùng hệ trục tọa độ.
1
. 7.8. Vẽ đồ thị nghiệm của bài toán Cauchy y00 ( x ) = +
y2 ( x )
x3 , y(0) = 1, y0 (0) = 1. Làm hoạt hình có frame=40.
R 3x4 + 4
. 7.9. Tính tích phân dx
x 2 ( x 2 + 1)3
R∞ 1 − e−ax2
+
. 7.10. Tính tích phân đặc biệt 2 dx với a > −1.
0 xe x
R cos x
π/4
. 7.11. Tính tích phân xác định dx chính xác đến 15 chữ số
π/6 x
sau dấu thập phân.
Rπ dx
. 7.12. Tính tích phân bằng cách đổi biến tan( 2x ) = t.
0 3 + 2 cos x
. 7.13. Giải phương trình tích phân Volterra loại 2
Zx
y( x ) = (t − x − 1)y(t)dt + x.
0

. 7.14. Giải phương trình tích phân Volterra loại 1


Z x
(s − bx )y(s)ds = x3 − 1.
1
234 Chương 7. Maple với phương trình vi phân

. 7.15. Giải phương trình tích phân Fredholm loại 2


Z b
y( x ) = e x+s y(s)ds + x.
0

. 7.16. Giải phương trình tích phân Fredholm loại 1


Z 5
x2 + 4x = ( x2 t + xt2 )z(t)dt.
0

7.12. Bài tập tự giải


R x3 − 6
. 7.17. Tính tích phân không xác định dx.
x4 + 6x2 + 8
R∞ sin( ax ) cos(bx )
+
. 7.18. Tính tích phân đặc biệt dx với a > 0, b > 0
0 x
với các trường hợp a > b, a = b, a < b.
2
0,2
R sin(3x )e− x
. 7.19. Tính giá trị số của dx.
0,1 x4

. 7.20. Tính đạo hàm theo từng bước tích phân từng phần:
π/2
R
cos xdx.
0

π/2
R dx
. 7.21. Tính tích phân bằng cách đổi biến
0 5 − 4 sin x + 3 cos x
x
tan = t.
2
. 7.22. Tìm nghiệm tổng quát của phương trình vi phân:

y00 − 2y0 − 3y = xe4x sin x.

. 7.23. Tìm nghiệm hệ cơ sở của nghiệm phương trình vi phân

y000 + y00 = 1 − 6x2 e− x .

. 7.24. Tìm nghiệm của phương trình:

y000 − y0 = tan x, y(0 = 3), y0 (0) = −1, y00 (0) = 1.


7.12. Bài tập tự giải 235

. 7.25. Tìm nghiệm của hệ phương trình vi phân


(
x 00 + 5x 0 + 2y0 + y = 0,
3x 00 + 5x + y0 + 3y = 0

với điều kiện ban đầu là x (0) = 1, x 0 (0) = 0, y(0) = 1.

. 7.26. Tìm nghiệm của phương trình phi tuyến y00 + y = y2 với điều
kiện ban đầu y(0) = 2a, y0 (0) = a dưới dạng triển khai chuỗi lũy
thừa đến bậc 6.

. 7.27. Vẽ đồ thị nghiệm số của bài toán Côsi y0 = sin( xy), y(0) = 1.

. 7.28. Giải nghiệm số bài toán Côsi y00 = xy0 − y2 , y(0) = 1, y0 (0) =
2. Tính nghiệm xấp xỉ phương trình này phân tích theo chuỗi bậc 5.
Vẽ hình các nghiệm của phương trình trên cùng trục tọa độ.

. 7.29. Xây dựng đồ thị nghiệm số bài toán Côsi y00 − xt0 + xy = 0,
y(0) = 1y0 (0) = −4 trên đoạn [−1.5; 3] bằng cách dùng lệnh DEplot.

. 7.30. Dựng ảnh pha của hệ phương trình vi phân sau:


(
x 0 = 3x − 4y,
y0 = x − 2y

với một số điều kiện ban đầu nào đó.

. 7.31. Tìm cực trị có điều kiện của hàm

f ( x, y, z) = y2 + 4z2 − 4yz − 2xz − 2xy, với 2x2 + 3y2 + 6z2 = 1

. 7.32. Tìm giá trị biến mà hàm tuyến tính f ( x, y, z) = x + y + z đạt


giá trị cực đại, nếu chúng thỏa mãn x + y ≤ 2, z ≤ 1.

. 7.33. Tính tích phân chập ba


Z e −1 Z e − x −1 Z x +y+e
ln(z − x − y)dz
dx dy dx
0 0 e ( x − e)( x + y − e)
236 Chương 7. Maple với phương trình vi phân
CHƯƠNG 8
LỜI GIẢI VÀ GỢI Ý BÀI TẬP

8.1. Lời giải bài tập chương 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237


8.2. Lời giải bài tập chương 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
8.3. Lời giải bài tập chương 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
8.4. Lời giải bài tập chương 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
8.5. Lời giải bài tập chương 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
8.6. Lời giải bài tập chương 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
8.7. Lời giải bài tập chương 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

8.1. Lời giải bài tập chương 1


. 1.1. >combine((sin(Pi/8))^4+ . 1.5. Thực hiện lệnh
(cos(3*Pi/8))^4+(sin(5*Pi/8))^4 >eq:=(x+1)*(x-1)*(x^2-x+1)
+ (cos(7*Pi/8))^4); *(x^2+x+1);
3 eq := ( x + 1)( x − 1)( x2 − x + 1)
2 ( x 2 + x + 1)
>expand(eq);
. 1.2. Nhập vào x6 − 1
>cos(Pi/3)+tan(14*Pi/3);
3√ . 1.6. >p:=x^5-x^4-7*x^3+x^2+6*x;
− 3 p := x5 − x4 − 7x3 + x2 + 6x
2
>factor(p);
x ( x − 1)( x − 3)( x + 2)( x + 1)
. 1.3. Thực hiện lệnh
>eq:=a^2-b^2=c;
. 1.7. >f:=(a^4-b^4)/((a^2+b^2)*a*b);
eq := a2 − b2 = c a4 − b4
>lhs(eq); f := 2
( a + b2 ) ab
a2 − b2
>normal(f);
>rhs(eq); a2 − b2
c ab

. 1.8. Đặt phương trình


. 1.4. Thực hiện lệnh >eq:=(cos(x)-sin(x))
>f:=(a^2+b)/(2*a-b); *(cos(x)+sin(x)):
a2 + b >simplify(eq);
>numer(f); 2 cos2 x − 1
a2 + b
>denom(f); . 1.9. >factor(x^3+4*x^2+2*x-4);
2a − b ( x + 2)( x2 + 2x − 2)
238 Chương 8. Lời giải và gợi ý bài tập

. 1.10. Đưa vào phương trình 2x,
 x < −1
>eq:=(1+sin(2*x)+cos(2*x))/ f := x − x2 , x≤1
(1+sin(2*x)-cos(2*x)): 

0, 1<x
>convert(eq, tan):
>eq=normal(%);
1 + sin(2x ) + cos(2x ) 1 . 1.14. >z:=3+I*2:
= >Re(z);Im(z);
1 + sin(2x ) − cos(2x ) tan( x )
3, 2
w:=conjugate(z);
. 1.11. Thiết lập phương trình w := 3 − 2i
>eq:=3*(sin(x)^4+cos(x)^4)
-2*(sin(x)^6+cos(x)^6):
. 1.15. >a:=57/13:
>eq=combine(eq, trig);
>y:=frac(a);
3 sin( x )4 + 3 cos( x )4 ) − 2 sin( x )6 5
+2 cos( x )6 = 1.
13
>x:=trunc(a);
. 1.12. >f:=sqrt(1-x^2-y^2); 4
f = (1 − x 2 − y2 )
p
>x+y;
>f:=subs({x=rho*cos(phi), 57
y=rho*sin(phi)},f); 13
p
f = 1 − ρ2 cos(φ)2 − ρ2 sin(φ)2
>f:=simplify(%); . 1.16. >z:=(2-3*I)/(1+4*I)+I^6:
>Re(z); Im(z);
p
f = 1 − ρ2
27

17
. 1.13. >f:=piecewise(x<-1, x, 11

-1<=xand x<1, -x^2, x>=1, -x); 17
x < −1 >w:=conjugate(z);
 x,

27 11
f := − x2 , −1 − x ≤ 0 và x − 1 < 0 w := − + I
 17 17

− x, 1 ≤ x >z+w;
54
>%+x: simplify(%); −
17

8.2. Lời giải bài tập chương 2

. 2.1. Đưa vào hệ phương trình >x1+x2; y1+y2;


>eq:={x^2-y^2=1,x^2+x*y=2};
>s:=solve(eq,{x,y}); . 2.2. >x=fsolve(x^2=cos(x),x);
2√ 1√ x = .8241323123
s := { x = 3, y = 3},
3 3
2√ 1√
{x = − 3, y = − 3}, . 2.3. Nhập vào lệnh
3 3
>x1:=subs(s[1],x): >F:=solve(f(x)^2-2*f(x)=x,f);
y1:=subs(s[1],y): F := proc( x )
>x2:=subs(s[2],x): RootO f (_Z2 − 2 ∗ _Z − x )end
y2:=subs(s[2],y): >f:=convert(F(x),√radical);
f := 1 + 1 + x
8.2. Lời giải bài tập chương 2 239

. 2.4. >_EnvAllSolutions:=true: x := π, d2y(π ) = 1


>solve(5*sin(x)+12*cos(x)=13,x); >x:=Pi/2;d2y(x)=d2;
1
x := π
. 2.5. >Limit(sin(2*x)/x,x=0); 2
sin(2x ) 1 −5
lim d2y( π ) =
x →0 x 2 9
>limit(sin(2*x)/x,x=0);
2 . 2.11. >readlib(iscont):
>readlib(discont):
. 2.6. Nhập vào lệnh Lim và lim >iscont(exp(1/(x+3)),
>Limit((1-x)*tan(Pi*x/2),x=1)= x=-infinity..+infinity);
limit((1-x)*tan(Pi*x/2),x=1); >discont(exp(1/(x+3)),x);
πx 1
lim (1 − x ) tan =2 .
x →1 2 π . 2.12. >readlib(singular):
>iscont(tan(x/(2-x)),
. 2.7. nhập vào lệnh x=-infinity..infinity);
Limit(arctan(1/(1-x)),x=1,left)= >singular(tan(x/(2-x)),x);
limit(arctan(1/(1-x)),x=1,left);
1 1
lim arctan =π . 2.13. >readlib(extrema):
x →1− 1−x 2
Limit(arctan(1/(1-x)),x=1,right)= >y:=(x^2-1/2)*arcsin(x)/2+x*
limit(arctan(1/(1-x)),x=1,right); sqrt(1-x^2)/4- Pi*x^2/12:
1 1 >extrema(y,{},x,’s’);s;
lim arctan = −π
x →1− 1−x 2
>readlib(maximize):
. 2.8. Nhập vào >readlib(minimize):
>Diff(sin(2*x)^3-cos(2*x)^3,x)= >ymax:=maximize(y,{x});
diff(sin(2*x)^3-cos(2*x)^3,x);
  >ymin:=minimize(y,{x});
d 3 3
dx (sin (2 x )) − (cos (2 x )) =
2 . 2.14. >f:=x^2*ln(x):
6 (sin (2 x )) cos (2 x ) +
>maximize(f,{x},{x=1..2});
6 (cos (2 x ))2 sin (2 x ) >minimize(f,{x},{x=1..2}):
>simplify(%);
. 2.9. >Diff(exp(x)*(x^2-1),x$24)=
diff(exp(x)*(x^2-1),x$24)
d24
. 2.15. >restart:y:=x^3/(4-x^2):
ex x2 − 1 = ex x2 − 1 +
 
dx24 >readlib(extrema):
48 ex x + 552 ex >readlib(maximize):
>collect(%, exp(x)); >readlib(minimize):
d24 x x2 − 1 2 + 551 + 48 x ex
 
dx 24 e = x >extrema(y,{},x,’s’);s;
>d2:=diff(y,x$2):
. 2.10. >y:=sin(x)^2/(2+sin(x)): >x:=0: d2y(x):=d2;
d2:=diff(y,x$2): >x:=2*sqrt(3):d2y(x):=d2;
>x:=Pi; d2y(x)=d2; >x:=-2*sqrt(3):d2y(x):=d2;
240 Chương 8. Lời giải và gợi ý bài tập

8.3. Lời giải bài tập chương 3

. 3.1. >expand((a+b+c)*(a^2+b^2 >x1:=subs(s[1],x):y1:=subs(s[1],y):


+c^2-a*b-b*c-c*a)); x2:=subs(s[2],x):y2:=subs(s[2],y):
a3 + b3 + c3 − 3abc. >x1+x2; y1+y2;

. 3.2. >factor(x^10-x^8-2*x^7 . 3.9. >x=fsolve(x^2=cos(x),x);


-x^6-x^4+x^2+2*x+1); x = .8241323123
( x − 1)( x + 1)( x2 − x + 1)
( x2 − x − 1)( x2 + x + 1)2 . . 3.10. >F:=solve(f(x)^2-2*f(x)=x,f);
F := proc( x )
. 3.3. Dùng hàm chuyển. RootO f (_Z2 − 2 ∗ _Z − x )end
>convert(cos(Pi/30),radical); >f:=convert(F(x), radical);
1√ p √ 1 1√ √ f := 1 + sqrt(1 + x )
2 5+ 5+( + 5) 3.
8 8 8

. 3.4. >factor(sum(k^2,k=1..n)); . 3.11. >_EnvAllSolutions:=true:


1 >solve(5*sin(x)+12*cos(x)=13,x);
n(n + 1)(2n + 1
 
5
6 arctan + 2π_Z
12
. 3.5. Phân tích số nguyên.
ifactor(product(2*k-1,k=1..50)); . 3.12. >solve(13*x^3-25*x^2
(3)26 (5)12 (7)8 (11)5 (13)4 (17)3 (19)3 -x^4-129*x+270>0,x);
2 2 2
(23) (29) (31) (37)(41)(43)(47)(53) RealRange(Open(−3), Open(2)),
(59)(61)(67)(71)(73)(79)(83)(89)(97) RealRange(Open(5), Open(9))

. 3.6. >factor((x+y)^5-x^5-y^5); . 3.13. >solve(exp(2*x+3)<1,x);


5xy( x + y)(y2 + xy + x2) RealRange(−∞, Open(− 32 ))
>factor((x + y)^7-x^7-y^7);
7xy( x + y)(y2 + xy + x2 )2 . 3.14. a)
> solve(abs((3*x+1)/(x-3)}<3,x) ;
. 3.7. >is((a^2 + b^2)*(c^2+ d^2) RealRange(−∞, Open( 4 )).
=(a*c+b*d)^2+(a*d-b*c)^2); 3
b) > solve(1/(2-x)+5/(2+x)<1,x) ;
true
RealRange(−∞, Open(−2)),
RealRange(Open(2), ∞)
. 3.8. Tính tổng nghiệm của các
biến. >eq:={x^2-y^2=1,x^2+x*y=2};
>_EnvExplicit:=true:
. 3.15. >solve({(x- 1)/2-( 2*x+3)/3
+x/6<2-(x+5)/2,
>s:=solve(eq,{x,y});
2√ 1√ l-(x+5)/8+(4-x)/2<3*x-(x+1)/4},x);
s := { x = 3, y = 3},
3 3 7
2√ 1√ { < x, x < 2}
{x = − 3, y = − 3} 9
3 3
Tính tổng chọn nghiệm Như vậy nghiệm nguyên chỉ là 1.
8.4. Lời giải bài tập chương 4 241

8.4. Lời giải bài tập chương 4

. 4.1. >with(linalg): >transpose(A);


 
>a:=([2,1,3,2]); 2 6 5
b:=([1,2,-2,1]); −2
5 3
 
a := [2, 1, 3, 2], b := [1, 2, −2, 1]
>dotprod(a,b); 7 4 −3
0 >inverse(A);
 
> phi=angle(a,b); 1 −1 1
π −38 41 −34
 
φ=
2
27 −29 24
>det(minor(A,2,2));
. 4.2. >restart; with(linalg):
−41
>a:=([2,-2,1]); b:=([2,3,6]);
a := [2, −2, 1], b := [2, 3, 6]
>c:=crossprod(a,b); . 4.6. >A:=matrix([[8,-4,5,5,9],
c := [−15, −10, 10] [1,-3,-5,0,-7], [7,-5,1,4,1],
>dotprod(a,c); [3,-1,3,2,5]]):
0 >r(A)=rank(A);
r ( A) = 3
. 4.3. >restart; with(linalg):
>a:=vector([1,2,3,4,5,6]): . 4.7. >exponential([[3,-1],[1,1]]);
" #
>norm(a,2); √ 2e2 −e2
91 e2 0

. 4.4. >with(linalg):restart; . 4.8. >A:=matrix([[5,1,4],[3,3,2],


>A:=matrix([[4,3],[7,5]]): [6,2,10]]):
>B:=matrix([[-28,93],[38,-126]]): >P(A)=evalm(A^3-18*A^2+64*A);
 
>C:=matrix([[7,3],[2,1]]): 64 0 0
>F:=evalm(A&*B&*C);
" # P( A) =  0 64 0 
 
3 0
F= 0 0 64
0 2
>Det(A)=det(A); Det(B)=det(B);
Det(C)=det(C);Det(F)=det(F); . 4.9. >U:=matrix([[3,2-I],[2+I,7]]):
Det( A) = −1, Det( B) = −6, >eigenvectors(U);
Det(C ) = 1, Det( F ) = 6 [ 8, 1, {[ 52 − 15 I, 1]}], [2, 1, {[−2 + I, 1]}].

. 4.5. >A:=matrix([[2,5,7], . 4.10. Đưa vào Ma trận


[6,3,4], [5,-2,-3]]); >A:=matrix([[3,-I,0],[I,3,0],
  [0,0,4]]):
2 5 7
>eigenvectors(A);
A = 6 3 4 
 
[2, 1, {([1, − I, 0])}], [4, 2,
5 −2 −3 {([0, 0, 1]), ([− I, 1, 0])}]
>Det(A)=det(A); >P(lambda):=charpoly(A,lambda);
Det( A) = −1 P(λ) = λ3 − 10λ2 + 32λ − 32
242 Chương 8. Lời giải và gợi ý bài tập

>d(lambda):=minpoly(A,lambda); . 4.12. >eq:={2*x-3*y+5*z+7*t=1,


d(λ) = 8 − 6λ + λ2 4*x-6*y+2*z+3*t=2,
>jordan(A);   2*x-3*y-11*z-15*t=1}:
2 0 0 >s:=solve(eq,{x,y,z});
11
0 4 0 s := {z = − t, y = y,
 
8
0 0 4 3 1 1
x = y− t+ }
2 16 2
. 4.11. >A:=matrix([[1,-3,4], >subs({y=1,t=1},s);
[4,-7,8],[6,-7,7]]):
>j:=jordan(A);
  . 4.13. >A:=matrix([[1,2],[3,4]]):
3 0 0 >B:=matrix([[3,5],[5,9]]):
j : = 0 −1 1 
 
>X:=linsolve(A,B);
" #
0 0 −1 −1 −1
X := .
>g:=gausselim(A);   2 3
1 −3 4
0 5 −8 
 
g :=  . 4.14. Nhập vào ma trận
3
 
0 0 − >A:=matrix([[1,1,0],[0,2,-1],
5 [1,3,-1]]):
>F(A):=charmat(A,lambda);
  >r(A):=rank(A);
λ−1 3 −4
r ( A) := 2
F ( A ) : =  −4 λ+7 −8 
 
>d(A):=rowdim(A)-r(A);
−6 7 λ−7 d( A) := 1
>ffgausselim(A); >k(A):=kernel(A);
>gausselim(A); k ( A) := {[−1, 1, 2]}

8.5. Lời giải bài tập chương 5


. 5.1. Lệnh và hình 8.1
>plot(sin(x)/x, x=-4*Pi..4*Pi, labels=[x,y],
labelfont=[TIMES,ITALIC,12], thickness=2);

Hình 8.1. Lời giải bài 5.1 Hình 8.2. Lời giải bài 5.2

. 5.2. Lệnh và hình 8.2


>plot(x/(x^2-1),x=-3..3,y=-3..3,color=magenta);
8.5. Lời giải bài tập chương 5 243

. 5.3. Lệnh và hình 8.3


>plot([sin(2*t),cos(3*t),t=0..2*Pi],axes=boxed,color=blue);

. 5.4. Lệnh và hình 8.4


>plot(1+cos(x), x=0..2*Pi, title="Cardioida",
coords=polar, color=coral, thickness=2);

Hình 8.3. Lời giải bài 5.3 Hình 8.4. Lời giải bài 5.4

. 5.5. >plot([ln(3*x-1), 3*x/2-ln(2)], x=0..6,


scaling=constrained, color=[violet,gold],
linestyle=[1,2], thickness=[3,2]);

Hình 8.5. Lời giải bài 5.5 Hình 8.6. Lời giải bài 5.6

. 5.6. >with(plots):
>implicitplot(x^2/4-y^2/2=16, x=-20..20,
y=-16..16, color=green, thickness=2);

. 5.7. >with(plots):
>eq:=x^2/16+y^2/4=1:
>el:=implicitplot(eq, x=-4..4, y=-2..2, scaling=constrained,
color=green, thickness=3):
>as:=plot([4*cos(t)^3,2*sin(t)^3, t=0..2*Pi], color=blue,
scaling=constrained, thickness=2):
>eq1:=convert(eq,string):
>t1:=textplot([1.5,2.5,eq1],font=[TIMES,ITALIC,10],align=RIGHT):
244 Chương 8. Lời giải và gợi ý bài tập

>t2:=textplot([0.2,2.5,"Ellips:"],font=[TIMES,BOLD,10],align=RIGHT):
>t3:=textplot([1.8,0.4,Astroida],font=[TIMES,BOLD,10],align=LEFT):
>display([as,el,t1,t2,t3]); (Hình 8.7)

Hình 8.7. Lời giải bài 5.7 Hình 8.8. Lời giải bài 5.8

. 5.8. >with(plots):
>inequal({x+y>0, x-y<=1, y=2}, x=-3..3, y=-3..3,
optionsfeasible=(color=red),
optionsopen=(color=blue,thickness=2),
optionsclosed=(color=green, thickness=3),
optionsexcluded=(color=yellow) ); (Hình 8.8)

. 5.9. >plot3d({x*sin(2*y)+y*cos(3*x), sqrt(x^2+y^2)-7},


x=-Pi..Pi, y=-Pi..Pi, grid=[30,30], axes=frameD,
color=x+y); (Hình 8.9)

Hình 8.9. Lời giải bài 5.9 Hình 8.10. Lời giải bài 5.10

. 5.10. >plot3d(1/(x^2+y^2)+0.2/((x+1.2)^2+(y-1.5)^2)+
0.3/((x-0.9)^2+(y+1.1)^2), x=-2..2, y=-2..2.5,
view=[-2..2, -2..2.5, 0..6], grid=[60,60],
shading=none, light=[100,30,1,1,1], axes=none,
orientation=[65,20], style=patchcontour); (Hình 8.10)
8.5. Lời giải bài tập chương 5 245

. 5.11. with(plots): implicitplot3d(x^2+y^2+z^2=4,


x=-2..2, y=-2..2, z=-2..2, scaling=constrained); (Hình 8.11)

Hình 8.11. Lời giải bài 5.11 Hình 8.12. Lời giải bài 5.12

. 5.12. >spacecurve([sin(t),cos(t),exp(t)], t=1..5,


color=blue, thickness=2, axes=boxed); (Hình 8.12)

. 5.13. Với lệnh animate vẽ xong ta có thể nhấn vào nút trên thanh công
cụ để hình hoạt động, hoặc vào trình đơn plot–>animation–>play hình sẽ
chuyển động (Hình 8.13).
>animate3d(cos(t*x)*sin(t*y),x =-Pi..Pi,y=-Pi..Pi,t=1..2);

Hình 8.13. Hoạt hình chuyển Hình 8.14. Ví dụ vẽ đồ thị hàm


động theo ẩn số phụ

. 5.14. Ta định nghĩa hai hàm số (Hình 8.14)


> x:=t->t+sin(2*t): y:=t->t+sin(3*t):
Và vẽ theo ẩn số phụ
> plot([x(t),y(t),t=-2*Pi..2*Pi],color=black, scaling=constrained);

. 5.15. Ta định nghĩa hàm đối số (Hình 8.15)


>x:=t->int(sin(u^2/2),u=0..t): x:=t->int(cos(u^2/2),u=0..t):
>plot([x(t),y(t),t=-10..10],color=black,scaling=constrained);
246 Chương 8. Lời giải và gợi ý bài tập

Hình 8.15. Đồ thị xoắn Cornu Hình 8.16. Đồ thị xoắn Cornu Spi-
Spiral ral

2

. 5.16. Đồ
√ thị hàm r = 1/θ được vẽ bằng hai hàm thông số r = 1/ θ và
r = −1/ θ (Hình 8.16).
>polarplot([sqrt(1/theta),-sqrt(1/theta)], theta=0..10*Pi,
>color=black,view=[-3..3,-1..1],scaling=constrained);

. 5.17. Dùng thông số tọa độ cực để vẽ (Hình 8.17).


with(plots);
plot(exp(cos(theta))-2*cos(4*theta)+sin((1/12)*theta)^5,
theta=0 ..24*Pi,coords=polar,color=black,scaling=constrained);

Hình 8.17. Đồ thị con bướm

. 5.18. Ta định nghĩa các hàm x, y, z như sau:


>x:=(s,t)->(7+cos(1/3*s-2*t)+2*cos(1/3*s+t))*sin(s):
>y:=(s,t)->(7+cos(1/3*s-2*t)+2*cos(1/3*s+t))*cos(s):
>z:=(s,t)->sin(1/3*s-2*t)+2*sin(1/3*s+t):
Ta vẽ bằng hàm 3 chiều ploy3d (Hình 8.18).
> plot3d([x(s,t),y(s,t),z(s,t)],s=-Pi..Pi,t=-Pi..Pi,
grid=[40,40],axes=boxed,scaling=constrained);
8.5. Lời giải bài tập chương 5 247

Hình 8.18. Đồ thị Umbilic Torus

. 5.19. Ta chuyển về phương trình thông số (Hình 8.19)

x = 4 sec t cos r, y = 2 sec t sin r, z = tan t,

π π
− < t < , −π ≤ r ≤ π.
2 2
π
Vì sec t và tan t không xác định tại t = ± , ta vẽ đồ thị dùng plot3d trong
h π πi h π πi 2
miền nhỏ − , và − , .
2 2 3 3
>x:=‘x’:y:=‘y’:z:=‘z’:
>x:=(t,r)->4*sec(t)*cos(r):
>y:=(t,r)->2*sec(t)*sin(r):
>z:=(t,r)->tan(t):
>plot3d([x(t,r),y(t,r),z(t,r)],t=-Pi/3..Pi/3,r=-Pi..Pi,axes=boxed);

Hình 8.19. Đồ thị Hyperboloid


248 Chương 8. Lời giải và gợi ý bài tập

8.6. Lời giải bài tập chương 6

. 6.1. >SETOFDIGITS:=proc (x) trị đúng nghĩa là phòng mở và


return({seq(ITHDIGIT(x, i), sai là phòng đóng. Trước tiên
i=1 ..length(x))}) ta đóng tất cả các phòng lại.
end: >LOCKERS:=proc (n)
>SETOFDIGITS(166); local X, j, k;
1, 6 X:=array([seq(false, k=1..n)]);
for j from 2 to n do
. 6.2. >SUMMM:=proc () for k from j to n do
local t, k; if (k mod j) = 0 then
t:=0; for k by 2 to 101 do X[k]:=not(X[k]) if;
t:=t+(-1)^((1/2)*k-1/2)*k^5; od; od;
od; for k to n do
end; if not(X[k]) then
>SUMMM(); print(k,"is open.") fi;
5515099251 od;
end:
. 6.3. >SECTIONSUM:=proc () >LOCKERS(100);
local total, k; total:=0;
for k to 1000 do 1, "is open."
if (k mod 3)<>0 and (k mod 5)<>0 4, "is open."
then total:=total+k; 9, "is open."
fi od; 16, "is open."
return(total); 25, "is open."
end: 36, "is open."
>SECTIONSUM(); 49, "is open."
266332 64, "is open."
81, "is open."
100, "is open."
. 6.4. >MAXILIST:=proc (X)
local maxime, k;
maxime:=X[1]; . 6.6. >HARMONIC:=proc (n)
for k to nops(X) do local sum, k;
if maxime < X[k] then sum:=0; k:=0;
maxime:=X[k] fi; while sum <= n do
od; sum:=sum+1/(k+1);
return(maxime); k:=k+1
end: od;
>X:=[-10, -90, 98, 2]: return(k);
>MAXILIST(X); end:
98 >HARMONIC(10);
12367
. 6.5. Ta dùng một mảng n chiều
chứa trạng thái đóng/mở của phòng . 6.7. >FIRSTPRIME:=proc ()
mà có thể thay đổi chúng. Giá local k;
8.6. Lời giải bài tập chương 6 249

for k from 1000000001 by 2 >VARIANCE:= proc (X)


while not(isprime(k)) do od; sum((X[i]-MU(X))^2,i=1..
return(k) nops(X)))/nops(X)
end; end:
>FIRSTPRIME(); >A:= [2, 6, 7, 1]:
1000000007 >VARIANCE(A);
>nextprime(1000000001); 13
1000000007 2
. 6.12. >SWAP2:= proc (x, y)
. 6.8. >REVERSELIST:=proc (X) local x1, y1;
local Y, left, right, temp; x1:= x+y; y1:= x; x1:= x1-y1;
Y:=X; left:=1; right:=nops(X); return(x1, y1);
while left < right do end:
temp:=Y[left];Y[left]:=Y[right]; >SWAP2(6, 99);
Y[right]:=temp; 99, 6
left:=left+1; right:=right-1;
od; . 6.13. >SUMDIGITS:= proc (x)
eval(Y); return(sum(ITHDIGIT(x, i),
end: i = 1 .. length(x)))
>REVERSELIST([1, 2, 5]); end:
[5, 2, 1] >SUMDIGITS(2156);
14
. 6.9. >COLLATZ:=proc(n)
. 6.14. Ta chú ý rằng a − ( amod10)
x:=n;
là xóa chữ số cuối cùng và thay nó
for k from 1 while x >1 do
bẳng 0. Như vậy ( a − amodb)/10
print(x);
là xóa chữ số cuối cùng. Số
if x mod 2 =1 then x:=3*x +1;
nguyên ITHDIGIT (b, length(n)) ∗
else x:=x/2; fi;
od; 10( length(b) − 1) có các chữ
end; số như b và có cùng chữ
số trái nhất của b. Như vậy
b − ITHDIGIT (b, length(n)) ∗
10( length(b) − 1) là xóa đi chữ số
. 6.10. >A:= {1, 2, 3, 4};
đầu tiên của b.
>B:= {3, 4, 5, 6};
>PEELER:= proc (x)
>f:=x->x/(x^2+1):
local a, b;
>map(x->f(x),A minus B) union
a:= x;
map(x->f(x), B minus A);
b:=(1/10)*a-(1/10)*(a mod 10);
{1/2, 2/5, 5/26, 6/37}
return(b-ITHDIGIT(b, length(b))
>map(x->f(x),(A minus B) union
*10^(length(b)-1));
(B minus A));
end:
{1/2, 2/5, 5/26, 6/37}
>PEELER(98666635);
866663
. 6.11. >MU:= proc (X)
sum(X[i],i=1..nops(X)))/nops(X) . 6.15. >ABSVAL:=proc(x,y)
end: if x>=0 then return(x)
250 Chương 8. Lời giải và gợi ý bài tập

else return(-x) fi; . 6.18. >TWINPRIMES:=proc()


end; local count,k;
count:=0;
. 6.16. >PRIMES:=proc(N) for k from 1 to 1000000 do
for k from 1 to N do if isprime(k) and isprime(k+2)
print(ithprime(k)) od; then count:=count +1; fi;
end; od;
return(count);
. 6.17. >MAXI3:=proc(x,y,z)
end;
local MAXI;
MAXI:= proc (a, b)
if b <= a then return(a) . 6.19. >KUREPA:=proc(A)
else return(b) fi; local a;
end; for a to A do
if z <= MAXI(x, y) then if gcd(sum(factorial(k),k=0..a-1),
MAXI(x, y) else z fi; factorial(a))<>2 then
end: print(’a’ = a) fi;od;
>MAXI3(67, 543, 98); end:
543 a=1

8.7. Lời giải bài tập chương 7


. 7.1. >Diff(sin(2*x)^3-cos(2*x)^3,x) =diff(sin(2*x)^3-cos(2*x)^3,x);

(sin(2x )3 − cos(3x )3 ) = 6 sin(2x )2 cos(2x ) + 6 cos(2x )2 sin(2x )
∂x

. 7.2. >Diff(exp(x)*(x^2-1),x$24)= diff(exp(x)*(x^2-1),x$24):


>collect(%,exp(x));
∂24 x 2
(e ( x − 1)) = e x ( x2 + 48x + 551).
∂x24

. 7.3. >y:=sin(x)^2/(2+sin(x)): d2:=diff(y,x$2):


>x:=Pi; d2y(x)=d2;
x := πd2y(π ) = 1
>x:=Pi/2;d2y(x)=d2;
1 1 −5
x := π, d2y( π ) =
2 2 9

. 7.4. >ode := y(x) = (x+1)*diff(y(x), x)^2;


d
y( x ) = ( x + 1)( y( x ))2
dx
>qw := dsolve(ode);
>y1 := qw[1]; y2 := simplify(qw[2]); y3 := simplify(qw[3]);
y1 := y( xp
)=0
1 + x + ( x + 1)(1 + _C1)
y2 := y( x ) =
x+1
8.7. Lời giải bài tập chương 7 251
p
−1 − x + ( x + 1)(1 + _C1)
y3 := y( x ) =
x+1

. 7.5. >restart;
>eq := diff(y(x), x) = a*y(x)/x-b*x^3*y(x)^2:
>dsolve(eq);
a+4
y( x ) = 4
x b + x − a _C!a + 4x − a _C1

. 7.6. >ode := diff(y(x), ‘$‘(x, 2))+(diff(y(x), x))/x = x:


>qw := dsolve({ode, y(1) = 1/9, y(2) = b});
1 1 (9b − 8) ln( x )
qw := y( x ) = x3 +
9 9 ln(2)
>g := rhs(qw):
>odetest(qw, ode), y(1) = eval(g, x = 1), y(2) = eval(g, x = 2);
1
0, y(1) = , y(2) = b
9

. 7.7. >ode := diff(y(x), x$2) = 3*y(x)+sin(x):


>dsolve(ode, y(x));
√ √ 1
y( x ) = e 3x _C2 + e− 3x _C1 − sin x
4
>w := ode, y(0) = 0, (D(y))(0) = 1:
>y1 := dsolve({w}, y(x)): z1 := rhs(y1);
5 √ √3x 5 √ −√3x 1
z1 = 3e − 3e − sin x
24 24 4
>y2 := dsolve({w}, y(x), method = laplace): z2 := rhs(y2);
1 5p √
z2 := − sin( x ) + (3)sinh( 3x )
4 12
>y3:= dsolve({w},y(x),series): z3:= rhs(convert(y3,polynom));
2 11 5
z3 := x + x3 + x
3 120
>u := x = -3 .. 3; s1 := plot(z1, u, color = "Red"):
s2 := plot(z2, u, color = "Black"):
s3 := plot(z3, u, color = "Blue"):
plots[display]([s1, s2, s3], thickness = 2); (Hình 8.20).

. 7.8. (Hình 8.21 và 8.22) >restart:


>q := dsolve({diff(y(x), x$2) = 1/y(x)^2+x^3, y(0) = 1,
D(y)(0) = 1}, numeric, range = -4..2):
>plots[odeplot](q, thickness = 2, color = "Black");
>plots[odeplot](q, thickness = 2, color = "Black", frames = 40);

. 7.9. >Int((3*x^4+4)/(x^2*(x^2+1)^3),x)=
int((3*x^4+4)/(x^2*(x^2+1)^3),x);
R 3x4 + 4 1 57 25 x 4 x
dx = −4 − arctan( x ) − −
x 2 ( x 2 + 1)3 x 8 8 x 2 + 1 7 ( x 2 + 1)2
252 Chương 8. Lời giải và gợi ý bài tập

Hình 8.20. Nghiệm của phương trình vi phân giải bằng phương pháp
khác nhau.

Hình 8.21. Nghiệm của Hình 8.22. Hoạt hình của


phương trình vi phân nghiệm phương trình vi
thường. phân thường, ảnh thứ 23.

. 7.10. >restart; assume(a>-1);


>Int((1-exp(-a*x^2))/(x*exp(x^2)),x=0..+infinity)=
int((1-exp(-a*x^2))/(x*exp(x^2)),x=0..+infinity);
+∞ 2
1 − e− a∼ x 1
Z
2 dx = ln( a ∼ +1)
xe x 2
0

. 7.11. >Int(cos(x)/x,x=Pi/6..Pi/4)=
evalf(int(cos(x)/x,x=Pi/6..Pi/4),15);

π/4
cos x
Z
dx = .322922981113732
x
π/6

. 7.12. >with(student):
>changevar(tan(x/2)=t,
R∞ Int(1/(3+2*cos(x)), x=0..Pi),t);
1
0 2 (3+2 cos(2 arctan(t)))(1+t2 )
dt
>value(%);
8.7. Lời giải bài tập chương 7 253

1 √
π 5
5

. 7.13. >restart;
>equ := y(x) = Int((t-x-1)*y(t), t = 0 .. x)+x:
>intsolve(equ, y(x));
2√ −1x 1√
 
y( x ) = 3e 2 sin 3x
3 2

. 7.14. >restart:
>rew := int((s-b*x)*y(s), s = 1..x) = (x^3-1):
>simplify(intsolve(rew, y(x)));
2b−1
3(2bx − 2x + x − b−1 b)
y( x ) = −
(b − 1)(3b − 2)

. 7.15. >restart:
>eq := y(x) = Int(exp(x+s)*y(s), s = 0..b)+x:
>intsolve(eq, y(x));
2(1+ e b b − e b ) e x
y( x ) = x − −3+e2b
.

. 7.16. >restart:
>eq := x^2 + 4*x = Int((x^2*t + x*t^2)*z(t), t = 0..5);
>intsolve(eq, z(x));  
5 4 1
z( x ) = − _C1 + − _C1 x2 + _C1x.
4 625 6
254 Chương 8. Lời giải và gợi ý bài tập
PHỤ LỤC A
GIAO DIỆN CỦA Maple 17

Trong phần này sẽ giới thiệu cách cài đặt Maple 17 trên Win-
dows, các giao diện chính của phần mềm này trong Windows, cũng
như cách điều hành và khai thác Maple.

A.1. Cài đặt Maple 17


A.1.1. Yêu cầu tối thiểu đối với máy PC khi cài đặt
Để thuận tiện cho người đọc, chúng tôi chỉ trình bày cách cài đặt
bộ chượng trình Maple 17. Chương trình Maple 17 với tệp cài đặt
trên 450 Mb. Đây là chương trình thương mại, có bản dành cho các
trường đại học giá rẻ. Các bạn có thể vào địa chi sau đây để tham
khảo.
http://www.maplesoft.com/products/maple/
Trang Web này có đầy đủ tài liệu về phiên bản mới nhất của Maple,
bạn có thể đặt mua qua mạng.
Ở Việt nam cũng có một số trang web trao đổi và học tập Maple
trên mạng như :
http://maplevn2008.wordpress.com/
Trang này có các bài giảng, mã nguồn và trao đổi học tập Maple.
http://www.vnmath.com/
Trang này có bài trao đổi về cài đặt và sử dụng phần mềm Maple.
Phần cứng máy tính chạy được WindowXP hoặc Windows 7.
Tệp cài đặt Maple17windowsInstaller.exe khoảng trên 500Mb.

A.1.2. Thủ tục cài đặt


1. Nhấn đúp vào tệp Maple17windowsInstaller.exe chương trình
khởi động hoạt động.
2. Chương trình hỏi hệ điều hành 32 bit hay 64 bit, tùy vào máy
của bạn để trả lời cho đúng.
3. Khi cài xong và khởi động lại chương trình hỏi mã bạn mua
bản quyền và khóa sử dụng.

A.1.3. Biểu tượng kích hoạt và các thư mục


Việc cài đặt thành công chúng ta sẽ có biểu tượng Maple, chú ý
biểu tượng Maple dùng chạy chương trình chính, còn các thông tin
khác các bạn có thể tự tìm hiểu.

255
256 Thực hành tính toán trong Maple

Hình A.1. Biểu tượng Hình A.2. Maple trên


Maple trên Desktop Menu:Start

Khi cài xong chương trình luôn có hai cách khởi động Maple.

A.2. Giao diện của Maple


Giao diện của Maple theo tiêu chuẩn của hệ điều hành Windows,
như vậy các Menu chính, các nút và các thanh dụng cụ có hình dáng,
bố trí và kích hoạt như trong Windows.

Hình A.3. Giao diện chính của Maple 17


A.3. Định dạng dữ liệu đầu vào và đầu ra của Maple 17 257

A.2.1. Cửa sổ Maple chính


Từ nút Start -> Program file -> Maple 17 -> Maple 17, chương
trình khởi động và đưa ra giao diện (Hình A.3):
Có thể khởi động bằng nhấn đúp vào biểu tượng thứ 2 trên
Hình A.1. Giao diện cư Maple theo tiêu chuẩn của Windows nên
dễ dùng và dễ sử dụng. Phần sau ta liệt kê những Menu và nút của
giao diện này.

A.2.2. Các thanh công cụ


Thanh nút công cụ có 2 chế độ: Nếu soạn thảo văn bản như các
nút công cụ chuẩn của Window

Hình A.4. Nút công cụ ở chế độ văn bản

Khi chọn đồ thị đã có thì thanh công cụ là

Hình A.5. Nút công cụ ở chế độ đồ thị

A.3. Định dạng dữ liệu đầu vào và đầu ra của


Maple 17
Khi làm việc tương tác với Maple ta gõ vào các biểu thức và các
lệnh. Maple phân biệt ký hiệu đưa vào theo kiểu toán và theo kiểu
văn bản. Để dùng chung một khuôn khổ ta nên gán trước định dạng.
Ví dụ khi ta đưa biểu thức toán vào mà định dạng bằng kiểu 2D
Math thì không thấy được các nhập vào thế nào như:
Dạng 2D Math
[> b := 2 · x3 + 5 · x2 + 6 · x + 1;
Dạng 1D Math (hoặc Output maple)
[> b:=2*x^3+5*x^2+6*x+1;
Định dạng gõ vào văn bản như các chương trình khác trong Window.
258 Thực hành tính toán trong Maple

A.3.1. Đặt định dạng chung cho tất cả các tệp mới tạo ra
1. Đóng tất cả các tệp đang mở, nếu không đóng thì cách đặt sau
đây chỉ có tác dụng trên tệp đang mở đó và lần sau lại phải đặt lại
theo ý mình.
2. Chọn Tools-->Option ra giao diện Option rồi chọn display

Hình A.6. Định dạng input Maple và 2D Math Output

Trong các ô (Hình A.6):


Input Display: Maple Notation
Output Display: 2-D Math Notation
Sau đó nhấn nút Apply Globally
Từ đây trở đi khi tạo ra tệp mới chương trình sẽ lấy cấu hình ta
vừa gán vào.

A.3.2. Định dạng khi đang soạn thảo


Ngay từ ô đầu tiên soạn thảo tài liệu Maple ta có thể đặt định
dạng trên giao diện từ thanh công cụ của nhó:

A.4. Chuyển đổi các dạng biểu thức toán


Biểu thức toán có thể nhập vào dưới các dạng khác nhau và đầu
ra cũng như vậy. Có các dạng biểu thức như sau:
A.4. Chuyển đổi các dạng biểu thức toán 259

Hình A.7. Định dạng trong khi soạn thảo Maple

A.4.1. Các dạng biểu thức toán


Dạng biểu diễn Ví dụ
x2 − 1
2D Math [r := ;
(11x )2 − 2 · x − 9
x2 − 1
2D Math Input [> r : = ;
(11x )2 − 2 · x − 9
1D Math Input [>r := (x^2-1)/((11^x)^2-2*x-9);

A.4.2. Chuyển từ 1D math sang 2D Math Input


1. Đưa con trỏ nhấp nháy đến vùng biểu thức;
2. Nhấn phím phải chuột và xuất hiện Menu tương tác;
3. Chọn: Conver To --> 2D Math Input
Như hình minh họa dưới đây (Hình A.8):
4. Kết quả như hình A.9.

A.4.3. Chuyển đổi 2D Math Input sang dạng 1D Math


1. Đưa con trỏ nhấp nháy đến vùng biểu thức;
2. Nhấn phím phải chuột và xuất hiện Menu tương tác;
3. Chọn: 2D-Math-->Conver To --> 1D Math Input
Như hình minh họa dưới đây (Hình A.9):
4. Kết quả như hình A.8.

A.4.4. Các chuyển đổi sang LaTeX


Cách thứ nhất: Biểu thức dạng 1D Math.
260 Thực hành tính toán trong Maple

Hình A.8. Chuyển đổi biểu thức 1D Math sang 2D Math Input

Hình A.9. Chuyển đổi biểu thức 2D Math sang 1D Math Input

1. Thực hiện chạy Maple biểu thức,


2. Nhập lệnh [>latex(\%);
3. Kết quả biểu thức dạng LATEX
4. Chép vào hệ soạn thảo TeX (Hình A.10).
Cách thứ hai: Biểu thức dạng 2D Math Input
1. Đưa con trỏ nhấp nháy đến vùng biểu thức;
2. Nhấn phím phải chuột và xuất hiện Menu tương tác;
3. Chọn: Conversion --> LaTeX
Như hình minh họa dưới đây (Hình A.11):
A.5. Lệnh phím tắt quan trọng 261

Hình A.10. Chuyển đổi biểu thức 1D Math sangLATEX

Hình A.11. Chuyển đổi biểu thức 2D Math sang LATEX

Có những chuyển đổi khác đều thực hiện tương tự như chuyển
qua ngôn ngữ C/C++, Fortran,....

A.5. Lệnh phím tắt quan trọng

Phím tắt Chức năng


Enter Thực hiện lệnh.
Ctrl+Space Lấy danh sách lệnh
Esc Lấy danh sách lệnh
Shift+Enter Thêm dòng để gõ tiếp công thức
Tab Đưa con trỏ đến vùng nhập lệnh tiếp theo
Shift+Tab Đưa con trỏ đến vùng nhập lệnh trước đó
262 Thực hành tính toán trong Maple

F3 Chia nhóm thực hiện lệnh.


F4 Gom nhóm thực hiện lệnh.
Ctrl+J Đưa vào nhóm thực hiện sau dấu trỏ.
Ctrl+K Đưa vào nhóm thực hiện trước dấu trỏ.
Ctrl+T Nhập liệu kiểu văn bản (Text).
Ctrl+M Nhập liệu kiểu mã lệnh Maple (Maple Input).
Ctrl+R Nhập liệu kiểu công thức (2D Input).
F5 Chuyển đổi kiểu nhập biểu thức toán.
Ctrl+L Lập nhãn cho Bảng hoặc công thức toán.
Ctrl+B Làm đậm ký tự
Ctrl+I Làm nghiêng ký tự
Ctrl+U Gạch dưới
Ctrl+0 Tỷ lệ phóng màn hình 50%
Ctrl+1 Tỷ lệ phóng màn hình 75%
Ctrl+2 Tỷ lệ phóng màn hình 100%
Ctrl+3 Tỷ lệ phóng màn hình 125%
Ctrl+4 Tỷ lệ phóng màn hình 150%
Ctrl+5 Tỷ lệ phóng màn hình 200%
Ctrl+6 Tỷ lệ phóng màn hình 300%
Ctrl+7 Tỷ lệ phóng màn hình 400%
F9 Hiện khoảng miền lệnh (móc vuông bên trái)
F1 Mở thực đơn trợ giúp (nhấn đúp tắt đi).
F2 Mở thẻ trợ giúp lệnh nơi con trỏ đang đứng.
Ctrl+F1 Bảng mục lục chung trợ giúp.
Ctrl+F2 Bảng chỉ dẫn thao tác chung.
PHỤ LỤC B
THƯ VIỆN GÓI LỆNH CỦA MAPLE 17

B.1. Những chú ý về gói lệnh của Maple 17


Phiên bản Maple17 thiết kế lại nhiều gói lệnh. Các gói lệnh đều
viết đầy đủ từ mà gói lệnh cần làm với chữ hoa đầu tiên.
A. Những gói lệnh sau đây không còn được tiếp tục dùng nữa, thay
vào đó là các gói lệnh với các hàm mạnh và rộng hơn.

Bảng B.1. Các gói lệnh phiên bản cũ được thay thế
Gói lệnh cũ Gói lệnh thay thế
diffalg DifferentialAlgebra
finance Finance
linalg LinearAlgebra và VectorCalculus
networks GraphTheory
polytools PolynomialTools
process Threads
stats Statistics
student Student

B. Muốn xem thông tin gói lệnh nào bạn gõ vào

>?<Tên gói lệnh>;


thì sẽ mở trang trợ giúp thông tin của <Tên gói lệnh>. Ví dụ muốn
xem hướng dẫn gói lệnh LinearAlgebra ta đưa vào
>?LinearAlgebra;
Thì dẫn đến hướng dẫn các hàm của gói lệnh với giải thích và ví
dụ cụ thể của gói lệnh LinearAlgebra.
C. Xem một hàm cụ thể trong gói lệnh

>?<Tên gói lệnh>,<Tên hàm>;


<Tên hàm> có trong gói lệnh <Tên gói lệnh> ví dụ muốn xem lệnh
MatrixAdd của LinearAlgebra ta gõ vào
>?LinearAlgebra,MatrixAdd;

263
264 Thực hành tính toán trong Maple

thì mở trang hướng dẫn của hàm MatrixAdd.


D. Bằng lệnh lấy các hàm ra của gói lệnh ta có thể biết tất cả các
hàm của gói lệnh như

>with(<Tên gói lệnh>);


Khi đó tất cả các hàm của gói lệnh liệt kê có thể dùng được. Để tránh
liệt kê ta dùng kết thúc lệnh bằng : để cho gọn.
E. Muốn không dùng các hàm trong gói lệnh đó thì xóa trong bộ nhớ
bằng lệnh

>unwith(<Tên gói lệnh>);


Những hàm sau đây không tương thích với lệnh trên: algcurves,
combstruct, DEtools, diffalg, difforms, inttrans, liesymm, LRETools,
networks, orthopoly, Physics, simplex, stats, student, tensor.

B.2. Gói lệnh Student


Bộ gói lệnh Student dùng cho các môn toán của Trường Đại học
và Phổ thông. Các thuật toán tính toán trong các môn học được xem
xét đầy đủ và chính xác.

Bảng B.2. Các thành phần gói lệnh Student.


Tên gói lệnh Dùng gói lệnh
Student Tập hợp gói lệnh bao hàm bài
giảng Toán đại học.
Student[Calculus1] Các lệnh trợ giúp dạy và học Giải
tích một biến.
Student[LinearAlgebra] Các lệnh trợ giúp dạy và học Đại
số tuyến tính cơ sở.
Student[MultivariateCalculus] Các lệnh trợ giúp dạy và học Giải
tích nhiều biến.
Student[NumericalAnalysis] Các lệnh trợ giúp dạy và học Giải
tích số cơ sở.
Student[Precalculus] Các lệnh trợ giúp dạy và học Giải
tích.
Student[VectorCalculus] Các lệnh trợ giúp dạy và học Giải
tích vec tơ.
B.3. Danh sách gói lệnh trong Maple 17 265

B.3. Danh sách gói lệnh trong Maple 17

Bảng B.3. Danh sách các gói lệnh của Maple 17.
Tên gói lệnh Chức năng gói lệnh
algcurves Công cụ để nghiên cứu các mặt cong
đại số một triều định nghĩa bởi các
đa thức nhiều biến.
Algebraic Các lệnh thực hiện tính toán với số
đại số.
ArrayTools Công cụ dùng tính toán bậc thấp của
Ma trận, Véc tơ và Mảng
AudioTools Lệnh cho tệp Vào/Ra âm thanh và
thực hiện nó.
Bits Các lệnh thực hiện toán tử bit hiệu
quả.
Cache Các lệnh cho thực hiện bảng nhớ
đệm.
CAD Công cụ liên kết với ứng dụng CAD.
codegen Công cụ cho chuyển đổi thủ tục
Maple sang các ngôn ngữ khác.
CodeGeneration Công cụ chuyển đổi mã Maple sang
các ngôn ngữ khác.
CodeTools Các lệnh cho phân tích và lọc mã
Maple.
ColorTools Các lệnh để làm việc với và chuyển
đổi các mầu sắc.
combinat Các hàm tổ hợp, cùng với tính toán tổ
hợp và hoán vị trong danh sách hoặc
phân hoăchj các số nguyên.
combstruct Các lênh sinh và đếm các cấu trục tổ
hợp
ContextMenu Công cụ để xây dựng và thay đổi
trình đơn tương tác ngữ cảnh.
CUDA Dùng công nghệ CUDA(R) để thực
hiện thủ tục LinearAlgebra.
266 Thực hành tính toán trong Maple

CurveFitting Các lệnh trợ giúp khít mặt cong


Database Các lệnh và ứng dụng Maple cho việc
dùng cơ sở dữ liệu.
DEtools Công cụ để thực hiện, giải và in hình
hệ những phương trình vi phân.
DifferentialAlgebra Các lệnh mà là các khóa đơn giản và
giản ước các hệ những phương trình
vi phân đa thức và tính toán nghiệm
chuỗi lũy thừa hình thức cho chúng.
DifferentialGeometry Các lệnh cho hình học vi phân, Đại
số Li, và Tensơ.
difforms Các lệnh các dạng vi phân.
DiscreteTransforms Các lệnh cho tính toán chuyển đổi
của dữ liệu rời rạc.
DocumentTools Các lệnh cho phép truy nhập các tài
liệu và các thành phần của Maple.
Domains Các lệnh cho tạo miền tính toán.
DynamicSystems Các lệnh dùng tạo, thực thi, mô
phỏng và vẽ hình các đối tượng hệ
thống tuyến tính.
eBookTools Công cụ để chuyển đổi các trang
Maple thành sách dùng DocBook
ExcelTools Các lệnh cho phép truy nhập tới kho
dữ liệu trong định dạng Microsoft
Excel.
ExternalCalling Công cụ để gọi các hàm bên ngoài từ
Maple.
FileTools Các lệnh cho thao tác tệp và xử lý.
Finance Các lệnh cho mô hình tài chính và
tính toán.
GaussInt Các lệnh làm việc với những số
nguyên Gaussian.
genfunc Các lệnh cho thực hiện các hàm sinh
hữu tỷ.
B.3. Danh sách gói lệnh trong Maple 17 267

geom3d Các lệnh cho hình học Euclidean


không gian.
geometry Các lệnh cho không gian Euclidean
hai chiều.
gfun Các lệnh cho thực hiện hàm sinh.
GlobalOptimization Gói lệnh tối ưu toàn cục.
GraphTheory Tập hợp các thủ tục để tạo ra, vẽ
hình, thao tác và kiểm thử đồ thị.
Grid Gói lệnh cho tính toán song song đa
xử lý.
Groebner Các lệnh cho tính toán cơ sở Groeb-
ner trong Đại số kỳ dị.
group Các lệnh làm việc với giao hoán và
thể hiện các nhóm hữu hạn.
hashmset Các lệnh cho multisets
heap Các lệnh trên hip.
HTTP Công cụ lấy dữ liệu từ Web.
ImageTools Công cụ cho xử lý ảnh.
InstallerBuilder Tạo một cài cho hộp Maple.
IntegerRelations Các lệnh cho số phẩy động xấp xỉ
bởi tổ hợp tuyến tính nguyên của các
hằng số ký hiệu.
IntegrationTools Công cụ thực hiện các tích phân.
inttrans Các lệnh làm việc với biến đổi tích
phân và ngược lại.
LargeExpressions Công cụ quản lý tạo ra các dãy tính
toán.
LibraryTools Các lệnh cho thư viện thực hiện và
xử lý.
liesymm Các lệnh đặc trưng các tầng đối xứng
của hệ phương trình đạo hàm riêng.
LinearAlgebra Các lệnh thực hiện Ma trân và Vectơ
như cấu trúc bảng.
268 Thực hành tính toán trong Maple

LinearFunctionalSystems Các lệnh xây dựng nghiệm của hệ


phương trình hàm tuyến tính.
LinearOperators Công cụ để giải phương trình hàm
tuyến tính.
ListTools Công cụ thực hiện danh sách.
Logic Các lệnh cho vận hành biểu thức
dùng lôgic Boolean.
LREtools Các lệnh vận hành, vẽ hình và giải
các phương trình hồi quy tuyến tính.
Magma Tập hợp thủ tục để thực hiện mag-
mas
Maplets Công cụ tạo giao diện người dùng
bằng đồ họa cho Maple.
MathematicalFunctions Công cụ cung cấp thông tin về các
hàm toán học.
MathML Các lệnh đưa vào và đưa ra biểu thức
Maple như là MathML.
Matlab Các lệnh để dễ liên kết với MATLAB.
MatrixPolynomialAlgebra Công cụ cho thực hiện ký hiệu của
ma trân đa thức.
MmaTranslator Công cụ phiên dịch từ Mathematica
thành Maple, biểu thưc, lệnh toán tử
và sách ghi chú.
MTM Tập hợp các lệnh trợ giúp Maple
Toolbox cho MATLAB.
MultiSeries Các lệnh thực hiện tiệm cận và biểu
thức chuỗi trong chia tiệm cận tổng
quát.
numapprox Các lệnh tính toán xấp xỉ đa thức cho
hàm trên một đoạn đã cho.
numtheory Các lệnh cho lý thuyết số cổ điển.
Optimization Các lệnh giải số các bài toán lý thuyết
tối ưu.
B.3. Danh sách gói lệnh trong Maple 17 269

Ore_algebra Các thủ tục cho tính toán cơ sở trong


đại số của toán tử tuyến tính.
OreTools Công cụ thực hiện số học cơ bản trong
đại số giả tuyến tính.
OrthogonalSeries Công cụ cho chuỗi các đa thức trực
giao cổ điển.
orthopoly Các lệnh tạo ra các loại khác nhau
những đa thức trực giao.
padic Các lệnh tính toán xấp xỉ p-adic cho
số thực.
PDEtools Công cụ giải phương trình vi phân
đạo hàm riêng.
Physics Gói lệnh thực hiện tính toán đối
tượng vật lý bằng toán học và các
phép toán của chúng.
plots Các lệnh về thể hiện đồ thị.
plottools Các lệnh sinh ra và thực hiện các đối
tượng đồ thị.
PolynomialIdeals Các lệnh về tính toán với ideal đa
thức.
PolynomialTools Các lệnh về thực hiện đối tượng đa
thức.
powseries Các lệnh tạo ra và thực hiện chuỗi
lũy thừa hình thức thể hiện trong
dạng tổng quát.
priqueue Các hàm hàng đợi ưu tiên.
ProcessControl Các lệnh cho tính toán và điều khiển
quá trình thống kê trực giao.
QDifferenceEquations Các lệnh cho xây dựng nghiệm của
phương trình q-sai phân tuyến tính.
queue Các lệnh cấu trúc dữ liệu hàng đợi.
RandomTools Công cụ làm việc với các đối tượng
ngẫu nhiên.
270 Thực hành tính toán trong Maple

RationalNormalForms Công cụ dùng cho dạng chuẩn hữu tỷ


như cơ sở cho biểu diễn cấu trúc nhỏ
nhất và phân hủy về siêu hình.
RealDomain Cung cấp ngữ cảnh số thực.
RegularChains Công cụ giải hệ phương trình đại số
ký hiệu.
RootFinding Các lệnh trước tìm nghiệm số.
ScientificConstants Các lệnh về truy nhập hằng số vật lý
và các tính chất bảng tuần hoàn hóa
học.
ScientificErrorAnalysis Các lệnh biểu diễn và xây dựng định
lượng số với giá trị và sai số.
Security Công cụ bảo mật Maple.
simplex Các lệnh cho tối ưu tuyến tính dùng
thuật toán đơn hình.
Slode Các lệnh tìm chuỗi lũy thừa hình
thức nghiệm của Phương trình vi
phân thường tuyến tính.
SNAP Các thuật toán số học ký hiệu cho số
học đa thức.
Sockets Công cụ truyền thông mạng trong
Maple.
SoftwareMetrics Các hàm về độ phức tạp mã lượng tử.
SolveTools Các lệnh để giải hệ các phương trình
đại số.
Spread Công cụ làm việc với bảng tốc độ
trong Maple.
stack Các lệnh trên cấu trúc dữ liệu ngăn
sếp.
Statistics Công cụ cho thống kê toán học và
phân tích dữ liệu.
StringTools Các lệnh tối ưu cho thực hiện chuỗi.
SumTools Công cụ tìm dạng đóng của tổng xác
định và bất định.
B.3. Danh sách gói lệnh trong Maple 17 271

sumtools Các lệnh tính toán tổng xác định và


bất định.
tensor Các lệnh tính với Tensơ và ứng dụng
của chúng trong Lý thuyết Tương đối
Tổng quát.
Threads Công cụ lập trình song song.
Tolerances Cung cấp các tính toán với giới hạn
cho phép.
Typesetting Công cụ cho truy nhập ngữ nghĩa
bảng gõ chuẩn và tùy chọn phương
trình 2-D.
TypeTools Các lệnh mở rộng nhận biết loại
trong lệnh loại.
Units Các lệnh chuyển đổi giá trị giữa các
đơn vị đo.
VariationalCalculus Công cụ cho tính toán biến phân.
VectorCalculus Các lệnh thực hiện toán tử giải tích
Vec tơ và nhiều chiều.
Worksheet Công cụ cho sinh ra và thực hiện
trang làm việc Maple.
XMLTools Công cụ dùng các tài liệu XML
272 Thực hành tính toán trong Maple
PHỤ LỤC C
CÁC LỆNH THƯỜNG DÙNG MAPLE

Mỗi lệnh được viết đậm, sau đó giải thích các đối số, tiếp theo nêu
tác dụng của lệnh và một ví dụ.
collect(a,x); Dùng để xếp các số hạng của đa thức vào các nhóm
theo lũy thừa của biến x, trong đó a là 1 đa thức, x là biến.
>collect(a*ln(x)-ln(x)*x-x,ln(x)); ⇒ ( a − x ) ln ( x ) − x
conjugate(expr); Dùng để tìm liên hợp phức của 1 biểu thức,
trong đó expr là 1 biểu thức phức.
>conjugate(3+5*I); ⇒ 3 − 5 i
convert(expr,form); Dùng để chuyển 1 biểu thức về dạng đã cho,
trong đó expr là 1 biểu thức, form là tên dạng của biểu thức.
>convert("XI",arabic); ⇒ 11
cos(x); Dùng để tìm hàm lượng giác cosin, trong đó x là biến.
>cos(Pi/3);⇒ 1/2
cost(a); Dùng để tính số lượng các phép tính trong 1 biểu thức,
trong đó a là 1 biểu thức.
>with(codegen, cost, optimize):
>cost(x+x^2+x^3+x^4);⇒ 3 additions + 6 multiplications
crossprod(u,v); Dùng để tính tích vectơ. Tích vectơ của 2 vectơ,
trong đó u, v là các vectơ.
>with(LinearAlgebra):  
−1
 
>CrossProduct(<1,2,3>,<2,3,4>);⇒  2 


−1
csgn(a); Dùng để xác định dấu của 1 biểu thức số phức, trong đó
a là 1 biểu thức số phức.
>csgn(1-2/3*I); ⇒ 1
degree(a,x); Dùng để xác định bậc của đa thức, trong đó a là 1 đa
thức và x là biến
>degree(x^4-10*x^2+1, x); ⇒ 4
denom(a); Dùng để lấy mẫu số của 1 phân thức, trong đó a là 1
phân thức.
>denom( 2/3 );⇒ 3
depends(f,x); Dùng để xác định tích phân phụ thuộc của f vào
biến x. Nghĩa là trả về "true" nếu tích phân của hàm f phụ thuộc

273
274 Thực hành tính toán trong Maple

vào biến x. Trong đó f là 1 hàm hay 1 danh sách,1 tập các hàm, x
là 1 biến hay 1 tập các biến.
>depends(sin(x)+cos(z),{x,y});⇒ true
det(A); Dùng để tính định thức của ma trận vuông A, trong đó A
là 1 ma trận vuông.  
2 3 1
 
>A := Matrix([[2,3,1],[3,2,3],[0,3,2]]);⇒ A :=  3 2 3

0 3 2
>Det(A) mod 3;⇒ 2
diff(a,x,y,..); Dùng để tính đạo hàm của 1 hàm số, trong đó a là
hàm số, x, y là các biến số.
>diff(exp(x),x);⇒ ex
discont(f,x); Dùng để tìm những điểm gián đoạn của hàm số
thực, trong đó f là hàm số thực, x là biến.
>discont(1/x,x); ⇒ {0}
divide(a,b,’q’); Dùng để kiểm tra tính chia hết của 2 đa thức.
Nghĩa là trả về "true " nếu 2 đa thức chia hết cho nhau và ngược
lại,đồng thời có thể cho biết thương ’q’, trong đó a, b là các đa thức,
q là thương.
>divide(x^3-y^3, x-y, ’q’);⇒ true
>q;⇒ x2 + yx + y2
evalf(x,n); Dùng để tính giá trị thập phân của biểu thức với độ
chính xác đến n chữ số, trong đó x là 1 biểu thức, n là 1 số nguyên.
>evalf(Pi, 6);⇒ 3.14159
exp(x); Dùng để tính hàm số mũ.
>exp(1.379);⇒ 3.970928713
expand(expr, expr1, expr2, ..., exprn); Dùng để khai triển
biểu thức expr nhưng không khai triển các biểu thức con của expr,
trong đó expr là 1 biểu thức, expr1, expr2, ..., exprn là các biểu thức
con của expr.
>expand((x+1)*(y+z), x+1);⇒ ( x + 1) y + ( x + 1) z
factor(a); Dùng để phân tích 1 đa thức ra thừa số, trong đó a là 1
đa thức.
>factor(6*x^2+18*x-24);⇒ 6 ( x + 4) ( x − 1)
frac(x); Dùng để lấy phần thập phân của số x, trong đó x là 1 số.
>frac(-2.4);⇒ −0.4
Gausselim(A); Dùng để đưa ma trận về dạng tam giác bằng phép
khử Gauss, trong đó A là 1 ma trận.
Phụ lục C. Các lệnh thường dùng maple 275
 
1 2 3
 
>A:=Matrix([[1,2,3],[1,3,0],[1,4,3]]);⇒ A := 
 1 3 0 

1 4 3
 
1 2 3
 
>Gausselim(A) mod 5;⇒ 0 1 2

0 0 1

gcd(a,b); Dùng để tìm ước số chung lớn nhất của các đa thức,
trong đó a, b là các đa thức.
>gcd(x^2-y^2,x^3-y^3);⇒ −y + x
GramSchmidt(u1,u2,...,un); Dùng tìm cơ sở trực chuẩn của
không gian sinh bởi một họ vectơ x, trong đó u1, u2, ..., un là các
vectơ.
>with(LinearAlgebra): >w1 := <2,1,0,-1>:
>w2 := <1,0,2,-1>: >w3 := <0,-2,1,0>:
>GramSchmidt([w1,w2,w3],normalized);
 √     √ 
1/3 6 0 2/21 21
√   √   4

 1/6 6  −1/6 2  − 21
 
21  
  , √ ,
  2/3 2  −1/21 21 √  .
 0
√ √
     
−1/6 6 −1/6 2 0
has(f,x); Dùng để kiểm tra xem trong biểu thức f có thành phần
x hay không, trong đó f là 1 biểu thức, x là 1 thành phần.
>has((a+b^3+c)^(4/3), a);⇒ true
icontent(expr); Dùng để tìm ước số chung lớn nhất của các hệ số
của đa thức, trong đó expr là một đa thức.
>icontent(3*x+12*y); ⇒ 3
ifactor(n); Dùng để phân tích số nguyên ra thừa số nguyên tố,
trong đó n là một số nguyên.
>ifactor(60); ⇒ ((2))2 (3) (5)
igcd(x1,x2,...); Dùng để tìm ước chung lớn nhất của các số
nguyên, trong đó x1, x2, ... là các số nguyên.
>igcd( -10, 6, -8 );⇒ 2
ilcm(x1,x2,...); Dùng để tìm bội số chung nhỏ nhất của các số
nguyên, trong đó x1, x2, ... là các số nguyên.
>ilcm( -10, 6, -8 );⇒ 120
Im(x); Dùng để lấy phần ảo của một biểu thức phức, trong đó x là
một biểu thức phức.
>Im(3+4*I);⇒ 4
276 Thực hành tính toán trong Maple

int(f,x); Dùng để lấy tích phân của hàm số, trong đó f là hàm số,
x là biến.
>int(7*x^3+3*x^2+5*x,x);⇒ 7/4 x4 + x3 + 5/2 x2
Inverse(A) mod n Dùng để tính ma trận ngược của ma trận
vuông A theo modulo n, trong đó A là một ma trận vuông, n là
một số nguyên.  
1 2 3
 
>A:=Matrix([[1,2,3],[1,3,0],[1,4,3]]);⇒ A :=  1 3 0

1 4 3
 
4 1 1
 
>B := Inverse(A) mod 5;⇒ B :=  2 0 3 

1 3 1
iquo(m,n); hoặc iquo(m,n,’r’);
Dùng để tìm thương nguyên (của 2 số nguyên) và cho biết số dư r
khi cần, trong đó m, n là các số nguyên, r là số dư.
>iquo(34, 5);⇒ 6
>iquo(34,5,’r’): r;⇒ 4
irem(m,n); hoặc irem(m,n,’q’);
Dùng để tìm phần dư trong phép chia 2 số nguyên và cho biết
thương q khi cần, trong đó m, n là các số nguyên, q là thương.
>irem(62,7);⇒ 6
>irem(62,7,’q’); q; ⇒ 8
iroot(x,n); Dùng để tìm giá trị nguyên gần đúng cho căn bậc n
của x.
>iroot(25,3);⇒ 3
irreduc(a); Dùng để kiểm tra tính bất khả quy của một đa thức,
trong đó a là một đa thức.
>a :=8*x^3-6*x-1: irreduc(a); ⇒ true
iscont(expr,x=a..b); Dùng để kiểm tra tính liên tục của hàm trên
khoảng ( a, b), trong đó expr là một hàm số, x = a..b là một khoảng.
>iscont(1/x,x=-1..1);⇒ false
>iscont( tan(x), x=0..1);⇒ true
isqrt(n); Dùng để tìm xấp xỉ nguyên cho căn bậc hai của số tự
nhiên n, trong đó n là một số tự nhiên.
>isqrt(5);⇒ 2
Lcm(a,b,...); Dùng để tìm bội số chung nhỏ nhất của các đa thức,
trong đó a, b, ... là các đa thức.
>Lcm(x^2+1,x^2+x) mod 2; ⇒ x3 + x
Phụ lục C. Các lệnh thường dùng maple 277

lcoeff(p); Dùng để tìm hệ số đầu của đa thức, trong đó p là một


đa thức.
>lcoeff(3*v^2*w^3*x^4 + 1);⇒ 3
lhs(expr); Dùng để lấy vế trái của phương trình (hoặc biểu thức
có 2 vế), trong đó expr là một phương trình hoặc biểu thức có 2 vế.
>lhs(y = a*x^2 + b);⇒ y
limit(f,x=a); hoặc limit(f,x=a,direct);
Dùng để tìm giới hạn, hoặc giới hạn theo hướng, trong đó f là một
hàm số, x là biến, a là một số.
>limit(1/x,x = 3);⇒ 1/3
>limit(1/x, x=0,right);⇒ ∞
Linslove(A,u); Dùng để giải phương trình đại số tuyến tính Ax =
u, trong đó A là một ma trận, u là một vectơ.  
1 2 3
>A := Matrix([[1,2,3],[1,3,0],[1,4,3]]);⇒ A := 1 3 0
 

1 4 3
 
1
>u:= Vector([1,2,3]); ⇒ u := 2
 

3
 
4
 
>x := Linsolve(A,u)mod 5; ⇒ x := 
1

0

ln(x); Dùng để lấy Loogarit cơ số tự nhiên e, trong đó x là một


hàm.
>ln(1); ⇒ 0
log[b](a); Dùng để tính hàm Loogarit tổng quát, cơ số b dương
khác 1 bất kỳ.
>log[10](100);⇒ 2
log10(x); Dùng để tính Loogarit cơ số 10.
ln(65)
>log10(65);⇒ ⇒ ln(10)

matrix(m,n); hoặc" matrix(m,n,L);


# Dùng để lập ma trận.
0 0 0
>Matrix(2,3);⇒
0 0 0
 
1 −1 0
 
>matrix(3,3,[1,-1,0,0,2,-1,-2,0,1]);⇒  0 2 − 1 

−2 0 1
278 Thực hành tính toán trong Maple

max(x1,x2,...); Dùng để tìm đại lượng lớn nhất trong các đại
lượng( x1, x2...).
>max(3/2, 1.49, 2.5);⇒ 2.5
maximize(expr,vars,ranges); Dùng để tìm giá trị lớn nhất của
biểu thức expr,theo các biến vars,trên các miền ranges.
>maximize(abs(exp(-x^2)-1/2), x=-4..4); ⇒ 1/2
maxnorm(a); Dùng để tính chuẩn ’max’ của đa thức,tức là tính
hệ số có trị tuyệt đối lớn nhất trong số các hệ số của đa thức.
>maxnorm(x-3*y); ⇒ 3
member(x,s); Dùng để kiểm tra xem thành phần x có trong danh
mục s hay không.
>member(y, {x, y, z}); ⇒ true
min(x1,x2,...); Dùng để lấy đại lượng nhỏ nhất trong các đại lượng
(x1,x2,...).
>min(3/2, 1.49, 2.01); ⇒ 1.49
minimize(expr,vars,ranges); Dùng để tính giá trị nhỏ nhất của
biểu thức.
>minimize(cos(x), x=1..3); ⇒ cos (3)
modp(e,m); Dùng để modulo m(tìm đồng dư) của biểu thức e, sử
dụng biểu diễn dương.
>modp(12,7); ⇒ 5
mods(e,m); Dùng để tính modulo m sử dụng biểu diễn đối xứng.
>mods(12,7);⇒ −2
Normal(a); Dùng để tìm dạng chính tắc của một phân thức, trong
đó a là một phân thức.
>Normal( (x^3-2*x^2+2*x+1)/(x^4+1) ) mod 5; ⇒ xx2++33
mtaylor(f,v,n); Dùng để tính khai triển Taylor nhiều biến của f
theo v bậc n, trong đó f là hàm số, v là biến, n là bậc.
>mtaylor(exp(x^2+y^2),[x,y],8);
1 + x2 + y2 + 1/2 x4 + y2 x2 + 1/2 y4 + 1/6 x6 + 1/2 y2 x4 + 1/2 y4 x2 +
1/6 y6
>mtaylor(cos(x^2+y^2), [x=1,y=2], 3);
cos (5) − 2 sin (5) ( x − 1) − 4 sin (5) (y − 2) +
(−2 cos (5) − sin (5)) ( x − 1)2 − 8 cos (5) (y − 2) ( x − 1) +
2
(−8 cos (5) − sin (5)) (y − 2)
mul(f,i=m..n); Dùng để lấy tích của một dãy số.
>mul( i, i=1..5 ); ⇒ 120
Nullspace(A) mod p; Dùng để tìm cơ sở của nhân (Kernel) của
toán tử (ma trận ) mod p.
Phụ lục C. Các lệnh thường dùng maple 279
 
1 2 3
 
>A := Matrix( [[1,2,3],[1,2,3],[0,0,0]] ); ⇒ 
 1 2 3 

0 0 0
   
 3 2 

 

>Nullspace( A ) mod 5; ⇒  1  , 0
   

 0

1 

nextprime(x); Dùng để tìm số nguyên tố ngay sau số đã cho.


>nextprime(25); ⇒ 29
nops(exps); Dùng để trả lại số lượng các thành phần của một biểu
thức.
>nops([1,4,9]); ⇒ 3
numboccur(f,e); Dùng để tính số lần xuất hiện của biểu thức e
trong biểu thức f .
>numboccur(x^3+x-1,x); ⇒ 2
numer(e); Dùng để lấy tử số của một phân thức e, trong đó e là
một phân thức.
>numer( 2/3 );⇒ 2
op(i,expr); Dùng để trích ra một số thành phần của biểu thức,
trong đó i là số thứ tự, expr là một biểu thức.
>op(2,[1,4,9]); ⇒ 4
order(expr); Dùng để lấy bậc của thành phần dư trong biểu thức
dạng chuỗi, trong đó expr là một biểu thức dạng chuỗi.
>order(series(1/(1-x),x));⇒ 6
pdesolve(eqns,vars); Dùng để giải phương trình đạo hàm riêng,
trong đó eqns là một phương trình đạo hàm riêng, vars là các biến.
>pdsolve(x*(diff(f(x,  y), y))-y*(diff(f(x, y), x)) = 0);⇒
f ( x, y) = _F1 x2 + y2
piecewise(dk1,f1,dk2,f2,...,dkn,fn,f); Dùng để thiết lập hàm
từng khúc, trong đó dk1, dk2, ...dkn là các điều kiện, f 1, f 2, ..., f n
là các biểu thức, f là hàm số. (
− x nếu x < 0
>piecewise(x<0,-x,x>0,x); ⇒
x nếu x > 0
plot(f,x=a..b,y=c..d); Dùng để vẽ đồ thị trong không gian 2 chiều
của hàm số 1 biến y = f ( x ).
>plot(cos(2*x-(1/2)*Pi)^3+2*sin((1/2)*x), x = 0 .. Pi);
polar(z); Dùng để biểu diễn số phức dưới dạng tọa độ cực.
280 Thực hành tính toán trong Maple

Hình C.1. Lệnh vẽ đồ thị

>polar(3+4*I); ⇒ polar (5, arctan (4/3))


power(a,n) mod p; Dùng để tính lũy thừa bậc n của một đa thức
a mod p.
>Power(x+1,3) mod 2; ⇒ 1 + x + x2 + x3
powmod(a,n,b,x); Dùng để tính modulo b( x ) của biểu thức
[ a( x )]n .
>powmod(x+1,-2,x^2-2,x); ⇒ 3 − 2 x
prevprime(n); Dùng để tìm số nguyên tố lớn nhất bé hơn số đã
cho.
>prevprime(26); ⇒ 23
product(f,k=n..m); Dùng để tính tích của các số(hoặc biểu thức).
>product( k^2, k=1..4 ); 576
psqrt(a); Dùng để tìm căn bậc 2 của biểu thức a nếu a là chính
phương,ngược lại thì cho kết quả là không có căn.
>psqrt(9); ⇒ 3
>psqrt(23); ⇒ _NOSQRT
quo(a,b,x,’r’); Dùng để tìm phần thương trong phép chia hai đa
thức a cho b và cho biết phần dư r khi cần.
>quo(x^3+x+1, x^2+x+1,x); ⇒ x − 1
rank(A); Dùng để tính hạng của ma trận A.
>with(LinearAlgebra):
>B
 := <<-7,1,2>|<2,1,-1>|<3,0,-1>|<2,7,-3>>;
 ⇒
−7 2 3 2
 
 1 1 0 7 
 
 
2 −1 −1 −3
>Rank(B); ⇒ 2
rationalize(expr); Dùng để trục căn thức
√ ở mẫu.
>rationalize(2/(2-sqrt(2)));⇒ 2 + 2
rem(a,b,x,’q’); Dùng để tìm phần dư trong phép chia của hai đa
Phụ lục C. Các lệnh thường dùng maple 281

thức và cho biết thương q nếu cần.


>rem(x^3+x+1, x^2+x+1, x, ’q’); ⇒ 2 + x
>q;⇒ x − 1
residue(f,x=a); Dùng để tìm hệ số của thành phần ( x − a)−1 trong
khai triển Laurent của f tại x = a.
>residue(Zeta(s), s=1); ⇒ 1
rhs(expr); Dùng để lấy vế phải của biểu thức (có 2 vế).
>rhs(y = 3*x^2+b); ⇒ 3 x2 + b
roots(a,x); Dùng để tìm tất cả các nghiệm của một đa thức a theo
biến x.
>roots(x^3+(-6-b-a)*x^2+(6*a+5+5*b+a*b)*x-5*a-5*a*b, x);
⇒ [[5, 1]]
round(x); Dùng để làm tròn số (bằng cách lấy số nguyên gần nó
nhất).
>round(Pi); ⇒ 3
series(expr,x=a); Dùng để khai triển biểu thức expr thành chuỗi
tại xung quanh điểm a.
>series(x/(1-x-x^2), x=0);⇒ 
( x + x2 + 2 x3 + 3 x4 + 5 x5 + O x6 )
sign(a); Dùng để xác định dấu của hệ số đầu trong biểu thức.
>sign(3*x^2*y^4 - 2*x*y^5 + x); ⇒ 1
signum(z); Dùng để xác định dấu của một số.
>signum(-2/3); ⇒ −1
simplify(expr); Dùng để đơn giản biểu thức.
>simplify(sin(x)^2+ln(2*x)+cos(x)^2); ⇒ 1 + ln (2) + ln ( x )
sin(x); Dùng để tìm hàm số lượng giác sin( x ).
>sin(Pi/2); ⇒ 1
singular(expr,vars); Dùng để tìm các điểm kỳ dị của biểu thức.
>singular(tan(x), 1..evalf(Pi)); ⇒ { x = 1/2 π }
solve(eqn1(x),eqn2(y),x,y); Dùng để giải phương trình hoặc hệ
phương trình.
>solve( {32*x + 13*y + 42*z = 50,
87*x + 190*y + 112*z = 940,
10*x + 10*y/4 + 10*z = 10}, {x, y, z});
 
1548 3232 2473
x= ,y = ,z = −
3115 623 3115

sort(exps,vars,tdeg); Dùng để sắp xếp các số hạng,sắp xếp một


biểu thức, sắp xếp một danh sách.
282 Thực hành tính toán trong Maple

>sort([2,1,3], numeric);⇒ [1, 2, 3]


>restart: sort([a,ba,aaa,aa],length); ⇒ latext ([ a, ba, aa, aaa])
subs(x=a,expr); Dùng để thay thế x trong 1 biểu thức expr bởi
biểu thức a.
>subs(x = 2, x^2+x+1);⇒ 7
substring(string,a..b); Dùng để trích một xâu kí tự từ 1 xâu ký
tự cho trước.
>substring( abcdefgh, 3..7 ); ⇒ cdefg
sum(f,k); hoặc sum(f,k=n..m); Dùng để lấy tổng các số hạng.
>sum(k^2,k); ⇒ 1/3 k3 − 1/2 k2 + 1/6 k
>sum(k,k=0..n-1); ⇒ 1/2 n2 − 1/2 n
surd(x,n); Dùng để lấy giá trị căn bậc n của x, nhưng không phải
là giá trị chính, mà là giá trị có argument gần với argument của
x nhất.
>surd(-1, 3); ⇒ −1
symmdiff(A,B); Dùng để tìm hiệu đối xứng giữa hai tập A và B.
>symmdiff({a,b},{b,c});⇒ { a, c}
trunc(x); Dùng để làm tròn 1 số về với số nguyên kề nó (theo
hướng về số 0).
>trunc(-2.4); ⇒ −2
type(typename); Dùng để kiểm tra biểu thức có cấu trúc kiểu
"typename".
>type(a*b, ’‘+‘’); ⇒ false
unapply(expr,x,y,...); Dùng để xác định hàm số (từ biểu thức và
các biến).
>f := unapply(x^2+sin(x)+1, x); ⇒ x 7→ x2 + sin ( x ) + 1
value(f); Dùng để tính giá trị của một biểu thức.
>value(Int(x, x));⇒ 1/2 x2
vector(list); Dùng để tạovectơ.

1
 
>Vector([1, 2, 3]); ⇒  2

3

whattype(expr); Dùng để cho biết cấu trúc của 1 biểu thức.


>whattype(x + y); ⇒ ‘+‘
whattype([x,y,z]); ⇒ list
PHỤ LỤC D
GÓI LỆNH ĐẠI SỐ TUYẾN TÍNH

GramSchmidt([w1,. . . ,wn]); Dùng để trực giao hóa một bộ vectơ


bằng phương pháp GramSchmidt.
>with(LinearAlgebra);
w1:=<2,1,0,-1>: w2:=<1,0,2,-1>: w3:=<0,-2,1,0>:
ord:=GramSchmidt([w1,w2,w3]);

     
2 0 2/3
 1  −1/2 −4/3
     
ord :=   , , 
 0   2  −1/3
     
−1 −1/2 0

JordanBlockMatrix(t,n); Dùng để xây dựng một ma trận,trong


đó gồm các khối ma trận Jordan.  
x 1 0 0 0 0
 
0
 x 1 0 0 0
0 0 x 0 0 0
>JordanBlockMatrix([[x,3],[5,1],[y,2]]);⇒ 
 

0 0 0 5 0 0
 
0
 0 0 0 y 1
0 0 0 0 0 y
 
2 1 0 0 0
 
0 2 0 0 0
 
>JordanBlockMatrix([[2,2],[3,2]],5);⇒ 0 0 3 1 0
 
 
0 0 0 3 0
 
0 0 0 0 0

wronskian(f,v); Dùng để Tính ma trận Wronskian của hàm số f


đối với biến t.
>Wronskian([exp(t),sin(t),cos(t)],t);
 
et sin(t) cos(t)
 
et cos(t) − sin(t) 
 
t
e − sin(t) − cos(t)

283
284 Thực hành tính toán trong Maple
 
2 1 0 0 0
0 2 0 0 0
 
 
>Wronskian([t^3,t^4],t);⇒ 
0 0 3 1 0
0 0 0 3 0
 

0 0 0 0 0

addcol(A,c1,c2,m); Dùng để tạo lập một ma trận tương tự như


A,ngoại trừ cột c2 là tổng của cột c2 của A và m lần cộtc1. 
1 2 3
 
>a:=array(1..3,1..3,[[1,2,3],[2,3,4],[3,4,5]]);  2 3 4
3 4 5
 
1 −x + 2 3
 
>addcol(a,1,2,-x);⇒ 2 −2 x + 3 4


3 −3 x + 4 5

addrow(A,r1,r2,m); Dùng để tạo lập một ma trận tương tự như


A,ngoại trừ dòng r2 là tổng của dòng r2 của A và m lầndòng r1. 
1 2 3
 
>a:=array(1..3,1..3,[[1,2,3],[2,3,4],[3,4,5]]);   2 3 4 

3 4 5
 
1 2 3
 
>addrow(a,1,2,10);⇒   12 23 34 

3 4 5

adjoint(A), adj(A); Dùng để : tính adjoint của một


 ma trận.

1 2 3
 
>A:=matrix(3,3,[1,2,3,4,5,6,7,8,9]); A :=   4 5 6 

7 8 9
 
−3 6 −3
 
>adj(A);⇒  6 −12 6 


−3 6 −3
" #
1 4
>B:= array( ..2,1..2,[[1,4],[0,2]]);⇒ B :=
0 2
" #
2 −4
>adjoint(B);⇒
0 1
Phụ lục D. Gói lệnh đại số tuyến tính 285

angle(u,v); Dùng để tính góc giữa hai vectơ.


>angle(vector([1,0]),vector([0,1])); ⇒ 1/2 π
>angle(array([1,1]),array([0,1])); ⇒ 1/4 π
augment(A,B); Dùng để ghép hai ma trận có cùng số hàng thành
một ma trận mới. " #
1 2
>a:= matrix([[1,2],[2,3]]); ⇒ a :=
2 3
" #
3 4 5
>b:= matrix(2,3,[3,4,5,6,7,8]);⇒ b :=
6 7 8
" #
1 2 3 4 5
>augment(a,b);⇒
2 3 6 7 8
band([b ,n);] Dùng để tạo ma trận vuông cấp n,gồm có các phần
tử b trên đường chéo
 chính.
1 0 0
 
>band([1],3);⇒ 0 1 0


0 0 1
 
2 −1 0 0
1 2 −1 0 
 
>band([1,2,-1],4); ⇒ 
 
 0 1 2 − 1 

0 0 1 2
basis(v1,v2,v3,v4); basis(A,’rowspace’); basis(A,’colspace’);
Dùng để tìm cơ sở cho không gian sinh ra bới hệ vectơ, hoặc các
vectơ hàng hay vectơ cột của một ma trận.
>v1:= vector([1,0,0]); v2:= vector([0,1,0]);
v3:= vector([0,0,1]); v4:= vector([1,1,1]);
>basis({v1,v2,v3,v4});⇒ {v1, v2, v3}
>A:= array([[1,0,0],[0,1,0],[0,0,1],[1,1,1]]):
>basis(A,’rowspace’);⇒ [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
>basis(A,’colspace’); ⇒ [[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 1, 1]]
bezout(p,q,x); Dùng để đưa về ma trận bezout của các đa thức
p, q theo biến x.
>p:= a+b*x+c*x^2; ⇒ p := a + bx + cx2
>q:= d+e*x+f*x^2;⇒ 2
" q := d + ex + f x#
dc − a f db − ae
>bezout(p,q,x);⇒
ec − b f dc − a f
blockmatrix blockmatrix (m, n, [ B11 , . . . , B1n , . . . , Bm1 , . . . , Bmn ]);
286 Thực hành tính toán trong Maple

Dùng để tạo ra khối ma trận gồm có m hàng,n cột. Trong đó mỗi


hàng và cột là các ma trận cho trước.  
1 2 3
 
>A:=matrix([[1,2,3],[2,1,3],[1,-1,0]]); A :=  2 1 3
1 −1 0
 
1 0 3
 
>B:=matrix([[1,0,3],[1,1,3],[1,-1,1]]); B := 1 1  3
1 −1 1
 
1 3 3
 
>Z:= matrix([[1,3,3],[2,11,3],[1,-9,0]]); Z := 2 11
 3
1 −9 0
>blockmatrix(2,4,[A,B,Z,A,B,Z,A,B]);
 
1 2 3 1 0 3 1 3 3 1 2 3
 
2 1 3 1 1 3 2 11 3 2 1 3
 
1 −1 0 1 −1 1 1 −9 0 1 −1 0
 
 
1 0 3 1 3 3 1 2 3 1 0 3
 
1 1 3 2 11 3 2 1 3 1 1 3
 
 
1 −1 1 1 −9 0 1 −1 0 1 −1 1

charmat(A,λ); Dùng để thiết lập ma trận M = Iλ − A 


1 2 3
 
>A:=matrix(3,3,[1,2,3,1,2,3,1,5,6]); ⇒ A :=  1 2 3

1 5 6
 
λ − 1 −2 −3
 
>charmat(A,lambda); ⇒  −1 λ − 2 −3 


−1 −5 λ−6

charpoly(A,x); Dùng để tính đa thức đặc trưng của


 ma trận A.
1 2 3
 
>A:=matrix(3,3,[1,2,3,1,2,3,1,5,6]); ⇒ A :=   1 2 3 

1 5 6
>charpoly(A,x);⇒ x3 − 9 x2
cholesky(A); Dùng để đưa ma trận đối xứng A về dạng tam giác
dưới.
Phụ lục D. Gói lệnh đại số tuyến tính 287
 
1 2 3
 
>S:=matrix(3,3,[1,2,3,0,1,1,0,0,4]); ⇒ S := 
0 1 1
0 0 4
 
1 2 3
 
>A:=evalm(‘&*‘(transpose(S),S)); ⇒ A := 2 5
 7
3 7 26
 
1 0 0
 
>R:=cholesky(A); ⇒ R := 
2 1 0

3 1 4

col(A,i); Dùng để lấy vectơ cột thứ i của ma trận A. 


1 2 3
 
>A:=matrix(3,3,[1,2,3,4,5,6,7,8,9]); ⇒ A := 
 4 5 6 

7 8 9
>col(A,2); ⇒ [2, 5, 8]
row(A,i); Dùng để lấy vectơ hàng thứ i của ma trận
 A. 
1 2 3
 
>A:=matrix(3,3,[1,2,3,4,5,6,7,8,9]); ⇒ A :=   4 5 6 

7 8 9
>row(A,2); ⇒ [4, 5, 6]
coldim(A); Dùng để tính số chiều của không gian sinh bởi các
vectơ cột của ma trận A.  
1 2 3
 
>A:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);⇒ A :=  4 5 6 

7 8 9
>coldim(A); ⇒ 3
colspace(A); Dùng để đưa ra một cơ sở,cơ sở tìm được là một cơ
sở trực chuẩn.  
1 2 1
 
>A:=matrix(3,3,[1,2,1,2,2,2,3,2,1]); ⇒ A :=  2 2 2

3 2 1
>colspace(A); ⇒ {[1, 0, 0], [0, 1, 0], [0, 0, 1]}
colspan(A); Dùng để đưa ra một cơ sở cho không gian sinh bởi các
vectơ cột của ma trận A.
288 Thực hành tính toán trong Maple
 
1 2 1
 
>A:=matrix(3,3,[1,2,1,2,2,2,3,2,1]); ⇒ A :=   2 2 2 

3 2 1
>colspan(A); ⇒ {[1, 2, 3], [0, −2, −4], [0, 0, 4]}
companion(p,x); Dùng để đưa ra một ma trận companion với đa
thức p.
>p:=x^4+9*x^3+2*x^2+17*x+5; ⇒ p := x4 + 9 x3 + 2 x2 + 17 x + 5
 
0 0 0 −5
1 0 0 −17
 
>companion(p,x); ⇒ 
 
 0 1 0 − 2 

0 0 1 −9
concat(v,B,v); Dùng để tạo ra ma trận gồm" vectơ v #và ma trận B.
3 4 5
>b:=matrix(2,3,[3,4,5,6,7,8]); ⇒ b :=
6 7 8
" ⇒ v := [1, 2]#
>v:=vector(2,[1,2]);
1 3 4 5 1
>concat(v,b,v); ⇒
2 6 7 8 2
cond(A,l); Dùng để tính chuẩn của ma trận A theo chuẩn l. 
1 0 3
 
>A:=matrix(3,3,[1,0,3,-4,2,0,0,3,-2]); A :=   −4 2 0 

0 3 −2
>cond(A,1); ⇒ 3
copyinto(A,B,m,n); Dùng để coppy ma trận A vào ma trận B kể
từ hàng thứ m và kể từ cột thứ n. " #
1 2
>A:=matrix(2,2,[1,2,3,4]); ⇒ A :=
3 4
" #
1 2
>B:=extend(A,2,2,0); ⇒ B :=
3 4
 
1 2 0 0
 
3 4 0 0
>copyinto(A,B,3,3); ⇒   
 0 0 1 2 

0 0 3 4
crossprod(u,v); Dùng để tính tích hữu hướng giữa hai vectơ.
Phụ lục D. Gói lệnh đại số tuyến tính 289

>v1:=vector([1,2,3]); ⇒ v1 := [1, 2, 3]
>v2:=vector([2,3,4]); ⇒ v2 := [2, 3, 4]
>crossprod(v1,v2); ⇒ [−1, 2, −1]
definite(A,kind); Dùng để kiểm tra kiểu
" của # ma trận A.
2 1
>A:=matrix(2,2,[2,1,1,3]); ⇒ A :=
1 3
>definite(A,’positive_def’);
delcols(A,m .. n); Dùng để xóa các cột của ma trận A từ cột thứ
m đến cột thứ n.  
1 2 3
 
>a:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);⇒ a :=   4 5 6 

7 8 9
 
2 3
 
>delcols(a,1 .. 1); ⇒ 5 6

8 9

delrows(A,m .. n); Dùng để xóa các cột của ma trận A từ cột thứ
m đến cột thứ n.  
1 2 3
 
>a:=matrix(3,3,[1,2,3,4,5,6,7,8,9]); ⇒ a :=   4 5 6 

7 8 9
" #
4 5 6
>delrows(a,1 .. 1); ⇒
7 8 9
det(A); Dùng để tính định thức của ma trận.  
100 2 3
 
>A:=matrix(3,3,[100,2,3,4,5,6,7,8,9]); ⇒ A := 
 4 5 6

7 8 9
>det(A); ⇒ −297
diag(B1,B2,...,Bn); Dùng để tạo ma trận chéo khối.
>B1:=array([[1,3,5],[9,a,z],[x^2,sin(q),10]]);

 
1 3 5
 
B1 := 
9 a z
2
x sin (q) 10
290 Thực hành tính toán trong Maple
" #
1 3
>B2:=matrix(2,2,[1,3,2,4]); ⇒ B2 :=
2 4
 
1 3 5 0 0
 
9
 a z 0 0
 2
>diag(B1,B2);⇒  x sin (q) 10 0 0

 
0 0 0 1 3
 
0 0 0 2 4
diverge(f,v); Phân kỳ của một hàm vectơ
>f:=vector([x,y^2,z]): v:=vector([x,y,z]); ⇒ f := [ x, y, z]
>diverge(f,v); ⇒ 2 + 2 y
dotprod(u,v); Dùng để tính tích vô hướng của hai vectơ.
>u:=vector([1,x,y]); ⇒ u := [1, x, y]
>v:=vector([1,0,0]); ⇒ v := [1, 0, 0]
>dotprod(u,v); ⇒ 1
eigenvals(A),eigenvalues(A); Dùng để tính vectơ riêng của ma
trận.  
1 2 1
 
>A:=array([[1,2,1],[1,1,1],[5,6,5]]); ⇒ A :=  1 1 1
5 6 5
7 1 7 1
p p
>eigenvals(A); ⇒ 0, 2 + 2 ∗ (57), 2 − 2 ∗ (57)
>eigenvalues(A); ⇒ 0, 27 + 12 ∗ (57), 72 − 21 ∗ (57)
p p

eigenvectors(A); eigenvects(A); Dùng để tính vectơ riêng của


ma trận.  
1 1 1
 
>A:=array([[1,1,1],[1,1,1],[1,1,1]]); ⇒ A :=  1 1 1

1 1 1
>eigenvectors(A); ⇒ [3, 1 {[1 1 1]}] , [0, 2 {[−1 0 1] , [−1 1 0]}]
>eigenvects(A); ⇒ [3, 1 {[1 1 1]}] , [0, 2 {[−1 0 1] , [−1 1 0]}]
entermatrix(A); Dùng để nhập ma trận.  
? ? ?
 
>A:=array(1 .. 3,1 .. 3,symmetric); ⇒ A := 
 ? ? ? 

? ? ?
>entermatrix(A);
equal(A,B); Dùng để so sánh hai ma trận.
Phụ lục D. Gói lệnh đại số tuyến tính 291
" #
2 1
>A:=array([[2,1],[1,2]]); ⇒ A :=
1 2
" #
2 1
>C:=matrix(2,2,[2,1,1,2]);⇒ C :=
1 2
" #
2 1
>F:=array([[2,1],[2,1]]);⇒ F :=
2 1
>equal(A,C); ⇒ true
>equal(A,F); ⇒ false
exponential(A),exponential(A,t); Dùng để tínhma trậnexp(A).
t 0 0
 
>A:=array([[t,0,0],[0,t,0],[0,0,t]]); A := 0 t 0

0 0 t
 
et 0 0
 
>exponential(A);⇒  0 e t 0 
 
0 0 et
" #
−13 −10
>B:=array([[-13,-10],[21,16]]); ⇒ B :=
21 16
" #
t
15 e − 14 e 2 t −10 e + 10 et
2 t
>exponential(B,t); ⇒
21 e2 t − 21 et −14 et + 15 e2 t
extend(A,m,n,x); Dùng để thêm m hàng n cột gồm các phần tử x
vào ma trận A. " #
1 2
>A:=matrix(2,2,[1,2,3,4]); ⇒ A :=
3 4
 
1 2 x
 
3 4 x
>extend(A,2,1,x); ⇒ 
 
x x x

x x x
ffgausselim(A); Dùng để chuyển ma trận thành dạng tam giác
trên bằng phương pháp khử Gauss.  
x 1 0
 
>A:=matrix(3,3,[x,1,0,0,0,1,1,y,1]);⇒ A := 
 0 0 1

1 y 1
292 Thực hành tính toán trong Maple
 
x 1 0
 
>ffgausselim(A,’r’,’d’); ⇒ 
 0 yx − 1 x 

0 0 yx − 1

fibonacci(n); Dùngđể lập ma


 trận Fibonacci.
1 1 1
 
>fibonacci(3); ⇒ 1 0 1


1 1 0

forwardsub(l,B); Dùng để giải phương trình Lx = b.


>A:=array(1 .. 3,1 .. 4,[[1,-2,3,1],
 
1 −2 3 1
 
[2,k,6,6],[-1,3,k-3,0]]); ⇒ A :=  2
 k 6 6

−1
k−3 0 3
 
1 −2 3 1
 
>LUdecomp(A,L = ’l’,U = ’u’); ⇒  0 k + 4 0 4 

0 0 k k+k 4
>b:=vector([1,2,3]); ⇒ b := [1, 2, 3]
>v1:=forwardsub(l,b); ⇒ v1 := [1, 0, 4]
frobenius(A,P); Dùng để tính dạng Frobenius của ma trận.
>A:=array([[-9,21,-15,4,2,0],[-10,21,-14,4,2,0],
[-8,16,-11,4,2,0],[-6,12,-9,3,3,0],[-4,8,-6,0,5,0],
[-2,4,-3,0,1,3]]);  
−9 21 −15 4 2 0
 
−10 21 −14 4 2 0
 
 −8 16 −11 4 2 0
A := 
 

 −6 12 −9 3 3 0
 
 −4 8 −6 0 5 0
 
−2 4 −3 0 1 3
 
0 0 0 0 15 0
 
1
 0 0 0 −47 0
0 1 0 0 56 0
>frobenius(A,P); ⇒ 
 

0
 0 1 0 −32 0
0 0 0 1 9 0
 
0 0 0 0 0 3

gausselim(A); Dùng để đưa ma trận về dạng tam giác trên.


Phụ lục D. Gói lệnh đại số tuyến tính 293
 
1 2 3
 
>A:=Matrix([[1,2,3],[1,3,0],[1,4,3]]); ⇒ A := 
 1 3 0 

1 4 3
 
1 2 3
 
>Gausselim(A) mod 5; ⇒ 
0 1 2

0 0 1

geneqns(A,vars); Dùng để tạo ra một hệ phương trình tuyến tính


từ một ma trận.
>eqns:={x+2*y = 0,3*x-5*y = 0};
⇒ eqns := { x + 2y = 0, 3x − 5y = 0} " #
1 2
>A:=genmatrix(eqns,[x,y]); ⇒ A :=
3 −5
>geneqns(A,[x,y]); ⇒ { x + 2 y = 0, 3 x − 5 y = 0}
genmatrix(eqns,vars); Dùng để tạo một ma trận từ hệ phương
trình tuyến tính.
>eqns:={x+2*y = 0,3*x-5*y = 0}; ⇒ "{ x + 2 y#= 0, 3 x − 5 y = 0}
1 2
>A:=genmatrix(eqns,[x,y]); ⇒ A :=
3 −5
hadamard(A); Dùng để tính chặn trên cho chuẩn
 của ma trận.
1 −1 0
 
>A:=matrix(3,3,[1,-1,0,0,2,-1,-2,0,1]); ⇒  0
 2 −1 
−2 0 1

>hadamard(A); ⇒ 50
hermite(H,x); Dùng để tìm dạng Hermite Normal của ma trận.
>H:=inverse(hilbert(2,x));

" #
− (−3 + x )2 (−2 + x ) (−3 + x ) (−2 + x ) (−4 + x )
H :=
(−3 + x ) (−2 + x ) (−4 + x ) − (−3 + x )2 (−4 + x )

" #
6 + x2 − 5 x 0
>hermite(H,x); ⇒
0 12 + x2 − 7 x
hessian(expr,vars); Dùng để tìm ma trận Hessian của một
phương trình.
294 Thực hành tính toán trong Maple
 
0 z y
 
>hessian(x*y*z,[x,y,z]); ⇒ 
 z 0 x 

y x 0
" #
2y 2x+6y
>hessian(x^2*y+3*x*y^2,[x,y]); ⇒
2x+6y 6x
hilbert(n,x); Dùng
 để tạo ma trận Hilbert cấp n.
1 1/2 1/3
 
>hilbert(3); ⇒  1/2 1/3 1/4 

1/3 1/4 1/5
 
(1 − x ) −1 (2 − x ) −1 (3 − x ) −1
−1
(3 − x ) −1 (4 − x ) −1 
 
>hilbert(3,x+1); ⇒  (2 − x ) 
(3 − x ) −1 (4 − x ) −1 (5 − x ) −1
htranspose(A); Dùng để tìm liên hợp phức của ma trận chuyển
vị. " #
1 2
>A:=array([[1,2],[4,I]]); ⇒ A :=
4 i
" #
1 4
>htranspose(A); ⇒
2 −i
ihermite(H); Dùng để tìm dạng Hermite Normal của ma trận.
>H:=array([[9,-36,30],[-36,192,-180],[30,-180,180]]);
 
9 −36 30
 
H := 
−36 192 −180

30 −180 180
 
3 0 30
 
>ihermite(H); ⇒ 
0 12 0 

0 0 60
indexfunc(A); Dùng xác định chức năng lập chỉ mục của một
mảng. " #
1 0
>B:=array(1..2,1..2,[[1,0],[0,1]],’symmetric’);
0 1
>indexfunc(B);⇒ symmetric
Phụ lục D. Gói lệnh đại số tuyến tính 295

innerprod(u,A1,A2,...,An,v); Dùng để tính tích vô hướng của hai


vectơ,hoặc tích của ma trận với vectơ.
>u:=vector(2,[1,2]); ⇒ u := [1, 2]
>v:=vector(3,[1,2,3]); ⇒ v := [1, 2, 3] " #
1 1 1
>A:=matrix(2,3,[1,1,1,2,2,2]);⇒ A :=
2 2 2
>innerprod(u,A,v); ⇒ 30
>w:=vector(3,[3,2,1]); ⇒ w := [3, 2, 1]
>innerprod(v,w); ⇒ 10
ismith(H); Dùng để tìm dạng Smith của ma trận.
>H:=array([[9,-36,30],[-36,192,-180],[30,-180,180]]);
 
9 −36 30
 
H := 
−36 192 −180

30 −180 180
 
3 0 0
 
>ismith(H); ⇒ 
0 12 0 

0 0 60

issimilar(A,B,P); Dùng để kiểm tra xem hai ma trận có đồng


dạng với nhau hay không.  
1 2 3
 
>A:=matrix(3,3,[1,2,3,4,5,6,7,8,9]); ⇒ A := 
4 5 6
7 8 9
>B:=diag(eigenvalues(A));
 
0 0 0
 √ 
B := 
0 15/2 + 3/2 33 0 
√ 
0 0 15/2 − 3/2 33

>issimilar(A,B,P); ⇒ true
iszero(A); Dùng để kiểm tra xem ma trận có phải là ma trận
"không" hay không.  
1 0 0
 
>A:=matrix(3,3,[1,0,0,0,0,0,0,0,0]);⇒ A := 0 0 0


0 0 0
>iszero(A); ⇒ false
296 Thực hành tính toán trong Maple
 
0 0 0
 
>B:=matrix(3,3,[0,0,0,0,0,0,0,0,0]);⇒ B := 
 0 0 0 

0 0 0
>iszero(B); ⇒ true
Jacobian(f,vars); Dùng để tính ma trận Jacobian của hàm số.
>with(VectorCalculus): " #
−2 1
>Jacobian(‘<,>‘(x^2+y,2*y),[x,y] = [-1,1]); ⇒
0 2
jordan(A),jordan(A,’P’); Dùng để tìm dạng chuẩn Jordan của
ma trận.  
1 2 1
 
>A:=matrix(3,3,[1,2,1,4,4,4,1,1,1]); A := 
4 4 4

1 1 1
 
0 0 0
 √ 
>J:=jordan(A); ⇒ J :=  0 3 − 13 0 
 √ 
0 0 3 + 13

kernel(A); Dùng để tìm cơ sở cho không gian Kernel của phép


biến đổi tuyến tính xác định bởi A.  
1 2 3
 
>A:=array([[1,2,3],[1,x,3],[0,0,0]]); ⇒ A := 
1 x 3
0 0 0
>kernel(A); ⇒ {[−3, 0, 1]}
laplacian(f,vars); Dùng để tính Laplacian của hàm f .
>with(VectorCalculus):
>Laplacian(VectorCalculus:-‘+‘
(VectorCalculus:-‘+‘(x^2,y^2),z^2),[x,y,z]); ⇒ 6
LeastSquares(A,B,opt,t,c,options,meth);
>with(LinearAlgebra);  
3 −2
 
>A:=‘<|>‘(‘<,>‘(3,0,4),‘<,>‘(-2,3,4)); ⇒ A := 0 3 


4 4
 
1
 
>b:=‘<,>‘(1,2,4); ⇒ b := 2


4
Phụ lục D. Gói lệnh đại số tuyến tính 297
" #
351
625
>X:=LeastSquares(A,b); ⇒ X := 62
125

Linsolve(A,b) mod n, Linsolve(A,b,’r’,’t’) mod n; Dùng để


giải hệ phương trình tuyến tính Ax = b.  
0
 
>A:=Matrix([[1,2,3],[1,3,0],[1,4,3]]);⇒ A :=  −1 
a 
0
 
1
 
>b:=Vector([1,2,3]); ⇒ b := 
2

3
 
4
 
>x:=Linsolve(A,b) mod 5; ⇒ x := 1


0
matadd(A,B),matadd(A,B,c1,c2); Dùng tính ma  + c2 B.
trận c1 A 
1 2 3
 
>A:=matrix(3,3,[1,2,3,2,3,4,3,4,5]); ⇒ A :=  2 3 4

3 4 5
 
1 0 0
 
>B:=array(1..3,1..3,‘’identity‘’); ⇒ B := 
 0 1 0 

0 0 1
 
11 2 3
 
>matadd(A,B,1,10); ⇒  2 13 4 


3 4 15

Matrix(r,c,init,ro,sym,sc,sh,st,o,dt,f,a);
" # Dùng để tạo ma trận.
0 0 0
>Matrix(2,3); ⇒
0 0 0
 
1 0 0
 
>Matrix(3,shape=identity); ⇒   0 1 0 

0 0 1
" #
1 2 3
>m2:=Matrix([[1,2,3],[4,5,6]]); ⇒ m2 :=
4 5 6
298 Thực hành tính toán trong Maple

minor(A,r,c); Dùng để bỏ hàng thứ r và cột thứ c của  A.


 ma trận
1 5 2
 
>A:=matrix(3,3,[1,5,2,6,3,7,4,8,5]); ⇒ A :=  6 3 7

4 8 5
" #
1 2
>minor(A,2,2); ⇒
4 5
minpoly(A,x); Dùng để tìm đa thức tối tiểu của ma trận A.
>A:=array([[2,1,0,0],[0,2,0,0],[0,0,1,1],[0,0,-2,4]]);
 
2 1 0 0
 
0 2 0 0
A := 
0 0 1 1

 
0 0 −2 4

>m:=minpoly(A,x);⇒ m := −12 + 16 x − 7 x2 + x3
mulcol(A,c,expr), mulrow(A,r,expr); Dùng để nhân một
hàng,cột của ma trận với một số. " #
1 2
>A:=matrix( [[1,2],[3,4]] ); ⇒ A :=
3 4
" #
1 2
>mulrow(A,2,2);
6 8
" #
1 2x
>mulcol(A,2,x); ⇒
3 4x
multiply(A,B,...); Dùng để tính tích hai ma trận hoặc tích ma
trận với vectơ. " #
1 2
>A:=array( [[1,2],[3,4]] ); ⇒ A :=
3 4
" #
0 1
>B:=array( [[0,1],[1,0]] ); ⇒ B :=
1 0
>v:=vector( [3,4] );" ⇒ v
# : = [ 3, 4 ]
2 1
>multiply(A,B); ⇒
4 3
>multiply(A,v); ⇒ [11, 25]
norm(A), norm(A,normname); Dùng để tính chuẩn của ma
trận hoặc vectơ.
Phụ lục D. Gói lệnh đại số tuyến tính 299

>norm( array([[1,-2],[3,-4]]),infinity
√ ); ⇒ 7
>norm( array([1,-1,2]),2 ); ⇒ 6
>norm( array([1,-1,2]),1.367 ); ⇒ 3.043660199
normalize(A); Dùng để tính chuẩn theo tiêu chuẩn cụ thể.
>normalize( array([1,-I]) ); ⇒ normalize ([1, −i ])
>norm((1.1),2); ⇒ 1
>normalize( array([1,-2,2]) ); ⇒ [1/3, −2/3, 2/3]
>norm((1.3),2);⇒ 1
kernel(A), kernel(A,’nulldim’), nullspace(A),
nullspace(A,’nulldim’);
Dùng để tìm cơ sở cho không gian null.  
1 2 3
 
>A:=array( [[1,2,3],[1,x,3],[0,0,0]] ); ⇒ A := 
 1 x 3 

0 0 0
>kernel(A); ⇒ {[−3, 0, 1]}
orthog(A); Dùng để kiểm tra xem một ma trận có phải là ma trận
trực giao hay không
>A:=array( [[-1/2,sqrt(3)/2],[sqrt(3)/2,1/2]] );
" √ #
−1/2 1/2 3
A := √
1/2 3 1/2

>orthog(A); ⇒ true
permanent(A); Dùng để tính permanent của ma trận.
>A:=array( [[-1/2,sqrt(3)/2],[sqrt(3)/2,1/2]] );
" √ #
−1/2 1/2 3
A := √
1/2 3 1/2

>permanent(A); ⇒ 1/2
pivot(A,i,j), pivot(A,i,j,r..s); Giữ nguyên hàng i và khử các hàng
khác sao cho cột thứ j có toàn số 0, trừ hàng i có các phần tử ban
đầu.
>A:=matrix(4,4,[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]);
 
1 2 3 4
 
5 6 7 8
A := 9 0 1 2

 
3 4 5 6
300 Thực hành tính toán trong Maple
 
12
0 4/5 8/5 5
 
5 6 7 8 
>A:=pivot(A,2,1);⇒ A := 
0 − 54

 5 − 58
5 − 62
5 

0 2/5 4/5 6/5


 
20 40
0 0 27 27

5 10 
0 5/9 9 

>A:=pivot(A,3,2);⇒ A := 
0 − 54
 5 − 58
5
62 
−5
10 20
0 0 27 27

potential(f,var,’V’); Hàm này trả về đúng nếu hàm f có một tiềm


năng vô hướng,và sai nếu ngược lại.
>f:=[2*x*y+y^3,x^2+3*x*y^2];⇒ f := [2 xy + y3 , x2 + 3 xy2 ]
>potential(f,[x,y],’F’); ⇒ true
randmatrix(m,n,options); Dùng để tạo ra ma trận với các phần
tử ngẫu nhiên.  
−73 −4 −83
 
>randmatrix(3,3);⇒ 
−10 62 −82

80 −44 71
 
−17 −75 −10
 
>randmatrix(3,3);⇒ 
 −7 −40 42 

−50 23 75

randvector(n,entries=p); Dùng để tạo ra vectơ ngẫu nhiên.


>randvector(3); ⇒ [−94, 87, −56]
>randvector(3); ⇒ [0, −62, 97]
rank(A); Dùng để tính hạng của ma trận  
x 1 0
 
A:=matrix(3,3,[x,1,0,0,0,1,x*y,y,1]);⇒ A := 
 0 0 1

xy y 1
>rank(A);⇒ 2
frobenius(A), frobenius(A,’P’); Hàm frobenius (A) hoặc rat-
form (A) tính toán và trả lại dạng Frobenius của một ma trận A.
>A:=array([[-9,21,-15,4,2,0],[-10,21,-14,4,2,0],
[-8,16,-11,4,2,0],[-6,12,-9,3,3,0],
[-4,8,-6,0,5,0],[-2,4,-3,0,1,3]]);
Phụ lục D. Gói lệnh đại số tuyến tính 301

 
−9 21 −15 4 2 0
−10 21 −14 4 2 0
 
 
 −8 16 −11 4 2 0
A := 
 

 −6 12 −9 3 3 0
 
 −4 8 −6 0 5 0
 

−2 4 −3 0 1 3
 
0 0 0 0 15 0
0 0 0 −47 0
 
1
 
0 1 0 0 56 0
>frobenius(A,P);⇒ 
 

0
 0 1 0 −32 0
0 0 0 1 9 0
 

0 0 0 0 0 3
row(A,i), row(A,i..k), col(A,i), col(A,i..k); Dùng để lấy ra hàng
của ma trận A.  
1 2 3
 
>A:=matrix(3,3,[1,2,3,4,5,6,7,8,9]); ⇒ A :=  4 5 6

7 8 9
>row(A,2); ⇒ [4, 5, 6]
rowdim(A); Dùng để tính số chiều của không gian sinh ra bởi các
vectơ hàng.  
1 2 3
 
>A:=matrix(3,3,[1,2,3,4,5,6,7,8,9]); ⇒ A :=  4 5 6

7 8 9
>rowdim(A); ⇒ 3
RowSpace(A,options); Dùng để tìm cơ sở trực chuẩn cho không
gian sinh bởi các vectơ hàng.
>with(LinearAlgebra):  
1 0 0 0
 
>A:=<<1,2,0>|<0,2,6>|<0,0,4>|<0,0,0>>;⇒ A :=  2 2 0 0 

0 6 4 0
h i h i h i
>RowSpace(A); ⇒ [ 1 0 0 0 , 0 1 0 0 , 0 0 1 0

rowspan(A); Dùng để tìm không gian sinh bởi các vetor hàng
302 Thực hành tính toán trong Maple
" #
a b
>A:=matrix(2,2,[a,b,c,d]);⇒ A :=
c d
>rowspan(A);⇒ {[ a, b], [0, da − bc]}
scalarmul(A,expr); Dùng để nhân một ma trận hoặc một vectơ
với một số. " #
2 4
>scalarmul(array([[1,2],[3,4]]),2); ⇒
6 8
>scalarmul(array([1,2,3,4]),3);⇒ [3, 6, 9, 12]
singularvals(A); Dùng để trả về một danh sách các giá trị số ít
của ma trận A.  
1 0 1
 
>A:=array( [[1,0,1],[1,0,1],[0,1,0]] ); ⇒ A :=  1 0 1 
0 1 0
>singularvals(A); ⇒ [0, 2, 1]
smith(A,x), smith(A,x,U,V) Dùng để chéo hóa
" ma trận. #
1 − x y − xy
>A:=matrix([[1-x,y-x*y],[0,1-x^2]]); ⇒
0 1 − x2
" #
−1 + x 0
>smith(A,x);⇒
0 −1 + x 2
stackmatrix(A,B,...); Dùng để tạo ma trận mới từ các ma trạn
ban đầu bằng cách ghép các hàng lại." #
1 2
>a:=matrix(2,2,[1,2,3,4]);⇒ a :=
3 4
" #
5 6
>b:=matrix(2,2,[5,6,7,8]); ⇒ b :=
7 8
 
1 2
 
3 4
>stackmatrix(a,b); ⇒  
 5 6 

7 8
submatrix(A,Rrange,Crange), submatrix(A,Rlist,Clist);
Dùng để lấy ra ma trận con của một ma trận." #
1 2 3
>A:=array( [[1,2,3],[4,x,6]] ); ⇒ A :=
4 x 6
Phụ lục D. Gói lệnh đại số tuyến tính 303
" #
2 3
>submatrix(A,1..2,2..3);⇒
x 6
subvector(A,r,c); Dùng để lấy ra một vectơ từ
" một ma# trận.
1 2 3
>A:=array( [[1,2,3],[4,x,6]] ); ⇒ A :=
4 x 6
>subvector(A,1..2,2); ⇒ [2, x ]
sumbasis(S1,S2,...); Dùng để tìm cơ sở của không gian tổng.
>v1:=vector([1,0,1,0]); ⇒ v1 = [1, 0, 1, 0]
>v2:=vector([0,1,0,1]); ⇒ v2 = [0, 1, 0, 1]
>v3:=vector([1,2,1,1]); ⇒ v3 = [1, 2, 1, 01
>v4:=vector([-1,-2,1,0]); ⇒ v4 = [−1, −2, 1, 0]
>sumbasis({v1,v2,v3},{v3,v4},{v2,v3}); ⇒ {v1, v2, v3, v4}
swaprow(A,r1,r2), swapcol(A,c1,c2); Dùng để chuyển đổi hàng
hoặc cột. " #
1 2 x
>A:=array( [[1,2,x],[3,4,y]] ); ⇒ A :=
3 4 y
" #
3 4 y
>swaprow(A,1,2); ⇒
1 2 x
" #
1 x 2
>swapcol(A,2,3); ⇒
3 y 4
sylvester(p,q,x); Dùng đưa ra ma trận Sylvester của đa thức p ,
q.
>with(linalg): p:=a+b*x:
 q:=c+d*x+e*x^2:

b a 0
 
>sylvester(p,q,x);⇒ 0 b a 

e d c

toeplitz(L); Dùng để đư ra ma
 trận đối xứng từ danh sách L.
a b c
 
>toeplitz( [a,b,c] ); ⇒  b a b

c b a

trace(A); Dùng để tính vết của ma trận. " #


1 2
>A:=matrix( [[1,2],[3,4]] ); ⇒ A :=
3 4
>trace(A); ⇒ 5
304 Thực hành tính toán trong Maple

transpose(A); Dùng để đưa ra phần tử chưa nhập của ma trận


A. " #
1 2 3
A:=array( [[1,2,3],[4,5]] ); ⇒ A :=
4 5 ?
 
1 4
 
>transpose(A); ⇒ 
 2 5 

3 A2,3

vandermonde(L); Dùng để đư ra ma trận Vandermonde từ một


danh sách.  
1 a a2 a3
b b2 b3 
 
1
>vandermonde([a,b,c,d]); ⇒  
1
 c 2 3 
1 2
d d d 3

vecpotent(f,var,’V’); Dùng để kiểm tra biến của đa thức.


>f:=[x^2*y,-1/2*x*y^2,-x*y*z]; ⇒ f := [ x2 y, −1/2 xy2 , − xyz]
>vecpotent(f,[x,y,z],’V’); ⇒ true
vectdim(v), vectdim(L) Dùng để tìm số chiều của một vectơ.
>v:=vector( [x,y,z] ); ⇒ v := [ x, y, z]
>vectdim(v); ⇒ 3
vector([x1,...,xn ), vector(n,[x1,...,xn]), vector(n), vector(n,f)]
Dùng để nhập một vectơ.
>v:=vector( [x,y,z] ); ⇒ v := [ x, y, z]
wronskian(f,v); Dùng để tính ma trận Wronskian của hàm f .
>A:=vector([exp(x),cosh(x),sinh(x)]);
⇒ A := [ex , cosh ( x ) , sinh ( x )]  
ex cosh ( x ) sinh ( x )
 
>Wr:=wronskian(A,x);⇒ Wr :=  x
e sinh ( x ) cosh ( x )

ex cosh ( x ) sinh ( x )
PHỤ LỤC E
GÓI LỆNH VẼ ĐỒ THỊ PLOTS

animate(plotcommand, plotargs, t=a..b,options); (Hình E.1).


animate(plotcommand, plotargs, t=L,options);
Dùng để tạo ra một hoạt hình trên một hàm vẽ đồ thị với tham số
cho bất kỳ trong 2-D và 3-D, trong đó plotcommand-thủ tục maple
mà tạo ra hình ảnh 2-D hay 3-D; plotargs-danh sách các đối số cho
lệnh plot; t-tên của tham số hình ảnh động được thực hiện; a, b-tên
của tham số hình ảnh động được thực hiện; L-danh sách các giá trị.
>animate(plot,[sin(A*x),x=-Pi..Pi, thickness =2],A=1..5);

Hình E.1. Lệnh animate Hình E.2. Lệnh animate3d

animate3d(F, x, y, t); Dùng tạo ra hoạt hình 2-D và 3-D, hỗ trợ


cho đồ thị của một hoặc nhiều lệnh như các biểu thức, thủ tục,
hoặc các lệnh tham số ba chiều, trong đó F- Các lệnh vẽ đồ thị; x-
khoảng trên trục x; y-khoảng trên trục y; t-khoảng xác định của
tham số.(Hình E.2).
>animate3d(cos(t*x)*sin(t*y),x=-Pi..Pi,y=-Pi..Pi,t=1..2);
animatecurve(F, r,...); Dùng để làm hoạt hình đồ thị của hàm số
thực trong không gian 2 chiều, trong đó F-lệnh vẽ hình của Maple;
r-khoảng xác định (Hình E.3).
>animatecurve(sin(x),x=-Pi..Pi, frames=50);

Hình E.3. Lệnh animatecurve Hình E.4. Lệnh arrow

305
306 Thực hành tính toán trong Maple

arrow(u, opts), arrow(u, v, opts), arrow(U, opts) ; Dùng để vẽ


một mũi tên hay một vectơ, trong đó u, v-một tập hợp của vectơ; U-
liệt kê danh sách chứa các cặp vectơ; opts-định các tùy chọn cho mũi
tên (Hình E.4).
>arrow([seq(‘<,>‘(sin(i), cos(i)*cos((7/23)*i),
sin((7/23)*i)), i = 1 .. 23)], axes = frame);
changecoords(p, coord); Dùng để thay đổi tọa độ cho đồ thị p sang
hệ tọa độ mới, trong đó p- dữ liệu của đồ thị; coord-hệ tọa độ mới
(Hình E.5).
>p:= plot3d([1.3^x*sin(y),x,y],x=-1..2*Pi,y=0..Pi):
>changecoords(p, spherical);

Hình E.5. Lệnh changecoords Hình E.6. Lệnh complexplot

complexplot(expr, t=a..b, xv, yv, options);


complexplot(f, a..b, xv, yv, options);
complexplot(L, xv, yv, options);
Dùng để tạo ra đồ thị 2-D, trong đó expr - biểu thức tham số t xác
định một đường cong; t- tham số; f -thủ tục trong một biến xác định
một đường cong; a, b- thiết bị đầu cuối của phạm vi thông số; L-danh
sách; số phức quy định cụ thể như điểm; xv-tên trong dãy, xem trục
ngang; yv-tên trong dãy, xem trục đứng; options-trình tự của phương
trình,lựa chon đồ thị (Hình E.6).
>complexplot(cos+I*sin,-Pi ..Pi, -.8 .. .8,-1..1);
complexplot3d([expr1, expr2], x=a..b, y=c..d);
complexplot3d([f1, f2], a.. b, c.. d);
complexplot3d(expr3, z=a + b*I..c + d*I);
complexplot3d(f2, a + b*I..c + d*I);
Dùng để tạo ra đồ thị biến phức 3-D, trong đó expr1, expr2-biểu thức
trong tham số x và y; f 1, f 2-hàm số; expr3-biểu thức trong tham số
z; a, b, c, d- biên của dãy tham số (Hình E.7).
>f:= z->sec(z);
>complexplot3d(f, -2-2*I .. 2+2*I);
Phụ lục E. Gói lệnh vẽ đồ thị 307

Hình E.7. Lệnh complexplot3d Hình E.8. Lệnh conformal

conformal(F, r1, r2, options); (Hình E.8).


Dùng để tạo hình ảnh của một mạng lưới, trong đó F-thủ tục hoặc
hàm biến phức; r1, r2-phạm vi của mẫu a..b; options-lựa chọn đồ thị.
>with(plots):
>conformal((z-I)/(z+I), z = -3-3*I .. 3+3*I,
-4-4*I .. 4+4*I,grid = [30, 30], style = line);
conformal3d(F, r1, options);
Lệnh hoạt động trong cùng một cách như là lệnh conformal, ngoại
trừ việc F xác định trên mặt cầu Riemann, và nó chỉ chấp nhận các
thông số dải đầu tiên (Hình E.9).
>conformal3d(cos(z), z = 0 .. 2*Pi+I*Pi,
color=["DeepPink", "Yellow"], spherecolor="black");

Hình E.9. Lệnh conformal3d Hình E.10. Lệnh contourplot

contourplot(expr1, x=a..b, y=c..d, opts);


contourplot(f, a..b, c..d, opts);
contourplot([exprf, exprg, exprh], s=a..b, t=c..d, opts);
contourplot([f, g, h], a..b, c..d, opts);
Dùng tạo ra đồ thị đường viền 2-D cho một biểu thức, trong đó f , g, h-
các hàm để vẽ đồ thị; expr1-biểu thức theo x, y; expr f , exprg, exprh-
biểu thức theo s và t; a, b-hằng số thực; c, d-hằng số thực, thủ tục hoặc
các biểu thức trong x; x, y, s, t-biến; opts-tùy chọn (Hình E.10).
>contourplot({x+2*y, sin(x*y)},x=-Pi ..Pi,y =-Pi ..Pi);
contourplot3d(expr1, x=a..b, y=c..d, opts);
contourplot3d(f, a..b, c..d, opts);
308 Thực hành tính toán trong Maple

contourplot3d([exprf, exprg, exprh], s=a..b, t=c..d, opts);


contourplot3d([f, g, h],a..b, c..d, opts) ;
Dùng tạo ra đồ thị đường viền 3-D cho một biểu thức, trong đó f , g, h-
hàm để vẽ đồ thị; expr1-biểu thức theo x, y; expr f , exprg, exprh-biểu
thức theo s và t; a, b-hằng số thực; c, d-hằng số thực, thủ tục hoặc các
biểu thức theo x; x, y, s, t-các biến; opts-tùy chọn đồ thị (Hình E.11).
>contourplot3d(-5*x/(x^2+y^2+1), x = -3 .. 3,
y = -3 .. 3, filledregions = true);

Hình E.11. Lệnh contourplot3d Hình E.12. Lệnh densityplot

densityplot(expr1, x=a..b, y=c..d); densityplot(f, a..b, c..d);


Dùng để tạo mật độ cho đồ thị 2 chiều. Lệnh densityplot tự động
phát hiện một phạm vi rộng tạo ra một sự tương phản trực quan dễ
nhìn và độ sáng cho đồ thị và cho phép tinh chỉnh, trong đó f -hàm
vẽ đồ thị; expr1-thiết lập các biểu thức theo x và y; a, b-hằng số thực;
c, d-hằng số thực, thủ tục xác định các giới hạn của chiều thứ hai;
x, y- biến (Hình E.12).
>densityplot(x^3, x = -1 .. 1, y = x^2-1 .. 1-x^2);
display(L, inseq, options); display(A, options);
display(P, inseq);
Dùng để hiển thị một danh sách các đồ thị, trong đó L- dãy (list)
các đồ thị(ví dụ L := a, b, c;, a, b, c, là đồ thị riêng biệt); A- mảng một
chiều hoặc hai chiều của các đồ thị; P- đồ thị hoạt hình; insequence =
true( f alse)- nó cho phép hiện từng đồ thị trong dãy (list) theo trình tự
của dãy; options- các tính chất cơ bản của các lệnh vẽ như plot/options
(Hình E.13).
>with(plots):
>F:= plot(cos(x), x= -Pi ..Pi,y=-Pi ..Pi, style = line):
>G:= plot(tan(x), x= -Pi ..Pi,y=-Pi ..Pi, style = point):
>display({F, G},axes = boxed, scaling = constrained,
title = ‘Cosine and Tangent‘);

dualaxisplot(expr1, expr2, xrange, opts);


dualaxisplot(p1, p2, mopts);
Phụ lục E. Gói lệnh vẽ đồ thị 309

Hình E.13. Lệnh display Hình E.14. Lệnh dualaxisplot

Dùng để tạo ra một đồ thị vớ 2 trục y, x, trong đó expr1, expr2-biểu


thức; xrange-phạm vi của x; p1, p2-cấu trúc đồ thị được tạo ra bởi
lệnh của đồ thị Maple; opt-tùy chọn đồ thị; mopts-tùy chọn đồ thị
phải được sáp nhập với các cấu trúc PLOT (Hình E.14).

>dualaxisplot(inequal({x-y<=1,0<x+y}, x=-3..3, y=-3..3,


optionsexcluded=(color=white)),conformal(z^2,z=0..2+2*I));
fieldplot(f, x=r1, y=r2, options), fieldplot(f, r1, r2, options)
Dùng để vẽ một trường vectơ 2-D, trong đó f -trường vector được
vẽ; x- tọa độ thứ nhất; r1-khoảng tọa độ đầu tiên; y-tọa độ thứ hai;
r2-khoảng tọa độ thứ hai (Hình E.15).
>with(plots):
>fieldplot([r,0],r=0..1,t=0..(1/2)*Pi,coords=polar);

Hình E.15. Lệnh fieldplot Hình E.16. Lệnh fieldplot3d

fieldplot3d(f, x=r1, y=r2, z=r3, options);


fieldplot3d(f, r1, r2, r3, options);
Dùng để vẽ một trường vectơ 3-D, trong đó f -trường vector được vẽ;
x- tọa độ thứ nhất; r1-khoảng tọa độ đầu tiên; y-tọa độ thứ hai; r2-
khoảng tọa độ thứ hai; z-tọa độ thứ ba; r3-khoảng tọa độ thứ ba
(Hình E.16).
>with(plots):
>fieldplot([r,0],r=0..1,t=0..(1/2)*Pi,coords=polar);
gradplot(f, r1, r2, options); gradplot(f, r1, r2,..., options);
Dùng tạo ra đồ thị một trường vector gradient 2-D, trong đó f -hàm
310 Thực hành tính toán trong Maple

để vẽ đồ thị; r1-miền giá trị; r2-miền giá trị (Hình E.17).

>with(plots):
>gradplot(sin(x*y),x=-Pi..Pi,y=-Pi..Pi,
arrows=SLIM,grid=[8,8]);

Hình E.17. Lệnh gradplot Hình E.18. Lệnh gradplot3d

gradplot3d(f, r1, r2, r3); gradplot3d(f, r1, r2, r3,...);


Dùng để tại ra đồ thị một trường vector gradient 3-D, trong đó f -hàm
để vẽ đồ thị; r1, r2, r3-miền giá trị (Hình E.18).
>with(plots):
>gradplot3d(sin(x*y*z), x=-Pi..Pi,y=-Pi..Pi, z=-Pi..Pi,
grid=[4,4,4], color=black, arrows=THICK);
implicitplot(expr1,x=a..b,y=c(x)..d(x), options);
implicitplot(ineq, x=a..b,y=c(x)..d(x), options);
implicitplot([expr1,expr2,t], x=a..b, y=c(x)..d(x));
Dùng để tạo đồ thị ẩn hai chiều (Hình E.19).
>with(plots, implicitplot):
>plots[implicitplot](2*Pi*r-t,r=0..1,t=0..2*Pi,coords=polar,
axes = boxed,outlines, grid = [5, 5], gridrefine = 2,
style=point,axiscoordinates=polar);

Hình E.19. Lệnh implicitplot Hình E.20. Lệnh implicitplot3d

implicitplot3d(expr, x=a..b, y=c..d, z=p..q, options);


implicitplot3d(f, a..b, c..d, p..q, options);
Dùng để tạo đồ thị ẩn ba chiều, trong đó expr-phương trình chứa các
Phụ lục E. Gói lệnh vẽ đồ thị 311

biểu thức tại x, y, z; f − phương trình hoặc thủ tục; a, b, c, d, p, q-hằng


số thực; options-lựa chọn đồ thị 3d (Hình E.20).

>with(plots):
>implicitplot3d([(x+2)^2+(y+2)^2+(z+2)^2 = 9,
(x-2)^2+(y-2)^2+(z-2)^2 = 6],x = -5 .. 5,
y = -5 .. 5, z = -5 .. 5, color = [blue, green],
scaling = constrained, axes = boxed);
interactive(expr, variables) Dùng để xây dựng tương tác đồ thị.
interactiveparams(pcom, pargs,t1=a1..b1, ...,tn=an..bn,opts);
Dùng tạo ra đồ thị với các thông số tương tác.
inequal(ineqs, xspec, yspec, options); Dùng để xác định bất
đẳng thức tuyến tính (Hình E.21).

>with(plots):
>inequal({x+y >0,y =2,x-y<= 1},x=-3.. 3, y = -3 .. 3 ,
optionsfeasible=[color="DarkGrey"] ,
optionsopen = [color = "Navy", thickness = 2],
optionsclosed = [color = "Niagara_Green", thickness = 3],
optionsexcluded = [color = "WhiteSmoke"]);

Hình E.21. Lệnh inequal Hình E.22. Lệnh intersectplot

intersectplot(surface1, surface2, options);


intersectplot(expr1, expr2, x=a..b, y=c..d, options);
intersectplot(proc1, proc2, a..b, c..d, options);
intersectplot(expr1, expr2, x=a..b, y=c..d, z=e..f, options);
intersectplot(proc1, proc2, a..b, c..d, e..f, options);
Dùng vẽ giao của các mặt, trong đó sur f ace1, sur f ace2-mặt chính;
expr1, expr2-biểu thức thể hiện mặt ẩn; proc1, proc2-quy trình thể
hiện mặt ẩn; x, y, z-biến đồ thị(trục); a, b, c, d, e, f -miền giá trị thực
(Hình E.22).
312 Thực hành tính toán trong Maple

>with(plots, intersectplot):
>intersectplot(surface([sin(s)*cos(t),sin(s)*sin(t), cos(s)],
s=0..Pi,t=0..2*Pi),surface([(1/2)*sinh(v),(1/2)*cosh(v)*cos(u),
(cosh(v)*sin(u)+1)*(1/2)], u = 0 .. 2*Pi, v = -3 .. 3),
axes = box, thickness = 2, orientation = [70, 40]);
listcontplot(G, options) Dùng vẽ đồ thị đường đồng mức hai chiều
của mạng lưới các giá trị (Hình E.23).
>with(plots):
>listcontplot(Matrix([seq([seq(sin((1/20)*
(i-15)*(j-10)/Pi), i = 1 .. 30)],j = 1 .. 20)]));

Hình E.23. Lệnh listcontplot Hình E.24. Lệnh listcontplot3d

listcontplot3d(G, options) ; Dùng vẽ đồ thị đường đồng mức ba


chiều của mạng lưới các giá trị (Hình E.24).
>with(plots):
>listcontplot3d([seq([seq(sin((i-15)*(j-10)/Pi/20),
i=1..30)],j=1..20)], filledregions=true);
listdensityplot(A, options); Dùng vẽ đồ thị mật độ với số liệu hai
chiều.
listplot(L, options); listplot(P, options); Dùng vẽ đồ thị hai chiều
của danh sách các giá trị, trong đó L-danh sách hoặc Vector của
các giá trị số; P-danh sách hoặc Matrix có chứa các điểm dữ liệu
(Hình E.25).
>with(plots):
>listplot([seq([t^2,cos(t)],t=0..40)]);

listplot3d(G, options); Dùng vẽ đồ thị ba chiều của danh sách các


giá trị, trong đó G-danh sách các giá trị số (Hình E.26).
>listplot3d([seq([seq(irem(j,i),i=1..30)], j=1..30)],
orientation=[-55,30]);
loglogplot(f, h, v, options); Dùng vẽ đồ thị logarit gấp đôi của các
hàm, trong đó f - hàm được vẽ; h-khoảng theo chiều ngang; v-khoảng
Phụ lục E. Gói lệnh vẽ đồ thị 313

Hình E.25. Lệnh listplot Hình E.26. Lệnh listplot3d

theo chiều đứng (Hình E.27).


>with(plots):
>loglogplot(1/x+x^10,x=0.1..10, gridlines);

Hình E.27. Lệnh loglogplot Hình E.28. Lệnh logplot

logplot(f, h, v, options); Dùng vẽ đồ thị logarit của hàm trong đó


trục đứng có một quy mô logarit, trong đó f -hàm được vẽ; h-khoảng
theo chiều ngang; v-khoảng theo chiều đứng (Hình E.28).
>with(plots):
>logplot(proc (x) options operator,arrow;
2^(sin(x)^5) end proc, 1 .. 10, axis[2] = [gridlines]);
matrixplot(A, options); Dùng vẽ đồ thị 3-D với z là giá trị được xác
định bởi một ma trận, trong đó A-matrix (Hình E.29).
>with(plots):
>with(LinearAlgebra):
>A:= HilbertMatrix(8);
>B:=ToeplitzMatrix([1,2,3,4, -4,-3,-2,-1],symmetric):
>matrixplot(A+B,heights=histogram, axes = boxed);

plot(f1, f2,..., h, v, options); plot([f1, f2,...], h, v, options);


plot3d([f1,f2,..],h,v,options); plot3d(f1,f2,...,h,v,options);
Dùng vẽ đồ thị trong 3-D, trong đó f 1, f 2, ...-chức năng để được vẽ;
h-khoảng ngang; v-khoảng đứng (Hình E.30).
314 Thực hành tính toán trong Maple

Hình E.29. Lệnh matrixplot Hình E.30. Lệnh plot

>with(plots):
>plot3d([cos(x)-2*cos(0.4*y),sin(x*y)],x=-10..10, y=-1..1,
style=[PATCH, PATCHNOGRID], shading=[DEFAULT,
ZGRAYSCALE], lightmodel=light1);
odeplot(dsn, vars, range, options); Dùng vẽ đồ thị 2-D hoặc đồ 3-
D với đầu ra từ dsolve, trong đó
dsn-đầu ra từ dsolve; vars-trục và chức năng đồ thị; range-khoảng
của các biến độc lập (Hình E.31).
>with(plots):
>p:=dsolve({y(0)=1,(D(y))(x)=y(x)},type=numeric,range=-5..2):
>odeplot(p);

Hình E.31. Lệnh odeplot Hình E.32. Lệnh pareto

pareto(freq, opts); Dùng vẽ đồ thị tạo ra một sơ đồ Pareto


(Hình E.32).
>with(plots, [pareto]):
>Pdata:= [‘Engine 1‘= 327,‘Engine 2‘=240,‘Engine 3‘=176,
‘Wire 1‘ = 105, ‘Wire 2‘ = 43,‘Wire 3‘ = 36,Oil = 33,
Coils = 90, ‘Gear Box‘ = 61,‘Steam line‘ = 50,Others = 166]
>Fdata:= map(rhs, Pdata): Lab:= map(lhs, Pdata):
>pareto(Fdata, tags = Lab, title = ‘Plant Problems‘)
plotcompare(f(z),g(z),z=a+c*I..b+d*I,options);
plotcompare(f(z) = g(z), z = a+c*I..b+d*I , options);
plotcompare(f, g, a+c*I..b+d*I, options);
plotcompare(f = g, a+c*I..b+d*I, options);
Phụ lục E. Gói lệnh vẽ đồ thị 315

Dùng vẽ đồ thị để so sánh biểu thức trên đồ họa, trong đó e, g-biểu


thức để được vẽ; z-tên biến; a, b, c, d-hằng số thực(Hình E.33).
>with(plots):
>plotcompare(x^(1/3),signum(x)*abs(x)^(1/3),scale_range=2);

Hình E.33. Lệnh plotcompare Hình E.34. Lệnh pointplot

pointplot(L,options); pointplot(A,options);
pointplot(v1,v2,options);
Dùng vẽ một đồ thị điểm 2-D, trong đó L-danh sách các điểm hai
chiều; A − n bởi hai Matrix, trong đó n là bất kỳ số nguyên dương;
v1, v2-vectơ cùng chiều dài; options-tùy chọn hình thức bằng giá trị
(Hình E.34).
>with(plots):
>points:= {seq([T^2, T], T = 0 .. 40)}:
>pointplot(points,coords=polar,color=red);
pointplot3d(L, options); pointplot3d(A, options); quad
pointplot3d(v1, v2, v3, options);
Dùng tạo ra một đồ thị điểm 3-D, trong đó A − n bởi ba Matrix,
trong đó n là bất kỳ số nguyên dương; v1, v2, v3-vectơ cùng chiều
dài; options-phương trình của các lựa chọn hình thức bằng giá trị
(Hình E.35).
>with(plots):
>pointplot3d({[0,1,1],[1,-1,2],[3,0,5]},
axes=normal,symbol=box);

Hình E.35. Lệnh pointplot3d Hình E.36. Lệnh polarplot


316 Thực hành tính toán trong Maple

polarplot(expr, theta=a1..a2, opts); polarplot(f, a1..a2, opts);


polarplot(m, opts); polarplot(v1, v2, opts);
Dùng tạo ra một đồ thị trong tọa độ cực với trục cực, trong đó
expr-biểu thức theo theta; f -thủ tục; a1, a2-hằng số thực; m-ma trận;
v1, v2-vectơ; opts-đồ thị lựa chọn (Hình E.36).
>with(plots):
>polarplot([[t,t,t=-Pi..Pi],[2*cos(t),
sin(t), t=-Pi..Pi]], numpoints=50);
polygonplot(L, options); polygonplot(A, options);
polygonplot(v1, v2, options);
Dùng tạo ra một đồ thị đa diện, trong đó L-danh sách các đỉnh đa
giác; A − n matrix, trong đó n là bất kỳ số nguyên dương; v1, v2-vectơ
cùng chiều dài; options-phương trình của các lựa chọn hình thức giá
trị (Hình E.37).
>with(plots):
>ngon:= n ->[seq([cos(2*Pi*i/n),sin(2*Pi*i/n)],i = 1..n)]:
>display([polygonplot(ngon(8),color=blue),textplot([0,0,‘
Octagon‘])], axes=none);

Hình E.37. Lệnh polygonplot Hình E.38. Lệnh polygonplot3d


polygonplot3d(L, options); polygonplot3d(A, options);
polygonplot3d(v1, v2, v3, options);
Dùng vẽ khối đa diện trong không gian ba chiều, trong đó L-danh
sách các đỉnh đa giác, được đưa ra như là một danh sách ba phần tử;
A − n bởi 3 Matrix, trong đó n là bất kỳ số nguyên dương; v1, v2, v3-
vectơ cùng chiều dài; options-phương trình của các lựa chọn hình
thức giá trị (Hình E.38).
>with(plots):
>list_polys:=[seq([seq([(1/10)*T,(1/20)*S,sin((1/20)*T*S)],
T = 0 .. 20)], S = 1 .. 4)]:
>polygonplot3d(list_polys, color=["Blue","Purple",
"HotPink","Pink"]);
polyhedra_supported(); Dùng liệt kê tên các khối đa diện hỗ trợ
bởi polyhedraplot (Hình E.39).
Phụ lục E. Gói lệnh vẽ đồ thị 317

>with(plots):
>polyhedra_supported();
>polyhedraplot([0,0,0], polytype=TriakisIcosahedron,
scaling=constrained);

Hình E.39. polyhedra_supported Hình E.40. Lệnh polyhedraplot

polyhedraplot(L, options); Dùng vẽ khối đa diện trong 3-D, trong


đó L-danh sách các điểm ba chiều (Hình E.40).
>with(plots):
>p:= seq([cos(t*Pi/50)*(10+4*sin(9*(t*Pi/50))),
sin(t*Pi/50)*(10+4*sin(9*(t*Pi/50))),
4*cos(9*(t*Pi/50))],t=0..200):
>polyhedraplot([p],polyscale=.4,polytype=hexahedron,
scaling=constrained, orientation=[76,40]);
rootlocus(f, s, r, options); Dùng vẽ đồ thị rootlocus, trong đó f -hợp
hợp theo s; s-biến; r-khoảng (Hình E.41).
>with(plots):
>rootlocus( (s^5-1)/(s^2+1),s,-5..5,
style=point,adaptive=false);

Hình E.41. Lệnh rootlocus Hình E.42. Lệnh semilogplot

semilogplot(f, h, v, options); Dùng cho đồ thị bán logarit của các


hàm trên trục ngang, trong đó f -hàm được vẽ; h-khoảng nằm ngang;
v-khoảng thẳng đứng (Hình E.42).
>with(plots):
>semilogplot({ x->2^(sin(x)), x->2^(cos(x))}, 1..10);
318 Thực hành tính toán trong Maple

SetColors(color1, color2, ..., color10); Lệnh setcolors dùng để tạo


màu sắc của các đồ thị trong các Student subpackages.
setoptions(options); Dùng thiết lập các tùy chọn mặc định với các
đồ thị (Hình E.43).
>with(plots):
>setoptions(title=‘Family Plot‘, axes=boxed);
>plot({seq(cos((x^2+(0.4*i)^2)/4)/(x^2+(0.4*i)^2+Pi),
i=1..10)},x=-3..10);

Hình E.43. Lệnh setoptions Hình E.44. Lệnh setoptions3d

setoptions3d(options); Dùng để thiết lập các tùy chọn mặc định


cho đồ thị 3-D (Hình E.44).
>with(plots):
>setoptions3d(title=‘My Kind of Donut‘,
style=patch,axes=boxed,scaling=constrained);
>plot3d([cos(y)*(10.0+6.0*cos(x)),
sin(y)*(10.0+6.0*cos(x))-6.0*sin(x)],
x=-Pi..Pi,y=-Pi..Pi);
spacecurve(sc, r, opts); Dùng vẽ đồ thị của mặt cong không gian
3-D, trong đó sc-danh sách, dãy, hoặc một đường cong không gian;
r-tên dãy, các tham số; opts-phương trình xác định các lựa chọn cho
lệnh spacecurve (Hình E.45).
>with(plots):
>spacecurve({[sin(t),0,cos(t),t=0..2*Pi],
[cos(t)+1,sin(t),0,numpoints=10]}, t=-Pi..Pi,axes=frame);

sparsematrixplot(A, options); Lệnh sparsematrixplot là đồ thị 2-


D của các giá trị khác không của một ma trận (Hình E.46).
>with(plots):
>with(LinearAlgebra):
>C:=RandomMatrix(8,10,density=0.15):
>sparsematrixplot(C, ’matrixview’);
Phụ lục E. Gói lệnh vẽ đồ thị 319

Hình E.45. Lệnh spacecurve Hình E.46. Lệnh sparsematrixplot

surfdata(f, options); surfdata(g, r1, r2, options); Dùng tạo ra


một đồ thị mặt 3-D từ dữ liệu, trong đó f -Mảng ba chiều; g-Mảng
hai chiều; r1, r2-dao động (Hình E.47).
>with(plots):
>cosdt:=[seq([seq([i,j,evalf(cos((i+j)/5))],i=-5..5)],
j=-5..5)]:
>sindt:=[seq([seq([i,j,evalf(sin((i+j)/5))],i=-5..5)],
j=-5..5)]:
>surfdata({sindt,cosdt},axes=frame,labels=[x,y,z]);

Hình E.47. Lệnh surfdata Hình E.48. Lệnh textplot

textplot(L, options); Dùng đặt văn bản cạnh đồ thị (Hình E.48).
>with(plots):
>p:= plot(sin(x),x=-Pi..Pi):
>t1:=textplot([Pi/2,1,’typeset’("Local Maxima ",[Pi/2,1])],
’align’=’above’):
>t2:=textplot([-Pi/2,-1,’typeset’("Local Minima",
[-Pi/2,-1])],’align’=’below’):
>display({p,t1,t2}, ’view’=[-Pi..Pi, -1.5..1.5]);
textplot3d(L, options); Dùng đặt văn bản bên đồ thị 3-D.
>with(plots):
>textplot3d([[1,2,3,"antelope"],[3,2,1,"tiger"]],
’axes’=’boxed’, ’view’=[0..4, 0..4, 0..4]);
320 Thực hành tính toán trong Maple

tubeplot(C, options); Dùng vẽ đồ thị ống ba chiều.


>with(plots):
>tubeplot([3*sin(t),t,3*cos(t)],t=-3*Pi..4*Pi,
radius=1.2+sin(t), numpoints=80);
TÀI LIỆU THAM KHẢO

Tài liệu tiếng Việt

[1] Phạm Huy Điển, Đinh thế Lục, Ta Duy Phương, Hướng dẫn
thực hành tính toán trên Maple V, NXB GD, Hà Nội, 1998.
[2] Nguyễn Hữu Điển, Hướng dẫn và sử dụng Maple V, NXB Thống
Kê, Hà Nội, 1999.
[3] Phạm Huy Điển (Chủ biên), Nguyễn Hoàng Dương, Phạm Ngọc
Hùng, Tạ Duy Phượng,Tính toán, lập trình và giảng dạy toán
học trên Maple, NXB KHKT, Hà Nội, Hà Nội, 2002.
[4] Phan Đức Châu, Sử dụng Maple trong Toán sơ cấp và Toán cao
cấp, NXB KHKT, 2005.
[5] Nguyễn Hữu Điển, Một số vấn đề về thuật toán, NXB GD, 2005.
[6] Phạm Minh Hoàng, Maple và các bài toán ứng dụng, NXB
KHKT, 2005.

Tài liệu tiếng Anh

[7] M. B. Monagan, K. O. Geddes, K. M. Heal, G. Labahn and S.


Vorkoetter Maple V : Programming Guide Springer, 1996.
[8] M. B. Monagan, K. O. Geddes, K. M. Heal, G. Labahn and S.
Vorkoetter Maple V : Programming Guide Springer, 1996.
[9] Andre Heck, Introduction to Maple Springer, 1996.
[10] Robert M. Corless Essential Maple 7, An Introduction for Sci-
entific Programmers, Springer-Verlag, 2002.
[11] A. Portela, A. Charafi Finite Elements Using Maple, A Sym-
bolic Programming Approach, Springer-Verlag, 2002.
[12] M. B. Monagan K. O. Geddes K. M. Heal G. Labahn S. M.
Vorkoetter J. McCarron P. DeMarco, Maple 9 Advanced Pro-
gramming Guide. Toronto: Maplesoft, a division of Waterloo
Maple Inc., 2003.
[13] M. B. Monagan K. O. Geddes K. M. Heal G. Labahn S. M.
Vorkoetter J. McCarron P. DeMarco, Maple 9 Advanced Pro-
gramming Guide. Toronto: Maplesoft, a division of Waterloo
Maple Inc., 2003.

321
322 Thực hành tính toán trong Maple

[14] M. B. Monagan K. O. Geddes K. M. Heal G. Labahn S. M.


Vorkoetter J. McCarron P. DeMarco, Maple 9 Introductory Pro-
gramming Guide. Toronto: Maplesoft, a division of Waterloo
Maple Inc., 2003.
[15] Putz, John F., Maple animation, Chapman & Hall/CRC, 2003.
[16] Walter Gander, Jiri Hrebicek, Solving Problems in Scientific
Computing Using Maple and MATLAB Springer-Verlag, 2004.
[17] Peter Adams, Ken Smith, Rudolf Vy’borny’, Introduction to
mathematics with maple, World Scientific, 2004.
[18] Martha L. Abell and James P. Braselton, Maple by Example,
Elsevier Academic Press, 2005.
[19] Inna Shingareva, Carlos Lizárraga-Celaya, Maple and Math-
ematica, A Problem Solving Approach for Mathematics,
Springer-Verlag, 2007
[20] K.D. Möller Optics, Learning by Computing, with Examples.
Using Mathcad, Matlab, Mathematica, and Maple, Second Edi-
tion, Springer, 2007
[21] George A. Articolo Partial Differential Equations and Bound-
ary Value Problems with Maple, Second Edition Elsevier, 2009.
[22] Jonathan M. Borwein and Matthew P. Skerritt, An Introduc-
tion to Modern Mathematical Computing, Springer, 2011.

Tài liệu trên Internet

[23] http://nhdien.wordpress.com
[24] http://www.maplesoft.com/products/maple
[25] http://maplevn2008.wordpress.com
[26] http://www.vnmath.com/2013/04/tai-ve-maple-17-download-
maple-2013-full.html
DANH MỤC TỪ KHÓA
&*, 93 arrow, 306
*, 22, 29 arrows, 217
**, 22 assign, 47
+, 22, 29 assume, 204
-, 22 asympt, 58
->, 38 atsign, 68
.., 30 AudioTools, 265
/, 22 augment, 285
<, 30 axes, 135
<=, 30 axesfont, 129
<>, 30
=, 30 band, 285
>, 30 basis, 100, 209, 285
>=, 30 bernoulli, 25
[, 35 BesselI, 26
$, 210 BesselJ, 26
%, 23 BesselK, 26
_, 29 BesselY, 26
], 35 Beta, 26
bezout, 285
Bi, 26
abs, 22, 25
binomial, 25
addcol, 102, 284
Bits, 265
additionally, 204
blockmatrix, 285
addrow, 102, 284
boxed, 135
adj, 284
break, 164
adjoint, 284
by, 161
agument, 102
Ai, 26 C, 182
algcurves, 265 Cache, 265
Algebraic, 265 CAD, 265
alias, 39 cartesian, 135
and, 30 Catalan, 27
angle, 92, 284 changecoords, 306
animate, 151, 305 changevar, 205
animate3d, 153, 305 charmat, 96, 286
animatecurve, 149, 305 charpoly, 96, 286
antisymmetric, 91 cholesky, 286
arccos, 25 classical, 213
arccoth, 25 codegen, 265
arccsch, 25 CodeGeneration, 182, 265
arcsec, 25 CodeTools, 265
arcsech, 25 coeff, 81
arcsin, 25 col, 102, 287, 301
arctan, 25 coldim, 101, 287
arctanh, 25 collect, 74, 273
args, 169 ColorTools, 265
array, 89 colspace, 101, 287
ArrayTools, 265 colspan, 287

323
324 Thực hành tính toán trong Maple

combinat, 265 denom, 273


combine, 70, 202 densityplot, 308
combstruct, 265 depends, 273
companion, 288 DEplot, 216
complex, 52, 56 det, 274, 289
complexplot, 306 DEtools, 266
complexplot3d, 306 diag, 103, 289
concat, 102, 288 Diff, 201
cond, 288 diff, 59, 201, 219, 274
conformal, 127, 128, 306 diffalg, 263
conformal3d, 307 DifferentialAlgebra, 263, 266
conjugate, 273 DifferentialGeometry, 266
constrained, 134 difforms, 266
ContextMenu, 265 Digits, 36
continuous, 203 dilog, 26
contourplot, 307 Dirac, 26
contourplot3d, 307 discont, 274
convert, 57, 79, 227, 273 DiscreteTransforms, 266
coordplot, 117 display, 147, 308
coordplot3d, 131 distributed, 74
coords, 121, 135, 223 diverge, 224, 290
copy, 89 divide, 274
copyinto, 102, 288 do, 160
cos, 25, 273 DocumentTools, 266
cosh, 25 Domains, 266
cost, 273 dotprod, 92, 290
cot, 25 Doubleint, 204
coth, 25 dsolve, 206, 208, 212
crossprod, 273, 288 dualaxisplot, 308
csc, 25 dverk78, 213
csch, 25 DynamicSystems, 266
csgn, 273
CSharp, 182 eBookTools, 266
CUDA, 265 eigenvals, 96, 290
curl, 100 eigenvalues, 290
CurveFitting, 266 eigenvectors, 290
cylinderplot, 144 eigenvects, 96, 290
cylindrical, 132, 135, 223 elif, 159
else, 158
D, 202, 209 entermatrix, 290
Database, 266 entries, 87
definite, 289 equal, 290
delcol, 103 erf, 26
delcols, 289 error, 168, 171, 172
delrow, 103 euler, 25
delrows, 289 eval, 89
Danh mục từ khóa 325

evalf, 37, 203, 274 gausselim, 96, 292


evalm, 93 GaussInt, 266
exact, 208 gaussjord, 104
ExcelTools, 266 Gcd, 25
exp, 25, 28, 71, 274 gcd, 25, 275
expand, 70, 274 gear, 213
explicit, 206 geneqns, 293
expln, 80 genfunc, 266
exponential, 96, 291 genmatrix, 103, 293
expsincos, 80 geom3d, 267
extend, 102, 291 geometry, 267
ExternalCalling, 266 gfun, 267
extrema, 220 GlobalOptimization, 267
grad, 99
factor, 78, 274 gradplot, 309
factorial, 80 gradplot3d, 310
false, 28, 158 GramSchmidt, 101, 275, 283
ffgausselim, 291 GraphTheory, 263, 267
fi, 158 Grid, 267
fibonacci, 292 grid, 128, 135
fieldplot, 309 Groebner, 267
fieldplot3d, 309 group, 267
FileTools, 266
Finance, 263, 266 hadamard, 293
finance, 263 has, 275
float, 29 hashmset, 267
for, 161, 164 heap, 267
Fortran, 182 hermite, 97, 293
forwardsub, 292 hessian, 293
fourier, 231 hidden, 135
fouriercos, 231 hilbert, 294
fourierseries, 229 Horner, 190
fouriersin, 231 htranspose, 294
frac, 25, 274 HTTP, 267
fraction, 29 hypergeom, 69, 80
frame, 135
frobenius, 292, 300 icontent, 275
from, 161 identity, 91
fsolve, 51 if, 158
fulldigits, 52 ifactor, 275
function, 30 igcd, 275
ihermite, 294
gama, 28 ilcm, 275
GAMMA, 26, 69 Im, 275
gausjord, 96 ImageTools, 267
Gausselim, 274 implicitplot, 310
326 Thực hành tính toán trong Maple

implicitplot3d, 310 lasterror, 172


indexed, 29 latex, 185
indexfunc, 294 lcd, 25
indices, 87 Lcm, 276
inequal, 311 lcoeff, 81, 276
infinity, 28, 54, 55, 226 LeastSquares, 296
innerprod, 294 left, 55
insequence, 147 lhs, 277
InstallerBuilder, 267 LibraryTools, 267
Int, 202 liesymm, 267
int, 59, 202, 276 limit, 53, 55, 277
integer, 29 linalg, 97, 263
IntegerRelations, 267 line, 120, 121, 217
IntegrationTools, 267 LinearAlgebra, 223, 263, 267
interactive, 311 LinearFunctionalSystems, 268
interactiveparams, 311 LinearOperators, 268
interface, 181 Lineint, 204
intersect, 34 linestyle, 116
intersectplot, 311 Linslove, 277
intparts, 205 Linsolve, 297
inttrans, 267 linsolve, 96
Inverse, 276 listcontplot, 312
invlaplace, 232 listcontplot3d, 312
iquo, 22, 276 listdensityplot, 312
irem, 22, 161, 276 listplot, 129
iroot, 276 listplot3d, 312
irreduc, 276 ListTools, 268
iscont, 276 ln, 71, 277
ismith, 295 local, 177
isprime, 159 log, 25, 277
isqrt, 276 log10, 25, 277
issimilar, 295 log[b], 25
iszero, 295 Logic, 268
itseq, 35 loglogplot, 312
logplot, 313
Jacobian, 296
lprint, 41
Java, 182
LREtools, 268
jordan, 96, 296
JordanBlockMatrix, 283
Magma, 268
kernel, 101, 296, 299 map, 62
Maplets, 268
labelling, 116 matadd, 297
laplace, 206, 232 MathematicalFunctions, 268
laplacian, 100, 296 MathML, 268
large, 217 Matlab, 182, 268
LargeExpressions, 267 Matrix, 297
Danh mục từ khóa 327

matrix, 93, 277 numtheory, 268


matrixplot, 313 numxy, 128
MatrixPolynomialAlgebra, 268
max, 25, 278 od, 160
maximize, 220, 278 odeplot, 213, 314
maxnorm, 278 op, 30, 163, 279
maxsols, 52 Optimization, 268
mdium, 217 optimize, 183
member, 278 option, 177
Mersen, 189 or, 30
method, 213 Order, 211
mgear, 213 order, 279
min, 25, 278 Ore_algebra, 269
minimize, 220, 278 OreTools, 269
minor, 297 orientation, 135
minpoly, 96, 298 orthog, 299
minus, 34 OrthogonalSeries, 269
MmaTranslator, 268 orthopoly, 269
modp, 278 output, 209
mods, 278
mtaylor, 228, 278 padic, 269
MTM, 268 pareto, 314
mul, 278 patch, 135
mulcol, 298 pdesolve, 279
mulrow, 102, 104, 298 PDEtools, 269
multiply, 298 permanent, 299
MultiSeries, 268 Physics, 269
Pi, 28
networks, 263 piecewise, 166, 279
next, 164 pivot, 299
nextprime, 279 plex, 75
none, 217 plot, 119, 123, 279, 313
nops, 30, 163, 279 Plot3d, 132
norm, 93, 298 plot3d, 133, 313
Normal, 278 plotcompare, 314
normal, 73, 135 plots, 269
normalize, 93 plottools, 269
not, 30 point, 120–122
NULL, 46 pointplo, 129
Nullspace, 278 pointplot, 315
nullspace, 101, 299 pointplot3d, 315
numapprox, 268 polar, 279
numboccur, 279 polarplot, 125, 316
numer, 279 polygonplot, 129, 316
numeric, 206, 212 polygonplot3d, 316
numpoints, 120, 122, 135 polyhedra_supported, 316
328 Thực hành tính toán trong Maple

polyhedra_supported, 146 resultname, 183


polyhedraplot, 146, 317 return, 168
polynom, 227 rhs, 211, 281
PolynomialIdeals, 269 right, 55
PolynomialTools, 263, 269 rkf45, 213
polyscale, 146 RootFinding, 270
polytools, 263 rootlocus, 317
polytype, 146 RootOf, 49, 69
potential, 300 roots, 281
power, 69, 71, 280 round, 25, 281
powmod, 280 row, 102, 287, 301
powseries, 269 rowdim, 101, 301
prevprime, 280 RowSpace, 301
print, 41 rowspace, 101
printlevel, 177 rowspan, 301
priqueue, 269 rref, 96
proc, 167 rsolve, 61
procedure, 30
process, 263 scalarmul, 302
ProcessControl, 269 scaling, 134
Product, 227 scene, 216
product, 227, 280 ScientificConstants, 270
projection, 135 ScientificErrorAnalysis, 270
Psi, 26, 71 sec, 25
psqrt, 280 sech, 25
Security, 270
QDifferenceEquations, 269 semilogplot, 317
queue, 269 seq, 32
quo, 280 series, 30, 57, 206, 211, 227, 281
SetColors, 318
radical, 69 setoptions, 318
randmatrix, 105, 300 setoptions3d, 318
RandomTools, 269 sign, 281
randvector, 300 signum, 25, 54, 281
rank, 280, 300 simplex, 222, 270
rationalize, 280 simplify, 48, 69, 202, 281
RationalNormalForms, 270 sin, 25, 281
readlib, 220 sincos, 80
real, 56 singular, 281
RealDomain, 270 singularvals, 302
rectangular, 132 sinh, 25
recursive, 74 Slode, 270
RegularChains, 270 small, 217
rem, 58, 280 smith, 96, 302
residue, 281 SNAP, 270
resolution, 120 Sockets, 270
Danh mục từ khóa 329

SoftwareMetrics, 270 textplot3d, 319


solve, 45, 281 then, 158
SolveTools, 270 Threads, 263, 271
sort, 75, 281 title, 120, 141
spacecurve, 318 to, 161
sparse, 91 toeplitz, 303
sparsematrixplot, 318 Tolerances, 271
sphereplot, 143, 144 trace, 177, 303
spherical, 132, 135 transpose, 303
Spread, 270 traperror, 172, 173
sqrt, 25, 28, 69 trig, 69, 71, 80
stack, 102, 270 Tripleint, 205, 206, 222
stackmatrix, 302 true, 28, 158
Statistics, 263, 270 trunc, 25, 282
stats, 263 tubeplot, 141, 142, 319
string, 29 type, 282
StringTools, 270 Typesetting, 271
Student, 263, 264 TypeTools, 271
student, 204, 263
style, 120, 121 unapply, 38, 282
submatrix, 104, 302 unconstrained, 134
subs, 49, 282 union, 34
subsop, 35 Units, 271
substring, 282 unwith, 264
subvector, 102, 303
value, 205, 282
sum, 36, 56, 226, 282
vandermonde, 304
sumbasis, 303
VariationalCalculus, 271
SumTools, 270
vecpotent, 304
sumtools, 271
vectdim, 101, 304
surd, 282
vector, 92, 304
surfdata, 318
VectorCalculus, 263, 271
swapcol, 102, 303
vectơ, 282
swaprow, 102, 104, 303
verboseproc, 181
sylvester, 303
view, 116, 135
symmdiff, 282
VisualBasic, 182
symmetric, 91
Syntax error, 40 whattype, 282
while, 160, 164
table, 86 wireframe, 135
tan, 25, 80 Worksheet, 271
tanh, 25 wronskian, 283, 304
taylor, 227
tcoeff, 81 XMLTools, 271
tdeg, 76 xtickmarks, 120
tensor, 271
textplot, 319 ytickmarks, 120
330 Thực hành tính toán trong Maple

Zeta, 26

You might also like