Professional Documents
Culture Documents
3
4 Thực hành tính toán
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
d2 d
2
(y( x )) + 2 (y( x ))) + y = e−x
dx dx
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
>plot(rhs(soln), x=0..8);
>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
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:
13
14 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
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
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
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?...
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
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:
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;.
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
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
>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
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
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
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.
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
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
>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
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.
>op(x+y+z);
x, y, z
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.
>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.
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.
định nghĩa trong proc / end với lập trình của 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.
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‘;‘
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ả.
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
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.
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.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).
a4 − b4
. 1.7. Giản ước biểu thức .
( a2 + b2 ) ab
. 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).
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.
>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.
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
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
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
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.
Đô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.
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ả.
>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.
>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
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
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
>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
>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)
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.
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 )
>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
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
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.
>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
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.
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]
>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,...
>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))
>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]
(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 .
x3
. 2.15. Tính các giá trị cực trị của y = .
4 − x2
. 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
. 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
. 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
∞
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
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.
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ố.
>simplify(<Biểu thức>);
Bảng 3.2. Các giá trị tham số <Qui tắc> của simplify
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
>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, ...
C. combine(.., exp) nhóm các phép nhân luỹ thừa trong biểu thức.
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.
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.
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
>sort(<Biểu thức>);
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>);
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ụ).
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. 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
>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.
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.
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
>factor(<Đa thức>);
II. Phân tích đa thức trên trường mở rộng đại số.
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
>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.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.
x − 1 − 2x + 3 + x < 2 − x + 5
2 3 6 2
x+5 4−x x+1
1 −
+ < 3x −
8 2 4
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.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.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.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.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.
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
>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]
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.
>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]);
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.
>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
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
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.
>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]
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.
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
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)
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]
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):
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
>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
>linalg[add](Id, Id);
2 0 0
0 2 0
0 0 2
>with(linalg, randmatrix);
[randmatrix]
>R:= randmatrix(2, 2); " #
−85 −55
R :=
−37 −35
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
>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.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.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]].
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
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
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.
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:
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.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
• 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
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ố.
<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.
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
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
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.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
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.
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);
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
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
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.
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.
Xem hình 5.27, 5.28, 5.29 các mặt của những hệ tọa độ khác
nhau.
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.
>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ì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]);
Hình 5.34. Tùy chọn scaling = Hình 5.35. Tùy chọn scaling =
unconstrained 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
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
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
Hình 5.44. plot3d tùy chọn Hình 5.45. plot3d tùy chọn
axes = box axes = normal
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]:
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ố
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.
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
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
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
>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]);
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]);
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
độ 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);
>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
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.
>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);
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ố
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.
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.
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.4. Vẽ đồ thị trong tọa độ cực cho bằng hàm ρ = 1 + cos ϕ cùng với
tên "Cardioida".
. 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.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.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.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.
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
if<điều kiện> then <Dãy lệnh 1> else <Dãy lệnh 2> fi;
b là số nguyên tố
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.
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
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.
>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.
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
>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
>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
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>,...);
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
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();
>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
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
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.
>first_neg(List);
−8
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ố
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
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 ))).
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)
>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
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>).
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
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:
>EvalPolyAt({2, 3, 4});
{−9, −1, 63}
>EvalPolyAt({295756, 585756, -101987});
{7651205213943063955647, 117723931975457965555647,
108190226139646787969}
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
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
>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;
>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.
>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;];
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);
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)
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
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 ,
>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
>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
>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();
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
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;
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ụ.
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:
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.
>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
. 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.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.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
. 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.
x = cos(πx )
<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:
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
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
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
π/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√
2π
3
II. Giải với các giá trị điều kiện ban đầu
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
>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);
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.
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(%).
>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
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
>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
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
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ới điều kiện ban đầu như trong lệnh sau đây:(Hình 7.9)
>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);
>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
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
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;
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.
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
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
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
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
>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).
>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
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
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
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) π
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.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.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:
. 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.
Hình 8.1. Lời giải bài 5.1 Hình 8.2. Lời giải bài 5.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
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)
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
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.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.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);
π π
− < 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);
. 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.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.
. 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.
255
256 Thực hành tính toán trong Maple
Khi cài xong chương trình luôn có hai cách khởi động 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.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
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,....
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
263
264 Thực hành tính toán trong Maple
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
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
1 4 3
1
>u:= Vector([1,2,3]); ⇒ u := 2
3
4
>x := Linsolve(A,u)mod 5; ⇒ x :=
1
0
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
2 0 2/3
1 −1/2 −4/3
ord := , ,
0 2 −1/3
−1 −1/2 0
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
>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
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
" #
− (−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
>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
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
>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
−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
305
306 Thực hành tính toán trong Maple
>with(plots):
>gradplot(sin(x*y),x=-Pi..Pi,y=-Pi..Pi,
arrows=SLIM,grid=[8,8]);
>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"]);
>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)]));
>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);
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);
>with(plots):
>polyhedra_supported();
>polyhedraplot([0,0,0], polytype=TriakisIcosahedron,
scaling=constrained);
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
[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.
321
322 Thực hành tính toán trong Maple
[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
Zeta, 26