Professional Documents
Culture Documents
Maple Và Các Bài Toán NG D NG, PH M Minh Hoàng
Maple Và Các Bài Toán NG D NG, PH M Minh Hoàng
Maple
và các
bài toán ứng dụng
T ôi còn nhớ cách đây không lâu, một học sinh lớp 9 đặt cho tôi một bài toán như sau:
∼∼∼∼∼∼∼
Hai đội công nhân làm chung một công việc trong 2g24'. Nếu mỗi đội chia
nhau làm nửa công việc thì thời gian hoàn tất là 5g. Hỏi thời gian mỗi đội
làm xong công việc của mình?
Loay hoay một lúc tôi mới tìm ra phương trình của bài toán và phải khó khăn lắm tôi mới cắt
nghĩa được cho em, rồi lại phải mất thêm một ít thời gian mới có thể tự mình tìm được phương
trình của bài toán. Nhưng đến khi thay số vào em lại làm sai, phải đợi đến khi em dùng máy
tính thì mọi chuyện mới xong.
Bất chợt tôi đặt câu hỏi: tìm ra được phương trình bài toán là co như đã đi được 3/4 đoạn
đường, phần còn lại chỉ là thay số, vậy mà em học sinh này lại làm sai, thật uổng. Nếu là người
chấm điểm, tôi có thể châm chước và cho em 7/10, nhưng nếu chỉ căn cứ vào kết quả hoặc thi
bằng trắc nghiệm có thể em bị 0 điểm. Vậy thì rõ ràng máy tính đã thay đổi tất cả.
Ngày nay, ở Việt Nam tất cả các kỳ thi cấp trung học trở lên đều được phép dùng máy tính
(không lập trình), điều đó có nghĩa là xã hội đã chấp nhận cho các em miễn làm tính bằng tay,
mà chẳng ai đặt vấn đề ''mất tư duy'' Toán học cả. Lên đến bậc đại học, công cụ này còn trở
lên tối cần thiết hơn cho sinh viên khoa học tự nhiên. Bắt sinh viên tính các bước trong phương
pháp Runge-Kutta không máy tính là các em chịu thua ngay mặc dù tất cả đều hiểu bài. Và lên
cao hơn nữa, các nhà nghiên cứu còn phải hoàn toàn dựa vào những máy tính siêu mạnh với
những phần mềm thích ứng để hỗ trợ họ trong các bài toán phức tạp. Như thế, họ đã ''khoán''
tất cả những tính toán tầm thường cho máy tính và để hết tâm trí của mình vào những chủ đề
chuyên sâu của họ.
Vị trí và vai trò của máy tính đã ngày một trở nên quan trọng, nhất là trong lãnh vực giáo
dục. Tin học hầu như là một môn bắt buộc cho các sinh viên ngay từ bước đầu vào đại học, và
càng lên cao, càng đi sâu vào một lãnh vực nào đó, con người bắt buộc phải dùng đến máy tính.
Bước ra ngoài đời, bước vào kỹ nghệ, công nghiệp, vai trò của máy tính lại trở nên quan trọng
hơn, đến nỗi chúng ta có thể khẳng định rằng: ngày nay nếu không có máy tính, con người sẽ
không làm gì được cả.
Không máy tính, ngày hôm nay con người không thể xây dựng những cây cầu hiện đại,
không thể dự đoán được thời tiết, không thể vẽ được các vỏ tàu, cánh máy bay, không thể đo độ
rung của một chiếc tên lửa... vốn là những vật dụng, những phương tiện gần gũi với chúng ta.
Lý do là máy tính có một khả năng tính toán và một bộ nhớ gần như vô hạn.
Tuy nhiên, cho dù có mạnh đến đâu đi chăng nữa, tất cả các máy tính đền tính toán trên
các°con số. Chúng có thế tính một triệu số lẻ của số π trong nháy mắt nhưng không tai nào tìm
8 (1)n π
ra n=0 2n+1 = 4 . Điều này gây ít nhiều khó khăn cho những nhà khoa học vốn đã quen với
các ký hiệu như x, BBx f (x, s), ln[sin(x2 + 1)] . . . nên họ vẫn ao ước có một công cụ thích ứng để
làm việc, một phần mềm không chỉ thao tác các con số, mà phải làm được điều này trên các ký
hiệu quen thuộc. Đó là một phần mềm tính toán hình thức1 . Và phải đợi tới năm 1980 đại học
Waterloo (Canada) mới hoàn tất công trình đồ sộ của mình và cho ra đời Maple.
Maple được viết ra từ mục đích đó.
Vào năm 1867, nhà thiên văn Delaunay đã bỏ ra 20 năm đằng đẵng để thiết lập và tính toán
quĩ đạo của mặt trăng dưới tác dụng của mặt trời. Biểu thức hoàn toàn bằng ký tự (hình thức)
này dài gần 2000 trang giấy. Một thế kỷ sau, năm 1970, nhà toán học A. Deprit chỉ mất 9 tháng
để viết một chương trình để tính toán lại2 . Ngày nay, có lẽ chúng ta chỉ mất khoảng nửa giờ!
Maple quả là tiết kiệm cho người dùng một khoảng thời gian khổng lồ.
Nhưng Maple có thể còn làm nhiều hơn thế.
Tôi còn nhớ một trong những ''kinh nghiệm xương máu'' của mình hồi học lớp 12. Thầy
dạy chúng tôi tính diện tích hình tròn bán kính r bằng cách chia nhỏ nó ra thành từng mảnh nhỏ
và xem như đó là những hình chữ nhật rồi cộng diện tích chúng lại để có được kết quả là πr2 .
Nhưng tôi mãi lấn cấn cái chuyện phải xem như đó là những hình chữ nhật. Vì nếu ''xem như''
thì rõ ràng đã có sai số, và nếu cộng hết các hình chữ nhật là cộng hết cả các sai số thì đâu thể
ra một cái gì tròn trịa như πr2 . Chính cái lấn cấn ấy đã làm điểm toán của tôi sút giảm nghiêm
trọng. Mãi đến khi có được Maple tôi mới nghiệm ra ''chân lý'' của vấn đề khi vẽ thật nhiều hình
chữ nhật để thấy rằng rõ ràng là nó tiến về diện tích hình tròn.
Đến đây , tôi nghĩ có nhiều thầy (thậm chí có cả các bạn sinh viên) phì cười cho rằng tôi
thuộc loại ''chậm tiêu''. Tôi nghĩ điều ấy không sai, nhưng riêng tôi, tôi lại nhìn vấn đề cách
khác. Cái gì đã làm cho mình hiểu ra vấn đề? câu trả lời là hình ảnh. Ngày xưa tôi không ''tiêu''
được chẳng qua là vì thầy không đủ sức vẽ thật nhiều những hình chữ nhật như Maple. Vậy tại
sao chúng ta không tận dụng những khả năng vượt trội của máy tính để tiết kiệm thời gian?.
Tôi nghĩ không cần dài dòng để thuyết phục về ưu điểm của máy tính trong một bài thuyết
trình (chứ không riêng gì việc học). Một diễn giả ngồi đọc lê thê sẽ không cuốn hut bằng chiếu
cùng một nội dung ấy lên màn hình. Mà đã không cuốn hút thì khó đưa nội dung ''vào đầu'' thính
giả. Đặc biệt nếu những nội dung ấy là những trừu tượng như toán thì lại càng phải cụ thể hóa,
sinh động hóa.
Tôi còn nhớ khi dạy toán bằng Maple vào một ngày không có máy chiếu. Sinh viên ngồi
nhìn bảng đen mà tôi cứ nghĩ tâm hồn các bạn đang lượn lờ ở ''chốn bồng lai'' nào (vì các khái
niệm ấy các em đều đã học qua). Nhưng khi có máy chiếu, tôi thấy các em háo hức mừng lộ ra
mặt. Cặp mắt lờ đờ khi nãy bỗng sinh động khác thường, cứ mỗi khi thay slide là khuôn mặt
các em cũng thay đổi theo. Rồi đến khi thực hiện những bài tập lớn cuối học kỳ, rất nhiều bạn
đã làm nhiều hơn những gì chủ đề đòi hỏi. Lý do là các bạn ấy đã hiểu rõ hiện tượng mà không
ngần ngại sử dụng sức mạnh của máy tính để khai triển xa hơn. Điều đó là việc ''xưa nay hiếm''.
Vậy thì rõ ràng Maple đã giúp ích cho việc học toán.
Trên đây tôi vừa nhắc đến những hình chữ nhật xấp xỉ hình tròn. Điều ấy nếu là một người
có ''hoa tay'', thầy tôi có thể vẽ được. Nhưng khi đó là những hình trong không gian, những
hình co-nic 3 chiều thì không dễ dàng đề vẽ. Tôi còn nhớ khi dạy phương pháp đường dốc nhất
(steepest descent) trong môn Tối Ưu hóa hàm nhiều biến, để cắt nghĩa phương pháp, tôi cứ phải
liên tục làm những động tác một người đang lao xuống vực để các bạn hiểu ý nghĩa hình học
của gradient. Nhưng đến khi hiển thị bằng máy tính thì tối chắc chắn các bạn sinh viên đã hiểu
tại sao phương pháp steepest ascent (nghĩa là dốc lên) mà tối không cần phải làm động tác nào
khác.
Maple không chỉ giúp bằng hình ảnh mà còn kích thích óc sáng tạo. Chúng ta đã dạy cho
học sinh làm thế nào để viết phương trình một đường thẳng qua hai điểm; vậy thì các em có thể
1
Tiếng Anh là formal computation tiếng Pháp là calcul formel.
2
và đã tìm thấy chỉ một chỗ sai trong 2000 trang của Delaunay!
3
Kiến thức không quan trọng bằng trí tưởng tượng. Kiến thức thì giới hạn nhưng trí tưởng tượng có thể vây
quanh nhân loại (Albert Einstein)
iv
Mục lục
7.2.2 Ngàm một đầu, lực tập trung ở x = u l [Hình 7.14 (b)] . . . . . . . . 138
7.2.3 Hai gối đơn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
7.3 Bài đọc thêm: Képler - Thái Dương hệ . . . . . . . . . . . . . . . . . . . . . . 142
Chương 10.Bài toán dao động 2: Con lắc toán học 183
10.1 Con lắc đơn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
10.1.1 Trường hợp 1: góc quay nhỏ . . . . . . . . . . . . . . . . . . . . . . . 184
10.1.2 Trường hợp 2: góc quay lớn không ma sát . . . . . . . . . . . . . . . . 185
10.1.3 Trương hợp 3: góc quay lớn với ma sát . . . . . . . . . . . . . . . . . 188
10.2 Con lắc kép . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
10.2.1 Trường hợp 1: góc quay nhỏ, tính toán hình thức . . . . . . . . . . . . 191
10.2.2 Trường hợp 2: góc quay lớn - Tính toán số . . . . . . . . . . . . . . . 193
10.2.3 Kiểm chứng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
10.3 Con lắc đơn đàn hồi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
10.3.1 Vẽ hình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
10.3.2 Tính toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
10.4 Bài đọc thêm: Lịch sử số π . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
1.1 (a) Ba lời giải và (b) khi vẽ chung với tập hợp các lời giải . . . . . . . . . . . . 15
1.2 Lời giải phương trình vi phân phương pháp giải tích . . . . . . . . . . . . . . . 16
1.3 Lời giải phương trình vi phân và phương pháp số . . . . . . . . . . . . . . . . 18
1.4 Sơ đồ tạo và sử dụng tập tin thực thi . . . . . . . . . . . . . . . . . . . . . . . 22
2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.4 (a) Hình nón nội tiếp (b) đương biểu diễn của thể tích theo h khi R = 3. . . . . 38
2.5 (a) hình nón ngoại tiếp (b) đường biểu diễn của thể tích theo h khi R = 3. . . . 39
2.6 Đồ thị của diện tích theo h khi R = 3: (a) trường hợp nội tiếp; (b) ngoại tiếp . . 41
2.7 Hình nón nội tiếp và ngoại tiếp hình tròn . . . . . . . . . . . . . . . . . . . . . 43
2.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.10 Hình hộp nội tiếp trong một ellipsoid . . . . . . . . . . . . . . . . . . . . . . . 47
2.11 Hình khối cực đại trong một ellipsoid . . . . . . . . . . . . . . . . . . . . . . 49
2.12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.2 Đường đồng mức của hàm f (x, y) . . . . . . . . . . . . . . . . . . . . . . . . 56
3.3 Cực trị hàm nhiều biến và hình chiếu của nó . . . . . . . . . . . . . . . . . . . 58
3.4 Các điểm dừng của f (x, y) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.5 Điểm cực đại và cực tiểu của f (x, y) . . . . . . . . . . . . . . . . . . . . . . . 60
3.6 Điểm yên ngựa của hàm f (x, y) . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.7 Đồ thị gradient, đường đồng mức và chuyển động của Pk . . . . . . . . . . . . 62
3.8 Chuyển động Pk trong không gian . . . . . . . . . . . . . . . . . . . . . . . . 63
3.9 Biểu diễn tham số của hàm ràng buộc g(x, y) trên f (x, y) . . . . . . . . . . . . 65
3.10 (a) Đường đồng mức và ellips 2D, (b) Véc-tơ gradient tại điểm cực trị . . . . . 67
4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
ix
Danh mục hình minh họa
4.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.7 (a), (b) Vị trí tương đối của H; (c) Quỹ tích H . . . . . . . . . . . . . . . . . . 79
4.8 Quỹ tích của H với các vị trí M . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.9 Vòng tròn trực giao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.2 Thương vụ với đồ thị 3-D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
5.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.4 Sai biệt giữa phép giải rời rạc và liên tục . . . . . . . . . . . . . . . . . . . . . 96
5.5 (a), (b) Phát triển ổn định sau 30 tháng và (c) phát triển không ổn định . . . . . 98
5.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.8 Đường biểu diễn của lượng muốn (a) trường hợp ⃝ 1 và (b) trường hợp ⃝ 2 . . . 104
5.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.10 Lây lan của bệnh dịch khi không có và khi có thuốc chữa . . . . . . . . . . . . 107
1 1
5.11 Lây lan của bệnh dịch với b = và b = . . . . . . . . . . . . . . . . . . . 109
10 2
5.12 Lây lan của bệnh dịch trường hợp c) và d) . . . . . . . . . . . . . . . . . . . . 110
5.13 Thuật toán "Sàng Eratosthene" và cách đo chu vi trái đất. . . . . . . . . . . . . 114
7.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
7.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
7.3 Chuyển vị, góc quay và moment trường hợp hai gối đơn . . . . . . . . . . . . 130
7.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.5 Chuyển vị, góc quay và moment trường hợp ngàm một đầu . . . . . . . . . . . 132
7.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
7.7 Chuyển vị, góc quay và moment trường hợp ngàm hai đầu . . . . . . . . . . . 134
7.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
7.9 Chuyển vị, góc quay và moment trường hợp ngàm một đầu, đầu kia gối đơn . . 136
7.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
7.11 Chuyển vị, moment ngàm một đầu và gối đơn ở: (a) x = 8 và (b) x = 7 (cách
giải thứ nhất) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
7.12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
7.13 Chuyển vị, moment trường hợp ngàm một đầu và gối đơn ở: (a) x = 8 và (b)
x = 7 (cách giải thứ hai) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
7.14 Các trường hợp tải trọng tập trung với ngàm . . . . . . . . . . . . . . . . . . . 139
7.15 Chuyển vị, góc quay và moment trường hợp ngàm một đầu, lưu tập trung khi:
(a) u = 4 và (b) u = 6 (các tỷ lệ được sửa đổi để dễ nhìn) . . . . . . . . . . . . 139
7.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
7.17 Lực tập trung, hai nối đơn qua hai cách giải . . . . . . . . . . . . . . . . . . . 141
7.18 Thái Dương Hệ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
8.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
8.2 Quỹ đạo trong trường hợp không ma sát với: (a) v0 = 300 và (b) v0 = 900m/s 147
1
8.3 Đạn đạo với hệ số ma sát bằng : (a) k = 1 (tối đa) và (b) k = . . . . . . . . 151
[ ] 10
Đạn đạo 5 góc bắn α P
π 7π
8.4 , với ma sát . . . . . . . . . . . . . . . . . . . 153
10 30
8.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
8.6 Nối dài tầm bắn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
π
8.7 (a), (b): Các hàm sức cản p(h) và (c) tầm bắn tương ứng với α = . . . . . . 157
4
π
8.8 Đạn đọa của 6 góc bắn với độ gia tăng . . . . . . . . . . . . . . . . . . . . 158
50
8.9 Các hàm nội suy ftd(d), fdt(d) và fad(t) . . . . . . . . . . . . . . . . . . . . . . 160
8.10 Các hàm nội suy ftd(t), fad(a) và fda(x) . . . . . . . . . . . . . . . . . . . . . 161
π
8.11 Đạn đạo của 6 góc bắn với độ gia tăng . . . . . . . . . . . . . . . . . . . . 162
60
8.12 Các hàm nội suy spline của fdt(t), fad(a), fda(x) . . . . . . . . . . . . . . . . . 163
8.13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
8.14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
8.15 Hình 8.14: Đại bác Schwerer Gustav (hình mẫu trưng bày) . . . . . . . . . . . 166
10.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
10.2 Con lắc đơn với góc quay nhỏ . . . . . . . . . . . . . . . . . . . . . . . . . . 185
10.3 Con lắc đơn với góc quay lớn . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
10.4 Con lắc đơn với góc quay lớn và lực ma sát . . . . . . . . . . . . . . . . . . . 189
10.5 Con lắc kép . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
10.6 Chuyển động cùng chiều với góc quay nhỏ . . . . . . . . . . . . . . . . . . . . 194
10.7 Chuyển động ngược chiều với góc quay nhỏ . . . . . . . . . . . . . . . . . . . 195
10.8 Chuyển động với u1 (0) = u2 (0) = 1 radian . . . . . . . . . . . . . . . . . . . 196
π
10.9 Chuyển động với u1 (0) = , u2 (0) = 1radian . . . . . . . . . . . . . . . . . 197
2
10.10Đồ thị của động năng, thế năng và cơ năng của con lắc kép . . . . . . . . . . . 197
10.11Con lắc đơn đàn hồi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
10.12Khai báo con lắc đàn hồi và vài chuyển động . . . . . . . . . . . . . . . . . . 200
10.13(a) Quỹ đạo con lắc và (b) đồ thị năng lượng . . . . . . . . . . . . . . . . . . . 201
10.14Con lắc kép đàn hồi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
10.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
10.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
10.17Tukey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
12.1 Hình tĩnh của hàm sin(x) và 4 chuyển động khác nhau . . . . . . . . . . . . . 232
12.2 (a) Chong chóng ở vị trí đầu, (b) sau khi quay 30o và (c) 4 chuyển động 5o . . . 233
12.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
12.4 (a) Chuyển động tịnh tiến của bánh xe và (b) chuyển động quay của van . . . . 235
12.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
12.6 Chuyển động của van xe trong 3 vòng quay . . . . . . . . . . . . . . . . . . . 237
12.7 4 chuyển động với khoảng cách thời gian (a) đều và (b) không đều . . . . . . . 238
12.8 (a) Cả hai xe ngừng cùng lúc và (b) lần lượt ngừng . . . . . . . . . . . . . . . 240
12.9 (a) Chuyển động với thay đổi đều và (b) thay đổi không đều . . . . . . . . . . 241
12.10Chuyển động theo định luật Képler . . . . . . . . . . . . . . . . . . . . . . . . 243
12.11Chuyển động của mặt trăng quanh trái đất theo định luật Képler . . . . . . . . 244
12.12Tiếp tuyến của hàm f (x) = ex sin( ) . . . . . . . . . . . . . . . . . .
2 x
. . . 246
2
°k 1
12.13Sự hội tụ của n=1 [ cos(x)n cos(nx)] . . . . . . . . . . . . . . . . . . . . . 247
n
12.14Chuyển động thẳng của viên bi . . . . . . . . . . . . . . . . . . . . . . . . . . 249
sin x x
12.15Đồ thị của hàm (a), , (b)f (x) và (c)f ( ) nhân lên 30 lần . . . . . . . . . 250
x 3
12.16Chuyển động của viên bi (a) trước và (b) sau khi chỉnh vận tốc . . . . . . . . . 251
12.17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
12.18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
12.19Biểu diễn của vận tốc và gia tốc ở hình (a) cardiod và (b) hình ốc sên . . . . . . 256
12.20Babylone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
12.21Pythagore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
12.22Thales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
12.23Hippocrates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
12.24Euclide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
12.25Aristote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
12.26Archimede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
12.27Eratosthene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
12.28Apollonius . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
12.29Ptoleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
12.30Liu Hui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
12.31Diophante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
12.32Hệ Thập Phân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
12.33Abu-bin-Musa-al-Khwarizmi . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
12.34Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
12.35Qin Jinshao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
12.36Nicolas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
12.37Copernic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
12.38Viète . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
12.39Kepler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
12.40Neper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
12.41Cavalieri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
12.42Descartes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
12.43Desargues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
12.44Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
12.45Fermat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
12.46Huygens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
12.47Leibniz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
12.48Seki Kowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
12.49Isaac Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
12.50Jacques Bernoulli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
12.51Rolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
12.52Jean Bernoulli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
12.53De Moivre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
12.54Jacapo Riccati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
12.55Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
12.56Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
12.57D'Alembert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
12.58Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
12.59Monge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
12.60Legendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
12.61Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
12.62Fourier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
12.63Poisson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
12.64Laplace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
12.65Bolzano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
12.66Navier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
12.67Green . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
12.68Galois . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
12.69Lobachevsky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
12.70Cauchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
12.71Dirichlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
12.72Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
12.73Cayley . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
12.74Boole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
12.75Chebyshev . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
12.76Sylvester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
12.77Venn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
12.78Poincaré . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
12.79Frobenius . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
12.80Lyapunov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
12.81RungeKutta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
12.82Carmichael . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
12.83Borel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
12.84Richardson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
12.85Turing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
12.86George Dantzig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
12.87Shannon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
12.88Schwartz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
12.89Hall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
12.90Edward Lorenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
12.91Tukey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
12.92Mandelbrot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
12.93Adleman, Rivest, and Shamir . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
12.94Wiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
2.1 Kết quả theo V và theo S của hình nón nội tiếp hình cầu . . . . . . . . . . . . . 42
5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
5.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
9.1 Các lệnh tạo hình động cho hệ ba lò xo có một đầu tự do . . . . . . . . . . . . 180
10.1 Các lệnh để tạo hình tĩnh chuyển động con lắc đơn. . . . . . . . . . . . . . . . 186
10.2 Các lệnh để tạo hình tĩnh chuyển động con lắc đơn với ma sát. . . . . . . . . . 188
10.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
xv
Chương1
Cú pháp Maple
Chương này tóm tắt một số lệnh Maple cơ bản[1 ] và được dùng nhiều trong cuốn sách này.
Để có thêm chi tiết cách hay nhất vẫn là tham khảo phần trợ giúp.
Lệnh đầu tiên là restart (không bắt buộc), để xoá sạch bộ nhớ và chuẩn bị cho những
điều kiện làm việc tốt nhất cho Maple.
> restart:
Maple phân biệt chữ thường và chữ hoa: thí dụ simplify khác với Simplify. Trong
Maple đại đa số các câu lệnh đều là chữ thường những có một số rất ít có cả chữ thường
lẫn chữ hoa (và dĩ nhiên chức năng cũng khác). Thí dụ expand và Exphand, thậm chí
có những option toàn viết bằng chữ in.
Trong Maple, để gán giá trị vào một biến phải dùng dấu := Nếu ta đánh dấu =, Maple sẽ
không thông báo sai. Thí dụ:
> x:=Pi;
x := π
> y=sin(x);
1
Phiên bản Maple được dùng trong sách là phiên bản 8
Chương 1. Cú pháp Maple
y=0
Maple hiển thị y = 0 vì nó lập lại những gì ta đánh nhưng trong biến y vẫn còn trống
(người ta gọi biến y là biến tự do, trong khi x đã được gán cho giá trị π, x được gọi là biến
ràng buộc). Kiểm chứng:
> x,y;
π, y
Để giải phóng một biến ràng buộc, (ta lấy thí dụ ở trên, x đang ràng buộc vì nó bằng π):
> x:='x';
> x;
x
Một lệnh của Maple được chấm dứt bằng dấu (;) hoặc dấu hai chấm (:). Nếu chấm phẩy,
kết quả sẽ hiện ra ; nếu là hai chấm, lệnh sẽ được thực hiện nhưng kết quả không hiện ra
(xem thí dụ trên).
Dấu %: Đây là một ký hiệu quan trọng trong Maple. Dấu % biểu tượng cho kết quả vừa
thực hiện. Thí dụ khi ta lấy nguyên hàm của 3sin(x):
> int(3*sin(x),x);
3 cos(x)
Ở đây, % biểu tượng cho 3 cos(x). Nếu lấy đạo hàm của nó ta sẽ tìm lại được 3 sin(x).
Trong trường hợp này ta sẽ dùng dấu %:
> diff(%,x);
3 sin(x)
Mapple cho phép đánh nhiều lệnh trên một dòng. Lấy lại thí dụ trên:
> int(3*sin(x),x): diff(%,x)
3 sin(x)
»
Dòng trên gồm 2 lệnh. Lệnh nguyên hàm 3 sin(x)d(x) chấm dứt bằng dấu hai chấm, kết
quả (-3cos(x)) không được hiển thị nhưng nó đã gán vào biến %. Lệnh đạo hàm chấm
dứt bằng dấu chấm phẩy, kết quả được hiện ra.
Maple cho phép kết hợp nhiều lệnh vào một lệnh:
> diff(int(3*sin(x),x),x);
3 sin(x)
Lệnh Int (với chữ I được viết hoa) sẽ cho ra kết quả là ký hiệu nguyên hàm 3 sin(x)d(x),
nhưng vì lệnh này chấm dứt bằng dấu hai chấm nên ký hiệu này ẩn và được gán vào biến
%.
Lệnh tiếp theo bắt đầu bằng dấu %= có nghĩa là 3 sin(x)d(x) =, tiếp theo value(%)
có tác dụng tính giá trị của biến %. Và vì lệnh này chấm dứt bằng dấu chấm phẩy nên kết
quả của nó sẽ được in ra:
»
3 sin(x)d(x) = 3 cos(x)
Ở đây % biểu tượng cho kết quả của cả dòng trên. Để có được phần bên trái dấu bằng, ta
dùng hàm lhs và bên phải bằng rhs[2 ]:
> lhs(%); rhs(%%);[3 ]
»
3 sin(x)d(x), 3 cos(x)
Một vài quy tắc cần nhớ khi khai báo các hàm toán học: sin(x)2 chứ không phải sin2 (x), tan(x)
chứ không phải tg(x). Hàm mũ của x là exp(x) chứ không phải là ex . Ký hiệu π là Pi,
số phức là I...
Dòng thuyết minh: Để đánh dòng thuyết minh (có thể dùng font tiếng Việt), nhấp chuột
vào nơi muốn đánh thuyết minh sau đó nhấp vào nút T nằm dưới hàng menu. Dấu > sẽ
biến mất và tất cả những gì bạn đánh sẽ mang màu đen và đều là nhữngdòng chữ không
được biên dịch bởi Maple. Sau khi hoàn tất, dùng chuột hoặc mũi tên (trên bàn phím)
để ra khỏi dòng thuyết minh, nhấp vào nút > để trở lại với các lệnh Maple.
Lưu vào ổ cứng: Tất cả các câu lệnh Maple và kết quả được gọi là một worksheet và được
lưu lại dưới 2 dạng: dạng cũ (MWS) và dạng mới (MW, kể từ phiên bản 9). Trong phạm
vi cuốn sách này, chúng ta chỉ làm việc với dạng MWS.
Maple có trên 1500 lệnh (phiên bản 8), trong đó có những lệnh ít được dung. Để tránh
phải nhập tất cả các lệnh vào RAM của máy một cách vô ích, người ta gom những lệnh
có cùng một ứng dụng voà những package (tạm dịch là gói). Những gói thường gặp là
plots,linalg,geometry,plottools... Khi cần sử dụng, dùng hàm with để
nhập:
> with(plots):
Ta cũng có thể dùng lệnh mà không cần nhập package bằng cách đánh
(thí dụ lệnh display trong gói plots):
> plots[display](...);
1 1 1 1
a(a b)(a c) b(b a)(b c) c(c a)(c b)
+ + =
cab
> 2*cos(x)ˆ3+sin(x)*sin(2*x):=simplify(%);
2(cos(x))3 + sin(x) sin(2x) = cos(2x)
> (x-2)ˆ3/(xˆ2-4*x+4):%=simplify(%);
(x 2)3
=x2
x2 4x + 4
Tuy nhiên có những trường hợp không "suôn sẻ" như ta nghĩ:
?
> sqrt(xˆ2):%=simplify(%);
x2 = csgn(x)x
csgn(x) là hàm cho ra 1 nếu Re(x) ¥ 0[4 ],và cho -1 nếu Re(x) 0.
Tại sao? Trước khi trả lời, chúng ta đừng bao giờ quên rằng đây là môi trường tính toán
hình thức, điều đó có nghĩa là Maple phải làm việc trên các ký tự chứ không phải những con số.
Khi ta viết ký tự x, trong đầu mình đã nghĩ ngay đến một con số (thậm chí là số dương). Nhưng
Maple không nghĩ như thế, nó sẽ hiểu đây là một biến bất kỳ, có thể là một số phức, một ma
trận, hay một đồ thị...Và trong tất cả những "giả thuyết" này, số phức là hợp lý hơn cả và câu trả
lời của Maple (csgn(x)x) là hoàn toàn chính xác. Để kiểm chứng, ta có thể "bảo" cho Maple
rằng x là một số thực bằng cách dùng hàm assume:
> assume(x,real):
?
> sqrt(xˆ2):%=simplify(%);
x 2 = |x |
Dấu đ̃ược thêm khi một biến được assume. Tuy nhiên kể từ bây giờ để dễ đọc chúng ta sẽ
bỏ qua và không hiển thị ký tự này. Và khi x ¡ 0:
> assume(x,real):
?
> sqrt(xˆ2):%=simplify(%);
x2 = x
Nói tóm lại, trước khi áp dụng một quy tắc đơn giản, Maple phải xét đến bản chất của biến.
Nhưng trước khi đi vào các thí dụ, chúng ta sẽ giải phóng x trở lại tình trạng ban đầu đồng thời
để tránh lặp đi lặp lại chữ simplify, ta sẽ viết tắt thành Sp qua lệnh alias:
> s:='x': alias(Sp=Simplify): p:=(x-2)ˆ3/ sqrt(xˆ2-4*x+4)
> p:%=Sp(%)
? (x2 2) = (x 2)2csgn(x 2)
3
x 4x + 4
Maple đã đơn giản tử và mẫu cho (x 2) nhưng vẫn đặt dấu hỏi về dấu của x 2. Và khi
x ¡ 2 mọi chuyện sẽ tốt đẹp.
> assume (x>2): p:%=Sp(%);
? (x2 2) = (x 2)2
3
x 4x + 4
Tương tự với hàm ln:
> x:='x':p:=ln(xˆ3) - 2*ln(x): p=Sp(p);
ln(x3 ) 2 ln(x) = ln(x3 ) 2 ln(x)
> assume (x>0): 'ln(xˆ3)-2*ln(x)'=Sp(p);[5 ]
4
Trong Maple, phần thực của x ký hiệu là Re(x), phần phức là Im(x)
5
Dấu nháy đơn để tránh Maple tự động đơn giản khi x>0
x 4x + 4
> ln(xˆ3)-2*ln(x):%=Sp(%,Symbolic);
ln(x3 ) 2 ln(x) = ln(x)
Khai triển đa thức (phá dấu ngoặc, hiểu theo nghĩa rộng)
Biểu diễn các hàm lượng giác theo nx thành hàm theo x
> sqrt((4+sqrt(3))*(4-sqrt(3))):%=expand(%);
b
? ? ?
(4 + 3(4 3)) = 13
> cos(3*x):%=expand(%);
cos 3x = cos(x)3 3 cos(x)
> (a+b)/(a-b):%=expand(%);
a+b a b
ab ab ab
= +
Trong trường hợp phân số hữu tỷ, expand không khai triển mẫu số, phải dùng hàm nor-
mal, expanded:
> (x+1)/((x+3)*(x+2)):%=expand(%);
x+1 x 1
= +
(x + 3)(x + 2) (x + 3)(x + 2) (x + 3)(x + 2)
> expand(normal(lhs(%),expanded));
x 1
+
x2 + 5x + 6 x2 + 5x + 6
Trái với simplify, expand không có symbolic:
> ln(a*b):%=expand(%,symbolic);
ln(ab) = ln(ab)
> assume(a>0, b>0): ln(a*b):%=expand(%);
ln(ab) = ln(a) + ln(b)
x 1)(x + 1)(x2 2) = x4 32 + 2
Qua kết quả trên, ta thấy đa thức x2 2 đã không được khai triển trong Q . Người ta nói đa
thức này tối giản trong Q :
> irreduc(xˆ2-2);
true
Hãy quan sát các lệnh sau:
> factor(xˆ2-4);
(x 2)(x + 2)
> factor(xˆ2-2);
x2 2
?
> factor(xˆ2-2,sqrt(2));
?
(x 2)(x + 2)
?
> factor(xˆ2+2,sqrt(2),I);
?
(x I 2)(x + I 2)
Qua 4 lệnh này ta có thể kết luận là hàm factor chỉ thừa số hoá một đa thức trong trường
hợp các số hữu tỷ. Khi nghiệm không thuộc Q , phải khai báo phần tử này. Và khi có trên một
phần tử khai bapf, phải để tất cả trong ngoặc nhọn(tu).
Trong trường hợp các đa thức bậc cao (¡ 2) thường phải dùng lệnh solve (giải phương
trình) để tìm nghiệm trước khi thừa số hoá:
> solve(xˆ3+9);
? ?
32/3, 1/232/3 3/2I 6
3, 1/232/3 + 3/2I 6 3
?
Có tất cả ba nghiệm, trong đó có hai nghiệm phức và đều là vô tỷ (32/3 , 6
3). Chúng ta thử
với lệnh sau:
> factor(xˆ3+9,3ˆ(1/6),I);
? ?
(2x 32/3 3I 6 3)(2x 32/3 + 3I 6 3)(x + 32/3 )
1
4 ?
Qua kết quả này chúng ta thấy Maple rất "thông minh". Chỉ có 6 3 được khai báo nhưng
?6 Maple cũng tìm ra được?632/3. Một chi tiết quan trọng cần lưu ý là
trong quá trình thừa số hoá,
nghiệm của đa thức là 3/2 3 nhưng ta chỉ khai báo 3 và phải bỏ qua thừa số 3/2:
> factor(xˆ3+9,3/2*3ˆ(1/6),I);
Error, (in factor) 2nd argument, 3/2*3ˆ(1/6), I, is not a valid algebraric extension
f dx + gdx = (f + g)dx
Lưu ý là khi dùng với symbolic, cần thiết phải xác định hàm toán học nào cần phải gom.
Giống như trường hợp factor, nếu đa thức có nghiệm vô tỷ hoặc phức, cần phải khai báo
1 ?
các nghiệm này. Giả sử muốn phân tích đa thức p = x2 + 8, phải thừa số hoá với I 2 trước
p
khi phân tích:
> p:=xˆ2+8:
> factor(1/p,I,sqrt(2)):%=convert(%,parfrac,x);
? 1 ? = I
? I
?
(x 2I 2)(x + 2I 2) 8(x + 2I 2) 8(x 2I 2)
convert cũng được dùng để tính tổng hoặc tích các phần tử trong một dãy:
> convert([1,2,3],`+`);
6
6
Ngược với Simplify
7
Giống factor, ngược với expand
8
Ngược với expand
X := 8, 14, 11, 0, 14, 14, 6, 9, 4, 2, 2, 10, 0, 13, 15, 14, 8, , 5, 5, 6
Y := [13, 15, 12, 13, 2, 9, 9, 7, 6, 7, 6, 10, 5, 11, 9, 14, 9]
[15, 6]
[13, 7]
Ghép hai kết quả này vào một dãy s. Lệnh op dùng để bỏ ngoặc vuông:
> s:=op(%),op(%%);
s := 13, 7, 15, 6
> select(i¡is(i>0),q);
[6, π 2 ]
Lệnh map: Đây là một lệnh quan trọng. Lệnh này áp dụng một hàm (có thể hàm Maple
hoặc hàm mũi tên) cho tất cả các phần tử trong một dãy.
> map(i¡iˆ2,[s]);
> map(i¡i-3*I,[s]);
> u:=[seq(sin(i*x),i=1..3)];
> map(diff,u,x);
option has:
> p:=x=sin(t),y=cos(t)ˆ2,z=1+cos(u);
[x = sin(t), z = 1 + cos(u)]
x Ñ8
> Diff(p,x):%=diff(%);
d x 2
= 2xex
2
e
dx
Trong lệnh trên hàm diff(p,x) dùng để lấy đạo hàm mệnh đề p theo x. Hàm Diff (với
chữ D hoa), được gọi là dạng tĩnh (inert form) của hàm diff(p,x). Nó chỉ có tác dụng
d
viết ký hiệu p.
dx
d2
Lệnh dưới đây tính 2 p (dấu nháy được dùng để hiển thị chứ p thay vì ex )
2
dx
> 'Diff('p;,x,x)':%=value(%);
d2
p = 2xex + 4x2 ex
2 2
dx2
Tính đạo hàm bậc n: diff(p,x$n) (dưới đây ta kết hợp với toán tử mũi tên):
> dp:=n¡diff(p,x$n):
> factor(dp(5));
8xex (15 20x2 + 4x4)
2
Tính nguyên hàm: Int (với chữ I hoa), là dạng tĩnh của hàm int(p,x):
> Int(p,x):%=value(%);
1?
»
ex dx =
2
πerf (x)
2
Trong trường hợp hàm mũi tên, đạo hàm bậc nhất và bậc 2:
> f:=x¡sin(xˆ2): D(f);
x ÞÑ 2 cos(x2 )x
> f2:=(D@@2)(f);
f 2 := x ÞÑ 2 cos(x2 ) 4sin(x2 )x2
> f2(sqrt(Pi/2));
2π
Trong trường hợp nguyên hàm của một mũi tên, phải biến đổi sang dạng mệnh đề (f (x)
là mệnh đề tương ứng với hàm mũi tên f ):
> Int(f(x),x):%=value(%);
»
sin(nx)dx =
cos(nx)
n
Toạ độ Descarter
Gọi p, q là những mệnh đề, f, g là những hàm mũi tên (theo x)
> plot(p,x=-3..3): plot([p,q],x=-3..3,-2..6):
> plot(f,-4..4,1..3)
> plot([f,g],-1..3,thickness=[2,5],color=[blue,green]):
9
Tất cả các đồ thị trong mục này không được in ra.
Tọa độ cực
> plot(1,u=0..2*Pi,coords=polar);
> with(plots):
> polarplot(1,u=0..2*Pi); polarplot(u,u=0..4*Pi);
> polarplot([theta,4*sin(3*theta)],
theta=0..2*Pi,color=[red,blue]);
Hàm ẩn
> p:=xˆ3+yˆ3-5*x*y+3;
p := x3 + y 3 5xy + 3
> implicitplot(p,x=-3..3,y=-3..3,grid=[100,100]);
> p1:=xˆ2+yˆ2=9: p2:=xˆ2/25+y2/9=1:
> implicitplot(p1.p2,x=-5..5,y=-3..3,scaling=constrained);
Hàm tham số
> plot([sint(t),cos(t),t=0..2*Pi]);
> plot([[sint(t),cos(t),t=0..2*Pi],[sin(2*t),cos(3*t),t=0..2*Pi]],
color=[red,blue]);
Hình động
> plot([sin(x),sin(x-1)],x=0..4*Pi);
> plot([seq(sin(x-i),i=1..10)],x=0..5*Pi);
> f:=i¡sin(x-i):
> seq(plot(f(i),x=0..5*Pi),i=1..10):
> display(%,insequence=true);
> display(seq(plot(f(i/5),x=0..5*Pi)i=1..50),insequence=true);
? ? ? ?
s := x = 1 + 5, y = 1 + 5, y = 1 5, x = 1 5
Để trích ra giá trị của x, y có thể dùng subs hay eval:
> eval(x,s[1]),subs(s[2],y);
? ?
1+ 5, 1 5
y(x) = ky(x)
d
dx
> dsolve({p,y(0)=1}); (với điều kiện đầu, dấu ngoặc nhọn bắt buộc)
y(x) = ekx
Chúng ta cũng có thể giải không điều kiện đầu. Và để tránh lặp đi lặp lại các ký hiệu đạo
hàm, chúng ta sẽ phải khai báo các ký hiệu này như sau:
> y0=y(x): y1=diff(y(x),x): y2:=diff(y(1),x): CB:='color=blue':
> eq:=y1-y0ˆ2+3*y0; dsolve(eq); (lệnh dsolve ngoặc nhọn không bắt buộc)
Hình 1.1: (a) Ba lời giải và (b) khi vẽ chung với tập hợp các lời giải
Điều kiện đầu: ký hiệu đạo hàm bắt buộc là toán tử D thay vì diff:
> dsolve({eq,y(0)=0,D(y)(0)=1});
y(x) = e3x + e2x
Hình 1.2: Lời giải phương trình vi phân phương pháp giải tích
Cách giải số
Sử dụng khi cách giải giải tích không cho ra kết quả hoặc kết quả không khai thác được.
y(x) x2 y(x) = 1
d
dx
> dsolve({eq,y(1)=2}): (Không hiển thị vì quá phức tạp)
> s:=dsolve({eq,y(1)=2},y(x),numeric);
s := proc(x rkf 45) . . . end proc
Mặc định Maple dùng phương pháp Runge-Kutta 4 nút để giải phương trình vi phân [12 ].
Kết quả cách giải số là một dãy nhiều phần tử. Để hiển thị một phần tử (thí dụ ở hoành
độ x=1.54)
> s(1.54);
[x = 1.54, y(x) = 5.76389774048564440]
Để hiểu rõ ý nghĩa của lời giải số s, trước tiên ta tạo từ s một dãy u gồm 5 cặp điểm, mỗi
điểm cách nhau một khoảng cách bằng 1 và nối những điểm ấy lại với nhau (đồ thị g1),
sau đó dùng hàm odeplot để vẽ lời giải của bài toán (đồ thị g2):
> f:=t¡[subs(s(t),x), eval(y(x),s(t))];
> u:=seq(f(i),i=-3..1.2);
u := [3., 0.1217], [2., 0.3483], [1., 0.4176], [0., 0.5090], [1., 2.]
> g1:=plot([[u],[u]], style=[point,line], symbol=diamond):
> g2:=odeplot(s,[x,y(x)],-3..1.1): display(g1,g2);
Hình 1.3(a) cho thấy hai đồ thị không trùng nhau, đơn giản laf vị độ chia quá lớn. Lệnh
sau chia mịn hơn 3 lần, ta sẽ thấy kết quả tốt hơn:
> seq(f(i/3),i=-9..4.5):
x(t) = 0.2146]
d
[t = 0.13, x(t) = 0.9859,
dt
Đồ thị của biên dộ x theo thời gian t là:
> odeplot(s,[t,x(t)],0..15,numpoints=200); (Hình 1.3(b))
Tương tự, đồ thị của vận tốc x1 theo thời gian t là:
> odeplot(s,[t,diff(x(t),t)],0..15,numpoints=200);
12
Xem chương trình Phương pháp tính, Giải tích số
Lưu ý: P tại (1.1) khác với P tại (1.2) vì hai ma trận đường chéo tương ứng không giống
nhau. Tại (1.1), ma trận đường chéo là diag(5,3,-6), tại (1.1) là (-6,5,3).
Khai báo ma trận bằng hàm mũi tên và kích thước động.
$
& 0 (i = j)
Cho ma trận M bậc n mà các phần tử là: mij = 1 (i j)
%
1 (j i)
> B:=matrix(4,4),(i,j)¡if i=j then 0 elif i>j then -1 else 1
fi);
Khai báo như trên, kích thước của ma trận luôn là 4. Cách hay nhất là tạo một hàm mũi
tên với tham số là n
> C:=n¡matrix(n,n,(i,j)¡if i=j then 0 elif i>j then -1 else
1 fi);
Lệnh đầu tiên là tên chương trình :=proc (tham số). Lệnh sau cùng là end:. Để xuống
hàng nhấn Shift+Enter
Không được sửa biến đầu vào. Giả sử tham số đầu vào là u và a là một biến bất kỳ, ta có
thể viết u:=a. Trong trường hợp này Maple sẽ xuất ra một thông báo sai:
Error, (in pgm) illegal use of a formal parameter (1.10.1)
Kết quả của lênh sau cùng trước end: (khác với lênh print) có thể in ra và có thể được
gán vào một biến.
Chỉ có hai lệnh cần nhớ là lệnh {if ... fi} và {for ... do ... od} hay {for
... while do ... od}. fi viết tắt của end if, od viết tắt của end do
Chương trình sau có tên rsort có công dụng sắp xếp một dãy số thực[13 ]
> p:=ln(3),-Pi,exp(-sqrt(2)),sin(Pi/9),-1;
?
ln(3), π, e 2 , sin( ), 1
π
9
> q:=rsort([p]);
10
?
q := [π, 1, e 2 , sin( π ), ln(3)]
9
Ở dòng 3 nếu bỏ lệnh u:=u1: và làm việc trực tiếp trên u1, sẽ nhận được thông báo 1.3.
Lý do là vì đã sửa biến đầu vào u1
Ở dòng 10, lệnh print(k) xuất ra kết quả 10 [14 ] và lệnh u: xuất ra dãy đã được sắp xếp.
Nhưng chỉ có dãy u mới có thể được gán và biến q.
Kiểm chứng: q[5] = ln(3).
13
Trong Maple có lệnh sort, nhưng lệnh này chỉ có tác dụng trên các dãy có phần tử hửu tỷ. Các số dòng được
thm vào để dễ cắt nghĩa.
14
k = 10 tương ứng với số lần lặp = 5 4/2
pgm.m là tên của tập tin thực thi của thuật toán ms
.
.> ms:=proc(n) .> restart:
.> read "C : /DIR/pgm.m" :
.end:
.> save ms, "C : /DIR/pgm.m" : .> ms(n);
.work.mws .test.mws
Các phần tử p đều là những phân số nên cách viết này khá "tốn chỗ". Dưới đây chúng ta
sẽ thực hiện một chương trình có tên msimply để đặt mẫu số chung. msimply được viết trong
worksheetmsimply.mws và tập tin thực thi tương ứng là pgm1.m:
> msimply:=proc(m)
local p:
linalg[coldim](m):linalg[rowdim](m);
p:=ilcm(seq(seq(denom(m[i,j]),j=1..%%),i=1..%));
evalm(m*p)/p;
end:
> seve msimply,"D:/My path/pgm1.m":
msimply.mws
Bảng 1.2: Sử dụng worksheet với tập tin thực thi là pgm1.m
(Lệnh ilcm tính bội số chung nhỏ nhất của một dãy số, denom(x) là mẫu số của phân số x)
> mjor:=proc(m,n)
linalg[jordan](m,'p'):
map(i¡iˆn,%):
simplify(evalm(p&*%&*linalg[inverse](p))):
end:
> seve mjor,"D:/My path/pgm2.m":
mjor.mws
Bảng 1.3: Sử dụng worksheet với tập tin thực thi là pgm2.m
> m:=matrix(2,2,[2,1,-1/3,3/2]);
> read "D:/My path/pgm2.m": read "D:/My path/pgm1.m":
> eval(m)ˆ3:%=msimply(mjor(m,3));
[ ]
1 2 3 1 [ 444 642]
72 214 123
p := 1 3 =
3 2
Lưu ý: Thí dụ trên chỉ có mục đích nêu cách tạo và sử dụng tập tin thực thi. Ở đây chúng
ta có thể tính m10 dễ dàng, nhưng với một ma trận vuông bậc 3 có phân số, dùng các thuật toán
trên là không khả thi vì kết quả quá phức tạp.
x2 sin(x)dx = π 2 4
0
Ngược lại, có những dạng không thể lấy được nguyên hàm dưới dạng giải tích hoặc kết quả
là những hàm siêu việt (transcendant). Trong trường hợp đó bắt buộc phải lấy giá trị gần đúng:
> Int(sin(x)/x,x):%=value(%);
»
sin(x)
dx = Si(x)
x
> Int(sin(x)/x,x=0..1):%=evalf(%,5);
»1
sin(x)
dx = 0.94608
x
0
> Int(1/ln(xˆ2-1),x):%=value(%);
Trong kết quả 1.4, dấu nguyên hàm ( ) của vế bên trái màu đen, đây là ký hiệu của lệnh tĩnh
Int, còn dấu nguyên hàm vế trái màu xanh [15 ]. Điều đó có nghĩa Maple không tính được và
cũng không thể biểu diễn kết quả dưới dạng các hàm Si, Ei, Elliptic, hypergeom...
Tuy nhiên, có nhiều trường hợp Maple "bó tay" như 1.4, nhưng với vài biến đổi, người ta
vẫn có thể tìm ra lời giải giải tích. Hai cách biến đổi thông thường mà mọi người đều biết là
nguyên hàm từng phần và biến đổi. Dưới đây là một vài thí dụ đơn giản (mà Maple giải dễ
dàng):
» »
Nguyên hàm từng phần ( (u1 v) = uv (uv 1 )). Để sử dụng hai phép biến đổi, trước
tiên phải nhập thư viện student sau đó khai báo nguyên hàm dạng tĩnh (không hiển thị):
> with(student):
> p:=Int(x*ln(x),x):
Chọn u = ln(x) :
> intparts(p,ln(x));
»
x ln(x)
1 2 x
dx
2 2
Giá trị của biểu thức trên đơn giản, có thể dùng value
> p:=value(%);
»
x ln(x)dx = x2 ln(x) x2 dx
1 1
2 4
Ta cũng có thể chọn u = x
> intparts(p,x):expand(%);
» »
Biểu thức trên chính là p, vậy ta có thể "đơn giản" bằng hàm solve để tìm p:
> solve(p=%,p);
»
x ln(x) x2 +
1 2 1 1
xdx
2 2 2
Đến đây thì ta có thể dùng value để hiển thị kết quả:
> p:%=value(%);
»
x ln(x)dx = x2 ln(x) x2 dx
1 1
2 4
Để phương pháp này (cũng như phương pháp đổi biến) thực sự có ý nghĩa, ta chỉ có thể
áp dụng lệnh value khi biểu thức đó đơn giản và có thể nhìn ngay ra kết quả bằng các
công thức quen thuộc.
15
Kể từ phiên bản V9, tất cả đều mang màu xanh
1 sin(u)2 cos(u)du
1a
2
> simplify(%,symbolic);
»
1
cos(u)2 du
2
1
Đến đây ta có thể dùng value(%) vì cos(x)2 = (cos(2x) + 1):
2
> value(%);
1 1
sin(u) cos(u) + u
4 4
Trở lại biến x:
> simplify(subs(u=arcsin(xˆ2,%),symbolic);
1?
1 x4 x2 + arcsin(x2 )
1
4 4
Kiểm chứng bằng đạo hàm:
> simplify(diff(%,x));
?
x 1 x4 [16 ]
Trên đây chỉ là những thí dụ đơn giản, trong thực tế đôi khi phải lặp lại nhiều lần các lệnh
intparts hay changevar, thậm chí phải làm cả hai lệnh.
x lnn xdx
> q:=intparts(p,ln(x)ˆn);
»
1 ln(x)n nx
q := ln(x) x
1 n 2 dx
2 2 ln(x)
»
Nếu đặt F (n) = x ln(x)n dx, ta thấy biểu thức có dấu nguyên hàm chính là F (n 1).
Để hiển thị công thức quy nạp ta cần khai báo hàm F (n), F (n 1) bằng alias và dùng
hàm map (trong Maple F [n] có nghĩa là Fn ):
> alias(F[n]=Int(x*ln(x)ˆn,x),F[n-1]=Int(x*ln(x)ˆ(n-1),x)):
> F[n]=map(simplify,q);
Fn := ln(x)n x2 nFn1
1 1
2 2
16
Chúng ta sẽ giải bài toán này bằng một phương pháp khác (xem mục 1.12.4)
Để áp dụng công thức quy nạp ta viết một chương trình đệ quy (recursive)[17 ]. Chương
trình có tên là F được định nghĩa như sau:
$
x ln(x) x2
» '
&
1 2 1
(n = 1)
F (n) = n
x ln (x)dx = 2 4
ln(x)n x2 nFn1 (n ¡ 1)
' 1 1
%
2 2
∼∼∼∼∼∼∼∼∼∼∼
F:=proc(n)
if n=1 then 1/2*xˆ2*ln(x)-1/4*xˆ2
else 1/2*ln(x)ˆn*xˆ2-1/2*n*F(n-1):fi:
end:
Đại số
[ ]
2t 1
1. Cho M =
2 t . Xác định t sao cho M nhận giá trị riêng kép.
? ?
Tính véc-tơ riêng trong trường hợp này. (ĐS: t = , [1, I 2]).
2I 2
3
x 0 ?0
2. Cho M = 0 ?y 3. Tìm x, y, z sao cho m nhận ba giá trị riêng 4, 8, 12.
0 3 z
Hướng dẫn: Dùng tính chất det(M ) = det(J) với J là ma trận đường chéo.
(ĐS: tx = 4, y = 11, z = 9u, tx = 4, y = 9, z = 11u).
5 1 1
3. Cho M = 1 5 1.
1 1 5
17
Đệ quy là chương trình gọi chính nó.
Nguyên hàm
I. Tìm nguyên hàm và kiểm chứng bằng đạo hàm (bài có dấu : khó hơn)
?
1. p =
ln(x)3 4. p = x 1 + x4
x3
5. p =
arcsin(x)
2
2. p = x arccos(x) x2
3. p = ex sin(x) 6. p = x(x2 + 1) ln(x2 1)
a
1
II. Phân số hữu tỷ: Tìm nguyên hàm và kiểm chứng bằng đọa hàm của
c
ax2 + bx + c
b2
(c ) tan(u)) [18 ]
b 1
(Hướng dẫn: Đổi biến bằng công thức: x + =
2a a 4a
1 1
(x 6x + 18)2
1. p = 2 3. p = 2
3x + 6x + 5
2. p =
1
4x + 10)2 4. p = ? 3x
[19 ]
(2x2 8 2x x2
III. Tìm công thức quy nạp và viết hàm đệ quy tương ứng.
1. p := xn ex 2. p := xn sin(x)
Lập trình
#
ui
(ui chẵn )
Dãy Syracuse là một dãy được định nghĩa như sau: ui+1 = 2
3ui + 1 (ui lẻ )
18
Xem hàm completesquare
19
Đặt (x + 1) = 3 sin(u).
Với u0 là một số nguyên dương cho sẵn, người ta thấy (nhưng chưa chứng minh được) rằng
t uu Ñ 1
1. Viết một chương trình có tên orbite có tham số là u0 để xuất ra dãy [i, uni ] với i P [0, n].
Đường nối những điểm của dãy này được gọi là quỹ đạo của tuu.
2. Viết một chương trình plotorb(n) vẽ quỹ đạo của tuu.
Xem cách vẽ như hình bên orbite(20))
Chọn các hình tròn và đường nối những màu khác nhau.
Thí dụ: plotorb(20,red,blue);
Bài giải
1.12.1
> p:=xˆ4-4*xˆ3-1: plot(p,x=-2..6,-2..2);solve(p);
> allvalues([%]); evalc(%); select(i¡Im(i)=0,%);
> factor(p,sqrt(2));factor(1/p,sqrt(2)):%=convert(%, parfrac,x);
> factor(1/p,{I,(-10+8*2ˆ(1/2))ˆ(1/2)}):%=convert(%, parfrac,x);
1.12.2.1
> restart: with(linalg):M:=matrix(2,2,[2*t,1,2,-t]);
> s:=eigenvects(M); r:=solve(%[1,1]=%[2,1]);
> p:=subs(t=r[1], eval(M)); eigenvects(%);
> p:=subs(t=r[2],eval(M);>eigenvects(%);
1.12.2.2
> restart: with(linalg):
p:=matrix(3,3,[x,0,0,0,y,sqrt(3),0,sqrt(3),z]);
> s:=eigenvals(p);solve(s[2]=8,s[3]=12);
> det(p); s[2]+s[3];solve(y*z-3=8*12,y*z=20);
> assigs(%[1]): x:=4:map(eval,p);eigenvals(%);
1.12.2.3
> restart:with(linalg):S:=matrix(3,3,(i,j)¡if i=j then 5 else
-1 fi);
´ ; Jn:=map(i¡iˆn,eval(J));
> J:=jordan(avalm(1/3*S),ṕ)
> Sn:=evalm(P&*Jn&*inverse(P));evalm(Sn-(1/3+2/3*2ˆn)*diag(1,1,1));
> (1/3*2ˆn-1/3)*map(i¡i/(1/3*2ˆn-1/3),eval(%)):
U:=map(simplify,eval(%));
1.12.3.1
> restart:with(plots):
> eq:=diff(y(x),x)*x*x(xˆ2+1)-(xˆ2-1)*y(x)+2*x;
> dsolve(eq);f:=subs(rhs(%), C1):
> tg:=a¡subs((x=2,diff(f(a),x)*(x-2))+subs(s=2,f(a));
> plot([f(2),tg(2),tg(2),f(3),tg(3)],x=-3..3,0..12);
> solve(tg(u)=tg(v),x);subs(%,tg(u));
> s:=seq(plot([f(i),tg(i)],x=-3..3,0..12,color=[blue,red]),i=0..6):
> dr:=plot([2,x,x=0..12]);display(dr,s);
1.12.3.2
> eq:=k¡diff(y(x),x)*x*(xˆ2+1)-(xˆ2-1)*y(x)+k*x;
> dsolve(eq(k));f:=unapply(rhs(%), C1,k):
> tgx:=(a,u,k) ¡subs(x=u,diff(f(a,k),x))*(x-u)+subs(x=u,f(a,k));
> solve(tgx(x1,u,h)=tgx(x2,u,h),x);simplify(subs(%,tgx(x2,u,k)));
1.12.3.3
> eq:=k¡diff(y(x),x)*x*x(xˆ2-2)-(xˆk-1)*y(x)+2*x;
> dsolve(eq(3));f:=unapply(rhs(%), C1):
> tg:=(a)¡subs(x=3/2,diff(f(a),x)*(x-3/2)+subs(x=3/2,f(a));
> plot([f()2],tg(2),f(3),tg(3),f1,tg(1)],x=0..3,-1..12);
1.12.4.a.1
> with(student):p:=Int((ln(x)/x)ˆ3,x);
> intparts(p,ln(x)ˆ3);intparts(%,ln(x)ˆ2);
> intparts(%,ln(x));value(%);simplify(diff(%,x),symbolic);
1.12.4.a.2
> P:=Int(xˆ2*arccos(x),x);intparts(p,xˆ2);expand(%));
> solve(p=%,p);simplify(diff(%,x),symbolic);
1.12.4.a.3
> p:=Int(exp(-x)*sin(x),x);intparts(p,sin(x));
simplify(intparts(%,cos(x)));
> solve(p=%,p);simplify(diff(%,x),symbolic);
1.12.4.a.4
> p:=Int(x*sqrt(1+xˆ4),x):%=value(%);
> changevar(tan(u)=xˆ2,p,u):%=simplify(convert( sincos),symbolic);
> RP:=rhs(%): RP=changevar(cos(u)ˆ2=t-tˆ2,RP,t);op(1,2*rhs(%));
> Int(convert(%,parfrac,t),t)/2:%=cionbine(value)(%);
> subs(t=sin(acrtan(xˆ2)),rhs(%));simplify(%,symbolic);
simplify(diff(%,x));
1.12.4.a.5[20 ]
> P:=Int(arcsin(x)/xˆ2,x);intparts(p,1/xˆ2;expand(%);
> solve(p=%,p);res:=expand(%);op(1,res),op(2,res);p:=op(3,res);
> changevar(x=cos(u),p,u);subs(sqrt(1-cos(u)ˆ2)=sin(u),%);
> map(simplify,(intparts(%,sin(u))));value(%);
> subs(u=arccos(x),%);res3:=expand(%);
> diff(%,x);simplify(%,symbolic);rationalize(%);
> op(1,res),op(2,res),res3;op(1,res)+op(2,res)+res3;q:=diff(%,x);
> simplify(%,symbolic);simplify(op(2,q)+op(3,q)+op(4,q),symbolic);
1.12.4.a.6
> p:=Int(x*sqrt(x2̂+1)*ln(xˆ2-1),x);value(%);
> chargevar(t=sqrt(xˆ2+1),p,t);
intpats(%,ln(-2+tˆ2));s:=map(expand,%)
> c:=op(2,s);op(1,op(2,c));
op(1,op(2,c))L%=convert(%,parfrac,t);
> r:=op(3,rhs(%));changevar(t=2/sqrt(2)*u,Int(r,t0,u);
> value(%);subs(u=sqrt(2)/28t,%);
res:=op(1,s)-2/3*(int(tˆ2+2,t)+%);
> subs(t=sqrt(xˆ2+1),res);
diff(%,x):%=simplify(%,symbolic);
> cobine(rhs(%),symbolic);factor(%);
1.12.4.b.1
> p:=Int(1/3*xˆ2+6)*x+5),x):%=conpletesqyare(%,x);
> changevar(x+1=sqrt(2/3)*tan(u),rhs(%),u):%=simplify(%);
> p=subs(isolate(x+1=sqrt(2/3)*tan(u),u),value(rhs(%)));
> simplify(diff(rhs(%),x));
1.12.4.b.2
> p:=Int(1/(2*xˆ2-4*x+10)ˆ2,x):%=conpletesquare(%,x);
> char((x-1)=2*tan(u),rhs(%),u):%=simplify(convert(%,sincos));
> p=simplify(subs(isolate((x-1)=2*tan(u,),u),value(rhs(%))));
> p=subs(ioslate)
> simplify(diff(rhs(%),x));
1.12.4.b.3
> p:=Int(1/(xˆ2-6*x+18)ˆ3,x):%=completesquare(%,x);
> changevar(x-3=3*tan(u),rhs(%),u):%=simplify(convert%,sincos);
> combine(rhs(%)):%=value(%);
> p=sim;ify(subs(isolate(x-3=3*tan(u),u),value(rhs(%))));
> p1:=simplify(diff(rhs(%),x));
> factor(rationalize(convert(%,exp)));
1.12.4.b.4
20
» 1
Trong bài này chúng ta chấp nhận dx là một trường hợp "đơn giản".
cos(x)
> p:=Int(3*x/sqrt(8-2*x-xxˆ2),x):%=completesquare(%,x);
> changevar((x+1)=3*sin(u),p,u);simplify(%,symbolic);value(%);
> subs(isolate(x+1=3*sin(u),u),%);>simplify(diff(%,x),symbolic);
1.12.4.c.1
> p:=Int(xˆn*exp(x),x);value(%);intparts(p,xˆn);simplify(%);
> alias(F[n]=Int(xˆn*exp(x),x),F[n-1]=Int(xˆ(n-1)*exp(x),x)):
> map(simplify,%%)
> F:=proc(n)
if n=1 then exp(x) else factor(xˆn*exp(x)-n*F(n-1)):
fi:
end:
1.12.4.c.2
> P:=Int(xˆn*sin(x),x);u:=unapply(p,n):
> alias(F[n]=u(n),F[n-1]=u(n-1),F[n+1],F[n+2]=u(n+2));
> intparts(p,sin(x));x:=intparts(%,cons(x));s:=F[n]=map(simplify,s);
> F:=proc(n)
if n=0 then-cos(x) elif n=1 then sin(x)-x*con(x)
ˆ n)/n*(n-1)*(n):
else (-F(n-2)+sin(x)*xˆ(n-1)/(n-1)-cos(x)/(n-1)*x(
fi:
end:
1.12.5
> orbite:=proc(u0)
local u,f,i,s;
s:=[0,u0];u:=u0;
f:=u¡if u mod 2=1 then 3*u+1 else u/2 u/2 fi;
for i to= 10000 while u<>1
do u:=f(u):
s:=s,[i,u]:od:
s;
end:
> with (plots):
> plotorb:= proc(n,a,b)
local g1,g2:
g1:=pointplot([orbite(n)],symbol=circle,symbolsize=20,color=a):
g2:=plot([orbite(n)],color=b):display(g1,g2);
end:
> display(plotorb(33,blue,red),plotorb(68,red,black));
Thalès vốn là một thương gia, nhưng sau khi tòi thời đó có phải thật là của ông hay không,
phát tài giàu có thì ông dùng tiền kiếm được nhưng có điều gần như chắc chắn ông là nhà
để đi chu du, giao lưu học hỏi, nghiên cứu. hình học đầu tiên của nhân loại. Tác phẩm của
Chặng đường đầu tiên ông dừng chân là Ai ông về Hình học sơ cấp như những điều ông
Cập. Tương truyền rằng ở đó có người thách đã phát biểu về đường thằng, góc, tam giác...
Thalès đo chiều cao của kim tự tháp mà không đều khá rõ ràng tuy có một số kiến thức được
cần leo lên (mà cho dù có leo lên đỉnh cũng biết từ thời văn minh Babylone nhưng Thalès
chẳng giải quyết được gì !). Thalès liền cắm quan tâm đến chứng minh, đó là điều làm tôn
một cây gậy xuống đất rồi nói: Khi chiều dài giá trị khoa học của ông. Những nhà khảo cổ
bóng cây gậy bằng cây gậy thì chiều dài bóng đã sưu tập được những bài phát biểu này, đó
kim tự tháp bằng chiều cao của nó. Có lẽ lúc chính là cơ sở để đánh giá tính khoa học của
ấy ông không thể ngờ rằng hơn 26 thế kỷ sau, việc nghiên cứu ông để lại cho đời sau. Sáu kết
các học sinh đều phải học qua câu nói bất hủ quả quan trọng sau đây người ta cho là công lao
này: Định lý Thalès. của Thalès:
Sau khi đi nhiều, giao du rộng, học hỏi
khắp nơi, ông trở về Milet và nổi tiếng là một Các góc đáy của tam giác cân bằng nhau.
nhà thông thái, hiểu biết uyên bác nhiều lĩnh
vực: Doanh nghiệp, Chính trị, Khoa học, Thiên Nếu hai đường thẳng cắt nhau thì các góc
văn, Toán học... Ông đã biết và truyền bá cho đối đỉnh bằng nhau.
những người xung quanh rằng một năm có 365
Một tam giác được xác định chính xác
ngày, người ta còn đồn rằng vào thời đó ông
nếu biết độ dài của một cạnh và hai góc
đã hiểu vì sao có nguyệt thưc, nhật thực. Ông
kề với cạnh đó.
được người đương thời và hậu thế tôn vinh là
nhà toán học đầu tiên của loài người. Quan Những cạnh tương ứng của các tam giác
điểm của ông về nguồn gốc của muôn loài là đều thì tỉ lệ với nhau.
từ nước mà ra. Theo Aristore thì Thalès cũng
là "nhà đầu cơ đầu tiên của loài người" vì có Đường kính chia vòng tròn ra hai phần
một năm, được mùa quả ô-liu, Thalès bèn bỏ bằng nhau.
hết tiền ra mua sạch tất cả ô-liu vừa thu hoạch,
sau đó ông cho bán từ từ ra thị trường. Năm Một tam giác ABC nội tiếp trong một
đó, ông thu được tiền nhiều vô kể. vòng tròn và nếu BC là đường kính của
Thật khó kết luận là những phát minh tìm z là một góc vuông.
vòng tròn thì BAC
Cực trị là một bài toán cổ điển nhưng nhiều ứng dụng.
Ngay từ thời xa xưa con người luôn luôn thắc mắc: đoạn đường nào gần nhất, thể tích nào
lớn nhất, chu vi nào nhỏ nhất... Bằng các tính toán qua kinh nghiệm, người xưa đã thiết lập ra
các công thức thực nghiệm, nhưng phải đợ đến khi các nhà toán học tìm ra đạo hàm thì mọi việc
mới được suy luận một cách chặt chẽ.
Bài toán cực trị đơn thuần là giải phương trình đạo hàm của đại lượng muốn tìm cực trị.
Phương pháp tổng quát của bài toán cực trị là:
Tìm sự quan hệ giữa các biến và tìm cách đưa về hàm một hoặc hai biến.
Khó khăn khi dùng trong môi trường tính toán hình thức ở chỗ sau khi giải phương trình phải
tìm ra các nghiệm thích hợp.
.r . .
.h
.
Hình 2.1:
1
eh := h =
r2
Thay vào biểu thức của S:
> subs(%,S);
2π
+ 2πr2
r
dS
Giải = 0 ta sẽ có ba nghiệm, trong đó ta chỉ lấy một nghiệm thực:
dr
> r=select(i¡Im(i)=0,solve(diff(%,r)));
1
r = 22/3
2
Chiều cao h và diện tích S của hình trụ là:
> subs(%,eh);
h = 22/3
> 'S'=subs(%%,%,S);
S = 3π21/3
Kiểm chứng vui: Bán kính và chiều cao của mọt lon sữa bò quen thuộc là 36.5 và 75mm.
Ta có dung tích của nó là πtimes(36.5)2 75 314cm3 .
Hãy kiểm chứng rằng diện tích của lon sữa bò 2π 36.52 + 2π 36.5 75 255cm2 là
tối ưu.
Hình 2.2:
?2 2
> T:=sqrt(hˆ2+xˆ2)/u+(n-x)/v;
h +x nx
T := +
u v
dT
Tọa độ của x là nghiệm của phương trình = 0:
dx
> solve(diff(%,x),x);
? hu , ?
hu
u + v
2 2 u2 + v2
Trước tiên ta lưu ý rằng các lệnh đều độc lập với n. Mặt khác, lời giải này chỉ có ý nghĩa
khi v 2 u2 ¡ 0, và như thế ta chỉ lấy được nghiệm thứ hai. Vì tất cả các biến đều hình thức nên
cách duy nhất để lấy nghiệm dương là tìm trên dấu của biểu thức. Kế tiếp gán và biến.
> p1:=select(i¡is(sign(i)=1),%);
p1 := ?
hu
u2 + v2
Giả sử bây giờ ta đặt RX = x, thời gian tổng cộng sẽ là:
?2 2
> T:=sqrt(hˆ2+(n-x)ˆ2)/u+x/v;
h + n 2nx + x2 x
T := +
u v
> s:=solve(diff(%,x),x); (không hiển thị)
Cùng một lý luận tương tự như trên, ta sẽ rút ra được một nghiệm (bây giờ nghiệm sẽ tùy
thuộc vào n). Nhưng vì kết quả quá phức tạp, không thể chọn bằng select nên ta chọn ngẫu
nhiên nghiệm thứ nhất làm lời giải.
Và nếu lời giải đúng ta phải có p1 + s[1] = QX + XR + QR = n.
> simplify(p1+s[1],symbolic);
? 2 2
hu +
? 2u +2v n
u + v
Kết quả trên lớn hơn n, không chấp nhận được, phải lấy nghiệm thứ hai:
> simplify(p1+s[2],symobolic);
n
Vậy nghiệm là s[2]. Với h = 10, u = 5, v = 10, n = 20, giá trị của XR là:
> simplify(sbus(h=10,v=10,u=5,n=20,s[2])):%=evalf[5](%);
20 ?
20 3 = 14.226
3
Lưu ý: Khi u ¡ v, p1 sẽ là một số phức. Điều này hiển nhiên, và nó còn hiển nhiên hơn
trong thực tế: nếu bơi nhanh hơn đi, ta chỉ cần bơi thẳng một lèo từ P sang R.
.K
.A
.
.
.a
.H
.X .B
.J
Hình 2.3:
Gọi A là tâm trái đất và x = AX là khoảng cách từ A đến điểm muốn tìm. Về phía trái đất,
chiều cao của phần lồi là h = a AH. Mặt khác ta còn có:
2
cos α =
AH
a
=
a
x
ñ AH = ax
b2
Tương tự, về phía mặt trăng, chiều cao của phần lồi sẽ là b
lx
.
Tổng diện tích nhìn thấy từ phi hành gia và là đại lượng cần tìm cực trị là:
> p:=2*Pi*a*(a-aˆ2/x)+2*Pi*b*(b-bˆ2/(1-x));
( ) ( )
a2 b2
p := 2πa a + 2πb b
x lx
> s:=solve(diff(p,x),x);
Điều này khong có gì ngạc nhiên, vì Maple không thể xét dấu của s khi a, b, l đều không
phải là số. Nhưng thay vì cho số tất cả, ta thử a = 2b :[1 ]
> simplify(subs(a=2*b,s[2]));
?
27 (4 + 2csgn(b))l
Hàm csgn(b) là hàm dấu của ℜ(b), cho kết quả là 1 nếu ℜ(b) ¡ 0, và 1 nếu ℜ(b) 0.
Bây giờ ta giả sử b ¡ 0.
> assume(b>0):%=evalf(%);
?
27 (4 + 2l) = 1.546918160l
Nghiệm này bị loại vì lớn hơn l. Tiếp tục với nghiệm thứ hai ta được:
> simplify(subs(a=2*b,s[2])):%=evalf(%);
?
27 (4 + 2l) = 0.7387961251l
Vậy ta phải lấy nghiệm thứ hai.
Việc dơn giản biểu thức của lời giải s[2] vô cùng phức tạp và khong đem lại gì khả quan.
Ta phải giúp Maple một tay. Trước tiên ta nhân tử số với (a3/2 + b3/2 ) rồi rút gọn:
> b:='b':
> v1:=aˆ(3/2)+bˆ(3/2);
v1 := a3/2 + b3/2
> simplify(expand(numer(s[2])*v1),symobolic);
la9/2 + la3/2b3/2
Sau đó ta chia kết quả trên cho mẫu số nhân với v1 rồi rút gọn:
> %/(denom(s[2])*v1):%=simplify(%);
la9/2 + la3/2b3/2 = la3/2
(a3 + b3 )(a3/2 + b3/2 ) a3/2 + b3/2
?
Kết luận: Khoảng cách từ tâm A của trái đất đến điểm muốn tìm là ?
l3a
?.
3
a+ 3b
AB = r, N B = h, OA = R
Gọi p1 là thể tích hình nón và là hàm số ta phải tính cực trị:
> pV:=V=1/3*Pi*rˆ2*h;
1
pV := V = πr2 h
3
.N
. .O
.A .B
Hình 2.4: (a) Hình nón nội tiếp (b) đương biểu diễn của thể tích theo h khi R = 3.
2 2 2
Để loại r trong biểu thức pV , ta có: AB + OB = OA :
> uI:=rˆ2+(h-R)ˆ2=Rˆ2;
uI := r2 + (h R)2 = R2
> pI:=isolate(uI,r);
pI := r = RooOf ( Z 2 + h2 2hR) (2.4.1)
Thay giá trị của r vào biểu thức của thể tích hình nón và tìm cực trị bằng cách giải phương
B pV (h, R) = 0 để tìm giá trị của h(h ¡ 0):
trình
Bh
> p3:=subs(%,rhs(pV));
p3 := πRooOf ( Z 2 + h2 2hR)2 h
1
3
> eh:=h=op(select(i¡i<>0,[solve(diff(%,h),h)]));
4
eh := h = R
3
Thay kết quả này vào biểu thức của p3 để tính Vmax . Ta dùng hàm allvalues để hiển thị
mọi giá trị:
> subs(eh,p3):%=allvalues(%);
( )
π(RootOf (9 Z 8R )) R =
4 2 2 2 32 3 32 3
πR , πR
9 81 81
Để có r ta thay giá trị của V và h vào biểu thức của pV :
> solve(subs(V=rhs(%)[1],eh,pV),r);
2? 2?
2R, 2R
3 3
2? 4 32
Kết luận: r = 2R, h = R, V = πR3 .
3 3 81
Cách làm trên khá phức tạp với hàm RootOf. Thực ra chúng ta có thể đơn giản đi nhiều
bằng cách dùng isolate với r2 thay vì r, và thay thế giá trị này vào biểu thức pV trước khi
giải:
> isolate(uI,rˆ2): p3:=subs(%,rhs(pV)):
Để kiểm chứng lại kết quả, ta có thể vẽ đồ thị của p3 và p13 , nghĩa là đường biểu diễn của
thể tích theo (h, R). Để đơn giản ta cho R = 3:
> fVI:=unapply(p3,R):
> plot([fVI(3)],diff(fVI(3),h)],h=0..5,-10..34,linestyle=[1,4]);
4 32
Theo hình 2.4 (b), thể tích cực đại khi h = R = 4 và giá trị này là π33
3 81
33.51
Tìm thể tích nhỏ nhất của hình nón ngoại tiếp hình cầu bán kính R.
.M
.N
.D
.
.O
.B .C
Hình 2.5: (a) hình nón ngoại tiếp (b) đường biểu diễn của thể tích theo h khi R = 3.
Và cùng mọt cách tính cực đại như trên chúng ta có:
> p3:=subs(%,rhs(pV));
1 πh3 R2
3 h2 2hR
p3 :=
> s:=solve(diff(%,h),h);
> simplify(isolate(subs(h=s[2],uE),r),symbolic);
s := 4R
?
r=R 2
? 8
Kết luận: h = 4R, r = R 2, V = πR3
3
Đồ thị của thể tích theo h với R = 3:
> fVE:=unapply(p3,R):
> plot([fVE(3)],h=9..16,tickmarks=[3,3]);
Theo như Hình 2.5 (b) thì thể tích cực tiểu ở h = 4R = 12.
? ta cực trị hóa diện tích chung quanh hình nón thay vì thể tích, ta sẽ
Bây giờ giả sử chúng
tính cực trị của S = πr r2 + h2 . Và cùng một lý luận như trên:
?
> pS:=S=Pi*r*sqrt(rˆ2+hˆ2);
pS := πr r2 + h2
Để loại r trong pS, dùng lại biểu thức pI (2.1):
> p3:=subs(pI,rhs(pS));
p3 := πRootOf ( Z 2 + h2 2hR) h2 + (RootOf ( Z 2 + h2 2hR))2
a
> eh:=h=solve(diff(p3,h),h);
4
eh := h = R
3
> subs(eh,p3):%=op(map(simplify,[allvalues(%)],symbolic));
1/3πRootOf (9 Z 2 8R2 ) 16R2 + 9(RootOf (9 Z 2 8R2 ))2
a
? 8 ?
= πR2 3, πR2 3
8
9 9
> s:=solve(subs(S=rhs(%)[1],eh,pS),r);
2? 2 ? 2? 2 ?
s := 2R, I 6R, 2R, I 6R
3 3 3 3
Để tìm nghiệm dương duy nhất trong bốn nghiệm trên ta phải dùng op để tách biến hình
thức R. Mặt khác vì lênh select thực hiện trên [s] nên ta lại phải op trên các phần tử s[i] để
lại dấu ngoặc vuông:
> select(i¡is(Re(op(1,op(s[i])))>0),[s]);
[ ]
2?
2R
3
?
4R 2? 8 3 2
Kết luận: h = ,r = 2R, S = πR và đó cũng là kích thước hình nón khi tính
3 3 9
cực trị với thể tích.
Vẽ đồ thị ta chọn R = 3:
> fSI:=unapply(p3,R);
> plot([fSI(3)],h=0..6); [Hình 2.6 (a)]
Lưu ý: Diện tích là một đại lương dương nhưng đôi khi đường biểu diễn lại âm. Lý do là
vì hàm p3 có hai giá trị đối xứng nhau:
> allvalues(p3):
? ?? ?
> %=map(combine,[%],radical,symbolic);
??
π h2 + 2hR 2 hR, π h2 + 2hR 2 hR
= [πh (2h 4R)R, πh (2h 4R)R]
a a
Vậy nếu đồ thị âm thì chỉ cần lấy giá trị kia hoặc cũng có thể lựa nghiệm dương bằng cách
xét dấu của nó:
> select(i¡sign(i)>0,[allvalues(p3)]);
> fSI:=unapply(op(%),R):plot(fSI(3),h=0..6);
Hình 2.6: Đồ thị của diện tích theo h khi R = 3: (a) trường hợp nội tiếp; (b) ngoại tiếp
?
> s2:=simplify(subs(h=%,p3),symbolic);
? ? (2.4.3)
s2 := df rac12π(2 + 2)R2 (1 + 2) 2
?
> s:=solve(subs(S=s2,h=eh,pS),r);
a a ? a ? a ?
s := 7 5 2R, 7 5 2R, 1+ 2R, 1+ 2R
Dĩ nhiên ta chỉ chọn nghiệm r ¡ R:
> op(select(i¡is(Re(op(1,op(s[i])))>0),[s])):%=evalf(%);
a ?
1+ 2R = 1.5537R
s2 (phương trình 2.3) là một biểu thức không dễ rút gọn vì có dạng căn. Trong trường hợp
này ta chỉ có thể bình phương lên trước khi rút gọn hoặc dùng combine:
> s2:%=factor(expand(combine(%,radical,symbolic)));
1 ? ? ? ?
π(2 + 2)R2 (1 + 2) 2 = πR2 (2 2 + 3)
2
Đường biểu diễn của diện tích theo h tương ứng với R = 3:
> fSE:=unapply(p3,R):plot(fSE(3),h=7.5..13);
a ?
Theo Hình 2.6 (b) thì diện tích sẽ cực tiểu khi h = R 1 + 2 10.24
Bảng dưới đây tóm tắt kết quả của các cách tính theo thể tích (V ), diện tích chung quanh
(S) và ở mỗi cách tính ta phân biệt hai trường hợp: hình nón nội tiếp (viết tắt là int) hoặc ngoại
tiếp (ext):
Các hình dưới đây được vẽ trực tiếp từ kết quả vừa tính được:
?
3 2 2
Nội tiếp cực đại tính theo V : h = R, r = R. Cho R = 3:
4 3
> with(plottools):h:=4/3*R:r:=2/3*sqrt(2)*R:R:=3:
> CO:=cone([0,0,-R],r,h,style=patch):SP:=sphere([0,0,0],R):
> plots([display]([SP,C0],style=wireframe); [Hình 2.7 (a)]
? a ?
Nội tiếp cực đại tính theo S : h = (2 + 2)R, r = 1+ 2R 1.55. Cho R = 3:
> vh:=R*(2+sqrt(2));vr:=sqrt(1+sqrt(2))*R;ct:=vh-R;
> SP:=sphere([0,0,0],R,style=patch);C0:=cone([0,0,-ct],vr,vh):
> plots[display]([SP,C0],style=wireframe); [Hình 2.7 (b)]
1. Tìm chiều dài tối đa của khúc cây thẳng có thể đi qua.
2. Nếu thay vì khúc cây, bây giờ là một chiếu xe có bề ngang u. Tính chiều dài
tối đa của xe để có thể vượt qua khúc cua?
Hình 2.7: Hình nón nội tiếp và ngoại tiếp hình tròn
Vấn đề 1
Đại lượng cần phải tìm cực trị là đoạn AB trong hình bên. Gọi a là chiều rộng đường AC
và b là chiều rộng đoạn BC. Gọi α là góc hợp bởi AB và AC:
> p:=b/cos(alpha)+a/cos(Pi/2-alpha);
b a
p := +
cos(α) sin(α) (2.5.1)
dp
Phương trình = 0 cho ba nghiệm (không in ra vì quá dài), trong đs có hai nghiệm phức
dα
(loại):
> solve(diff(p,alpha),alpha):
Để loại các nghiệm phức, chúng ta không thể đi tìm các nghiệm có phần phức khác không,
vì tất cả các bieén ở đây đều hình thức. Cách duy nhất là đi tìm chữ I, biểu tượng cho số phức,
và ta gán tên cho kết quả tìm thấy (việc này sẽ hữu ích cho phần sau):
?3 2
> as:=op(remove(has,[%],I));
ab
as := arctan( ) (2.5.2)
b
Và chiều dài AB hay khúc cây thẳng dài nhất có thể đi qua khúc cua là:
> subs(alpha=%,p);
c c
(ab2 )2/3 (ab2 )2/3 1 2
b 1+
b2
+ ab 1+
b2
?3 2 [ ]
ab
Để đơn giản biểu thức trên, chúng ta cần phải qua những quá trình phức tạp (mà chỉ kết quả
sau cùng mới được xuất ra ở đây):
> simplify(%,symbolic):normal(%,expanded):
2
Kết quả của lệnh này có dạng lượng giác, nhưng khi xuất sang LATEX thì được chuyển sang căn số
.B
.b
.a
.α
.
.A .C
Hình 2.8:
Đem kết quả trên gán cho một hàm số theo (a, b):
> f1:=unapply(%,(a,b));
Ứng dụng bằng số, ta được chiều dài tối đa của khúc cây có thể qua được khúc cua 3 2 là:
> evalf(f1(3,2));
7.023482380
Và theo (2.6) ta chắc chắn f 1(a, b) = f 1(b, a)
Vấn đề 2
Trường hợp chiếc xe hình chữ nhật có bề ngang u cũng giống như trường hợp khúc cây
u
nhưng lúc ấy chiều rọng đường AC sẽ giảm đi một khoảng bằng .
cos(α)
Ta có thể lý luận rằng trong trường hợp khúc cây ta phải tìm cực tiểu của đoạn AB xoay
u
quanh F , và trong trường hợp chiếu xe, tìm cực tiểu của AB xoay quanh E, với EF =
cos(α)
Vẫn gọi a, b lần lượt là chiều rộng mặt đường AC và CB, u là chiều rọng của xe. Biểu thức
của p trong trường hợp này là:
> q:=b/cos(alpha)+(a-u/cos(alpha))/sin(alpha);
a
u
b cos(α)
q := +
cos(α) sin(α)
> solve(diff(q,alpha),alpha);
( )
%13 a 2%12 u + u
arctan
b(%12 1)
, % 1
.B
.b
.u .B 1
.F
.α
.a
.E
. .α
.A .A1 .C
Hình 2.9:
arctan( )
b
> subs(alpha=%,a=a-u,p);
b au
( )+ ( )
arctan((a 2u)b2 ) arctan((a 2u)b2 ) 3
1 1
3
cos sin
b b
> simplify(%,symbolic);
b
?
b 3 + (a 2u) 3 ( 3 a 2ub 3 + a u)
2 2 2
? 3
a 2u
(2.5.4)
> f3:=unapply(%,(a,b,u)):
Như thế chiều dài tối đa của một chiếc xe có chiều ngang 1 mét qua được khúc cua 3 2 là:
> f3(3,2,1):%=evalf(%,5);
a
2 2
2 3 + 1(2 3 + 2) = 5.7703
Khi u = 0 nghĩa là trường hợp khúc cây, ta tìm lại được kết quả của (2.7):
> f3(3,2,0):%=evalf(%,5);
1a 2 2 ? 2 2
2 3 + 3 3 ( 3 32 3 + 3)3 3 = 7.0236
3
Khi u = 2 nghĩa là chiếc xe có chiều rộng bằng mặt đường CB:
> f3(3,2,2):%=evalf(%,5);
b
?
2 3 + (1) 3 ( 3 12 3 + 1)(1) 3 = 2.6602 0.15181I
2 2 2 2
Kết quả hợp lý, vì không thể nào một chiếc xe có thể rẽ vào một con hẻm cs cùng chiều
rọng với nó, trừ khi chiếc xe không rẽ mà là đâm thẳng vào, và theo (2.4), điều này có nghĩa là
α = hay AB = 8 . . .
π
2
Mặt khác khi quan sát biểu thức (2.8), ta thấy nó chỉ có nghĩa khi a ¡ 2u. Điều đó có nghĩa
chiều rộng của xe không được vượt quá một nửa chiều rộng của đường AC nhưng lại không
ràng buộc gì với BC. Ta có thể suy luận ra rằng: f 3(a, b, u) f 3(b, a, u):
> evalf(f3(3,4,1),5),evalf(f3(4,3,1),5);
8.4796, 8.5435
Kết quả chiều dài xe tùy thuộc vào hướng đến của xe. Điều này trái ngược với (2.5), ta ta
bắt buộc phải chia hai trường hợp để xét[3 ]:
Trên đây ta đã xét trường hợp xe đến từ AC (thay thế a bằng a u), bây giờ giả sử xe đến
từ đường BC, phải thay thế b = b u trong hai biểu thức (2.6) và (2.7) trước khi gán vào hàm
f 4:
> subs(b=b-u,as);subs(alpha=%,b=b-u,p);
> f4:=unapply(%,(a,b,u));
bu
f 4 := (a, b, u) ÞÑ
a
( )+ ( )
arctan(a(a 2u) )
2 f rac13 arctan(a(a 2u)2 )f rac13
b 2u b 2u
cos sin
> evalf(f3(3,4,1)),evalf(f4(4,3,1)),evalf(f4(3,2,0));
8.479785248, 8.479785248, 7.023482380
3
Nhưng biết đâu điều này hợp lý ngoài đời (với các tài xế)?
2.6 Ellipsoid
Cho ellipsoid (E) có các bán kính theo (a, y, z), lần lượt là (a, b, c). Tính kích thước
của hình hộp chữ nhật (H) nội tiếp trong (E) có thể tích lớn nhất.
.y
.a
. .x
.b
.c
.z
Đây là trường hợp tìm cực trị có điều kiện của hàm nhiều biến dưới ràng buộc đẳng thức.
Bài toán cực trị được giải theo phương pháp nhân tử Lagrange:
$
' B f (x, y) + u B g(x, y) = 0
BBx BBx
&
tối ưu hóa hàm
dưới ràng buộc
f (x, y)
g(x, y) = 0
ùñ '
%
By f (x, y) + u By g(x, y) = 0
Trong bài này đại lượng cần tìm cực trị f (x, y) là thể tích V của hình hộp, và điều kiện
g(x, y) là phương trình của (E):
> g:=xˆ2/a+yˆ2/bˆ2+zˆ2/cˆ2=1;
x2 y 2 z 2
g := 2 + 2 + 2 = 1
a b c
Vì nội tiếp trong (E) nên (H) có các đỉnh tiếp xúc với (E), tọa độ của chúng là (x, y, z),
và thể tích của (H) là:
> V:=8*x*y*z;
V := 8xyz
> fx:=diff(V,x):fy:=diff(V,y):fz:=diff(V,z):
> gx:=diff(g,x):gy:=diff(g,y):gz:=diff(g,z):
> s:=solve({fx+u*gx,fy+u*gy,fz+u*gz,g},{u,x,y,z});
Trong 10 nghiệm này (hoặc đúng ra trong 4 nghiệm đơn và 3 nghiệm kép của s), đương
nhiên ta chỉ chọn các nghiệm dương cho (x, y, z).
> allvalues(s[3])[1];
1? 1? 4? 1?
" *
x = |a| , y = |b | 3, z = |c|
3 3
3 3 3
Để khai báo hình khối chữ nhật, bắt đầu từ phiên bản 8 có lệnh parallelepiped phải
dùng hàm draw.
Mặt khác, để có thể vẽ chung hình khối và ellipsoid trong cùng một đồ thị cần biến đổi từ
draw sang POLYGON
Gọi (u, v, w) lần lượt là tọa độ theo (x, y, z). Đặt a = 3, b = 2.5, c = 2, ta có:
> restart:with(geom3d):eith(plots):
> a:=3:b:=2.5:c:=2:eq:=xˆ2/aˆ2+yˆ2/bˆ2+zˆ2/cˆ2=1:
> u:=a*sqrt(3)/3:v:=b*sqrt(3)/3:w:=c*sqrt(3)/3:
> point(A,u,-v,w),point(B,u,v,w),point(C,u,-v,-w),point(D,-u,-v,w):
> dsegment(d1,[A,B]),dsegment(d2,[A,C]),dsegment(d3,[A,D]):
> paralleleppiped(pp,[d1,d2,d3]):
> p:=convert(draw(pp,labels=[x,y,z]),POLYGONS):
> s:=implicitplot3d(eq,x=-3..3,y=-2.5..2.5,x=-2..2,
style=wireframe,axes=boxed):
> display(p,s,scaling=constrained,orientation=[-36,76]);
Ta cũng có thể "xén" trái dưa Thái để thấy rõ chi tiết hình khối:
> s:=implicitplot3d(eq,x=-3..2,y=-2..2,z=-2.5..2.5,style=wireframe):
> display(p,s,scaling=constrained,orientation=[-16,106]);
khử được và lúc ấy chúng ta bắt buộc phải giải hệ phương trình đạo hàm.
Từ một thanh sắt dài n mét, người ta muốn tạo thành một bồn chứa hình chữ U bằng
cách gấp hai đầu một đoạn x vào một góc a. Tính x và a sao cho dung tích bồn cực
đại.
.x
.a
........ . ..........
Hình 2.12:
Gọi S là đại lượng cần tính, thì lời giải đơn thuần là nghiệm của hệ phương trình đạo hàm:
"
B S(x, a) = 0,
B S(x, a) = 0 .
*
partialx partiala
> S:=n*x*x*sin(a)-2*xˆ2*sin(a)+xˆ2*sin(a)*cos(a);
S := nx sin(a) 2x2 sin(a) + x2 sin(a) cos(a)
> ex:=factor(diff(S,x));
ex := sin(a)(n 4x + 2x cos(a))
> ea:=factor(dif(X,x));
ea := x(2x cos(a) x(cos(a))2 + x(sin(a))2 n cos(a))
> solve({ex,ea},{x,a});
tx = 0, a = 0u, tx = n, a = 0u, tx = n3 , a = πu
tx = n3 , a = arctan(RootOf ( Z 2 3, label = L1), 1)u
Ta thu được bốn cặp nghiệm, ba cặp nghiệm đầu không thích hợp và ta phải giữ lại nghiệm
. .a
.y
.2x
Hình 2.13:
> restart:alias(alpha=a):
> S:=2*x*y+xˆ2*tan(a);
S := 2xy + x2 tan(α)
> vp:=2*x+2*y+2*x/cos(a)-P;
vp := 2x + 2y + 2
x
cos(α)
P
Chúng ta có cả thảy 3 biến để tính cực trị và vấn đề này sẽ rất phức tạp. Lý tưởng là chúng
ta sẽ đưa về hai biến bằng cách loại y từ biểu thức trên:
> solve(vp,y);
12 P cos(α) cos
+ 2x cos(α) + 2x
(α)
> S1:subs(y=%,S);
x(P cos(α) + 2x cos(α) + 2x)
S1 := + x2 tan(α)
cos(α)
Và hệ hai phương trình để tính cực trị là:
> ex:=diff(S1,x);
ex :=
P cos(α) + 2x cos(α) + 2x x(2 cos(α) + 2) + 2x tan(α)
cos(α) cos(α)
> ea:=diff(S1,a);
x(P sin(α) 2x sin(α))
ea :=
cos(α)
x(P cos(α) + 2x cos(α) + 2x) sin(α)
+ x2 (1 + tan(α))2 )
(cos(α))2
> solve({ex,ea},{x,a});
tx = 12 RootOf ( Z 2 + 1 4 Z, label = L2)P
a = arctan( , RootOf ( Z 2 + 1 4 Z, label = L2) + 1)u
1 1
2 2
> u:=allvalues(%);
"
? * "
? *
, x = (2 3)P, a =
1 5π 1 5π
u := x = (2 + 3)P, a =
2 6 2 6
Quan sát hai cặp nghiệm trên thì ta thấy cặp thứ nhất không thích hợp vì:
?
x = (2 + 3) ¡ P . Dung hàm assign để chấp nhận lời giải:
P
2
> assign(u[2]);
Với x và α xác định, ta tính được y và tức khắc suy ra diện tích S:
> y:=factor(solve(vp,y));
?
y := (3 + 3)P
1
6
> 'S'=factor(S);
1 ?
S = ( 3 2)P 2
4
Kết luận: Với P cho trước, S sẽ cực đại khi:
? ? P2 ?
, x := (2 3), y := (3 3), S := (2 3)
π P P
α= (2.8.1)
6 2 6 4
Cách giải trên hơi dài dòng nhưng đó là một cơ hội để thao tác trên các lệnh diff, al-
lvalues. Cách giải ngắn gọn nhất vẫn là phương pháp nhân tử Lagrange vì nó có thể giải dễ
dàng một hệ nhiều biến[4 ]. Bài toán của chúng ta là tối ưu hàm S (phương trình 2.9) với ràng
buộc vp = 0 (phương trình 2.10):
$
'
B f (x, y, a) + u B g(x, y, a) = 0
*
'
'
'
& BBx BBx
tối ưu hóa hàm
dưới ràng buộc
f (x, y, a)
g(x, y, a) = 0
ùñ By f (x, y, a) + u By g(x, y, a) = 0
B f (x, y, a) + u B g(x, y, a) = 0
'
'
'
'
%
Ba Ba
> dx:=diff(S,x);dy:=diff(S,y);da:=diff(S,a);
dx := 2y + 2x tan)a), dy := 2x, da := x2 (1 + tan(a)2 )
> gx:=diff(vp,x);gy:=diff(vp,y);ga:=diff(vp,a);
2 2x sin(a)
gx := 2 + , gy := 2, ga :=
cos(a) cos(a)2
> s:=solve({dx+u*gx,dy+u*gy,da+u*ga,vp},{u,x,y,a});
Kết quả là những RootOf phức tạp, không in ra đây.
4
Xin xem thêm về phương pháp Lagrange mục 3.4
> allvalues(%);
"
? ? ? *
Cuộc đời của nhà toán học Hy Lạp lỗi lạc thời Triết lý Pythagore xem thế giới này là có
cổ đại này luôn là một bí ẩn đối với hâu thế. thể giải thích được bằng số. Ở đây, số có nghĩa
Người ta đoán rằng gia đình ông gốc Tyr, và là số nguyên, một phân số không thể xem là
hình như ông đã từng là học trò của Thalès. số được. Pythagore quan tâm đến thương của
Ông đi chu du nhiều nơi, qua Ai Cập, rồi Baby- hai độ dài. Ông nói rằng thương số này là khả
lone, Tiểu Á rồi cuối cùng về định cư và mở ước nếu ta biểu diễn được dưới dạng phân số,
trường tại Crotone. Học trò của ông lúc này nghĩa là tử số và mẫu số của nó được biểu diễn
thuộc nhiều tầng lớp của xã hội. Đặc biệt trong bằng số nguyên (cùng đơn ? vị đo). Vì vậy cho
trường có cả phụ nữ, đó là điều cấm kỵ thời bấy nên khi phát hiện ra rằng 2 không phải là khả
giờ. Trong số "nữ sinh" của ông có Théano sau ước các học trò hoang mang không hiểu nó là
này thành vợ ông mặc dù có sự cách nhau khá gì, vì chưa giải thích nó được bằng luận điểm
lớn về tuổi đời. của thầy, nên họ giấu đi không công bố hiện
Trong số học trò của Pythagore, chỉ có một tượng đó.
số ít được tuyển vào một nhóm đặc biệt thân Môn đệ của Pythagore gắn mỗi số với một
cận với thầy mà thôi. Có những phát minh gì số hạt sỏi tương ứng. Họ xếp các số theo cách
mới thì thầy phổ biến cho nhóm đặc biệt này sau: các số như 1, 3, 6, 10... và tổng quát là số
và thành viên không được tự tiện phổ biến ra 1
2
n (n + 1) được gọi là những số tam giác;
ngoài. Pythagore truyền bá mạnh mẽ tư tưởng các số như 1, 4, 9, 16, tổng quát là n2 thì gọi
triết học cùng tín ngưỡng của minh vào đám là những số vuông. Những số không phải là số
học trò thân cận. Nhưng cũng vì đó mà nảy sinh nguyên tố thì gọi là những số chữ nhật.
lòng ganh ghét trong cộng đồng và kết cục là Nhờ cách sắp xếp ấy mà người ta chứng
Pythagore và một số học trò thân thiết của ông minh được một số công thức, ví dụ:n2 + 2n +
bị giết thê thảm! Nhưng cộng đồng do ông gây 1 = (n + 1)2 , 1 + 3 + ... + (2n 1) = n2 ,
dựng lên thì vẫn tồn tại và phát triển thêm một và chính trường phái Pythagore đã phát hiện ra
thế kỷ nữa và phần nào thành công trong việc các số hoàn hảo, số bạn bè.
phát triển toán cũng như triết học.
Hai số bạn bè là hai số mà các ước số của số này có tổng bằng số kia.
Thí dụ 284 có ước là 1, 2, 4, 71, 142 và tổng của nó là 220.
220 có ước là 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 và tổng của nó là 284.
Chương này trình bày một số lệnh của đồ thị 3 chiều qua thí dụ bài toán đi tìm cực trị hàm
nhiều biến hay tối ưu hóa dưới ràng buộc[1 ].
3.1 Thí dụ 1
Trong thí dụ này, hệ phương trình fx1 (x, y) = fy1 (x, y) = 0 không cho ra lời giải giải tích
cũng như lời giải số, chúng ta bắt buộc sử dụng đến đồ thị.
Cho hàm f (x, y) được khai báo dưới dạng hàm mũi tên:
> restart:with(plots): alias(SA='shading=ZHUE,axes=box'):
> f:=(x,y)¡3*(x-1)ˆ2*exp(-xˆ2-(y+1)ˆ2)-10*(1/5*x-xˆ3-yˆ5*
exp(-xˆ2-yˆ2)-1/3*exp(-(x+1)ˆ2-yˆ2);
f := (x, y) ÞÑ 3(x 1)2 ex (y+1) 10( x x3 y 5 )ex y e(x+1) y
2 2 1 2 2 1 2 2
5 3
Surface := plot3d(f(x, y), x = -3.5 .. 3.5, y = -3.5 .. 3.5,
grid = [40, 40]):
display(Surface, orientation = [-49, 69], lightmodel = light1,
SA);
Quan sát đồ thị ta thấy f (x, y) có nhiều điểm dừng, đó là những điểm đạo hàm riêng fx1 (x, y)
và fy1 (x, y) triệt tiêu. Để xác định tọa độ và tính chất của những điểm này, cần thiết giải hệ
phương trình:
fx1 (x, y) = 0//fy1 (x, y) = 0
Vì f (x, y) là hàm mũi tên nên phải dùng toán tử D để lấy đạo hàm riêng:
Bf D[1]f (x, y), f (x, y) = Bf D[2]f (x, y)
fx (x, y) =
Bx y
By
> fx:=D[1](f)(x,y): 'fx'=collect(fx,exp);
f x = (6(x 1)2 x + 6x 6)ex (y+1) +
2 2
5 3 3
1
Chủ đề được trích từ giáo trình của Collège de Maisonneuv (Québec, Canada) với sự đồng ý của tác giả, giáo
sư Pierre Lantagne
3.1. Thí dụ 1
Hình 3.1:
5 3
Hai biểu thức trên cực kỳ phức tạp, Maple không thể tìm ra lời giải giải tích cũng như giải
số:
> solve({fx,fy},{x,y});
> fsolve({fx,fy},{x,y});
Ở lệnh solve không có trả lời. Còn ở lệnh fsolve, Maple trả lời bằng cách xuất ra lại câu
hỏi... Chúng ta sẽ giải quyết bằng cách dùng lệnh fsolve kèm thêm khoảng cách ly nghiệm.
Và để có khoảng cách ly nghiệm phải dùng đến đồ thị để ước lượng các điểm dừng:
Trước tiên, dùng lệnh contourplot3d để vẽ các đường đồng mức. Đây là đường nối
những điểm có dùng giá trị z = f (x, y) [2 ]. Ở đây chúng ta chọn 24 đường là đủ để thấy những
đỉnh (cực đại) và những vực (cực tiểu) của hàm. Chọn orientation=[0,180] để áp hình vẽ
xuống mặt phẳng như tờ giấy:
> C1:=contourplot3d(f(x,y),x=-3..3,y=-3.2..3.0,
contours=24,grid=[80,80]):
> display(C1,axes=normal,orientation=[-85,85]); [Hinh 3.2 (a)]
> display(C1,axes=normal,orientation=[0,180]); [Hinh 3.2 (b)]
Bây giờ chúng ta nhấp chuột phải vào hình 3.2 (a), giữ nguyên ngón tay lên và xê dịch chuột
để tìm một cách chính xác nhất tọa độ các đỉnh và các vực. Trong khi xê dịch, chúng ta có thể
quan sát kết hợp với hình 3.2 (b). Trên nguyên tắc chúng ta sẽ tìm ra 9 điểm dừng:
Mục đích của việc "dò tìm" các điểm dừng bằng đồ thị là có được các tọa độ một cách xấp
xỉ. Một khi có được, chúng ta có thể dùng fsolve để tính một cách chính xác hơn. Ba điểm
cực đại là:
> pM1:=fsolve({fx,fy},{x,y},{x=-0.1..0.1,y=1..2});
pM 1 := tx = 0.9317581960e 2, y = 1.581367963u
> pM2:=fsolve({fx,fy},{x,y},{x=1..1.5,y=-0.1..0.1});
pM 2 := tx = 1.285684697, y = 0.4847559076e 2u
> pM3:=fsolve({fx,fy},{x,y},{x=-1..0,y=-1..0});
pM 3 := tx = .4600245180, y = .6291965087u
Tương tự các điểm cực tiểu và yên ngựa (chỉ lấy mỗi thứ một điểm):
> pm1:=fsolve({fx,fy},{x,y},{x=0.1..0.5,y=-2..-1});
pm1 := tx = .2282789206, y = 1.625534957u
> ps1:=fsolve({fx,fy},{x,y},{x=1..1.3,y=0..1});
ps1 := tx = 1.098272834, y = .8544609795u
Kiểm chứng: tại các điểm dừng, gradient triệt tiêu. Ta lập một hàm để tính:
> with(linalg):
> gp:=u¡evalf(subs(u,grad(f(x,y),[x,y])),4):
> gp(pM1),gp(pM2),gp(pm1),gp(ps1);
[0.00017, 0.01225], [0.006508, 0.00005737], [0.00188, 0.01905], [0.001773, 0.002335]
Tại các điểm cực đại, ma trận hessian xác định âm, tại các điểm cực tiểu xác định dương,
và tại các điểm yên ngựa giá trị riêng đan dấu:
> gh:=u¡eigenvals(evalf(subs(u,hessian(f(x,y),[x,y])),4)):
> gh(pM1);
32.49504707, 16.27495293
56 Phạm Minh Hoàng
3.2. Thí dụ 2
> gh(pm1,gh(ps1);
17.92101729, 30.17898271
10.01781777, 11.15881777
Sau cùng, để có một cái nhìn cụ thể những điểm cực trị đã tính được, chúng ta sẽ nối những
điểm này xuống hình chiếu của nó trong mặt phẳng xOy. Công đoạn này được thực hiện qua
các thao tác sau:
Dùng lệnh contourplot để vẽ các đường cùng mức trong mặt phẳng. Do đặc tính của
hàm f (x, y), mặt phẳng này sẽ được tịnh tiến để hiển thị ở z = 8 bằng lệnh transform.
Khai báo một hàm s có tác dụng vẽ một hình cầu bán kính 0.10 tại những điểm cực trị.
Chọn cực đại màu đỏ, cực tiểu màu xanh, yên ngựa màu đen (lệnh sphere). Hàm s sẽ
nhận tham số là tọa độ điểm dừng và màu tương ứng.
Khai báo một hàm r có tác dụng vẽ một đường thẳng nối từ các điểm cực trị xuống hình
chiếu của nó (lệnh line).
Sau cùng, vẽ tất cả trong một đồ thị chung với hàm f (x, y).
> with(plottools):
> C2:=contourplot(
f(x,y),x=-3.5..3.5,y=-3.5..3.5,contours=20,grid=[40,40]):
> s:=(u,c) ¡sphere([eval(x,u),eval(y,u),f(eval(x,u),eval(y,u))],
0.10,style=patchnogrid,color=c):
> r:=u¡line([eval(x,u),eval(y,u),-8],
[eval(x,u),eval(y,u),f(eval(x,u),eval(y,u))],linestyle=3):
form > t:=transform((x,y)¡[x,y,-8]):
> display([Surface,t(C2),s(pM1,red),s(pm1,blue),s(ps1,black),r(pM1),
r(pm1),r(ps1)],orientation=[-170,65],style=wireframe,axes=framed);
3.2 Thí dụ 2
Trong thí dụ này, hệ phương trình fx1 (x, y) = fy1 (x, y) = 0 cho ra lời giải, f (x, y) có nhiều
điểm dừng và chúng ta sẽ sử dụng đồ thị sẽ cho thấy tính chất của chúng.
> restart:with(plots):
> f:=(x,y)¡xˆ4-3*xˆ2y+3y-yˆ3;
f := (x, y) ÞÑ x4 3x2 y + 3y y 3
> solve({D[1](f)(x,y),D[2](f)(x,y),x<infinity},{x,y}): [3 ]
> S:=map(allvalues,{%});
? ?
S := ttx = 0, y = 1u, tx = 0, y = 1u, tx = , y = u, tx = , y = uu
3 1 3 1
2 2 2 2
Để biết tính chất các điểm dừng, ta khảo sát hai đại lượng:
3
option s<infinity trong lệnh solve sẽ loại tất cả các nghiệm phức.
Hình 3.3: Cực trị hàm nhiều biến và hình chiếu của nó
( 2 )2
B 2f B2f
∆= 2 2
Bf 2 = B2f
Bx By B xB y và fxx
B x2
Để làm điều này, ta khai báo ha hàm:
> Delta:=(x,y)¡D[1,1](f)(x,y)*D[2,2](f)(x,y)-D[1,2](f)(x,y)ˆ2;
∆ := (x, y) ÞÑ ¡ D1,1 (f )(x, y)D2,2 (f )(x, y) D1,2 (f )(x, y)2
> u:=i¡(eval(x,S[i]),eval(y,S[i]));
> seq([u(i)],i=1..4);
? ?
[0, 1], [0, 1], [
3 1 3 1
, ], [ , ]
(?2 2
(?
2 2
) )
Thí dụ tại điểm dừng C
3 1
, ,f
3 1
, =
13 2 là:
, giá trị của ∆ và fxx
2 2 2 2 16
> Delta(u(1)),D[1,1](f)(u(1));
45, 6
Để dễ nhìn ta đặt kết qu vào một bảng:
Điểm / tọa độ ∆ fxx2 Kết luận
A(0, 1, 2) 36 6 cực đại
B(0,?1, 2) 36 6 cực tiểu
( )
45 6 yên ngựa
3 1 13
C , ,
( 2? 2 16 )
D
3 1 13
, , 45 6 yên ngựa
2 2 16
Với những gì tính toán, ta có tể kết luận ngya về tính chất các điểm dừng. Nhưng với đồ thị
3 chiều, Maple cung cấp thêm cho người sử dụng một công cụ thực sự tượng hình.
Trước tiên ta vẽ đồ thị hàm f (x, y):
> alias(TK3='thickness=3',AW='axes=framed,style=wireframe'):
> Surface:=plot3d([x,y,f(x,y)],x=-1.5..1.5,y=-1.5..1.5):
Tiếp theo, vẽ các điểm dừng bằng lệnh pointplot3d, nhưng trước đó phải khai báo những
Điểm A(0, 1, 2) cực đại địa phưng theo phương của đường cong màu navy và đường
magenta.
Tách rời các đường và mặt f (x, y) sẽ thấy rõ hơn bản chất của các điểm dừng:
B(0, 1, 2) cực tiểu địa phưng theo phương của đường cong màu green và đường ma-
genta.
> display({CA,CB,CX,Points},axes=frame,orientation=[131,60]);
[ ? ]
Tương tự, bây giờ chúng ta quan sát những điểm yên ngựa: 3 1 13
, ,
2 2 16
> CC:=spacecurve([sqrt(3)/2,y,f(-sqrt(3)/2,y)],
y=-1.5..1.5,color=navy,TK3):
> CD:=spacecurve([sqrt(3)/2,y,f(-sqrt(3)/2,y)],
y=-1.5..1.5,color=green,TK3):
> CX:=spacecurve([x,0.5,f(x,0.5)],x=-1.5..1.5,color=magenta,TK3):
> display({Surface,Points,CA,CB,CX},AW,orientation=[130,60]);
[? ]
3 1 13
C , , cực đại địa phưng theo phương của đường cong màu green và cực tiểu địa
2 2 16
phưng theo phương của đường magenta.
[ ? ]
D
3 1 13
, , cực đại địa phưng theo phương của đường cong màu navy và cực tiểu
2 2 16
địa phưng theo phương của đường magenta.
Đó chính là tính chất của điểm yên ngựa, và ta còn thấy rõ hơn với hình 3.6 (b)
> display({Points,CC,CD,CX},axes=frame,orientation=[125,80]);
3.3 Thí dụ 3
Trong bài này, sau khi tìm các cực trị bằng phương pháp số, chúng ta sẽ dùng phương pháp
đường dốc nhất (steepest descent[4 ]) để kiểm chứng.
`
Nhắc lại: gradient ( ) tại một điểm là véc-tơ chỉ ra phương theo đó hàm số có sự thay
đổi lớn nhất (hoặc nhỏ nhất). Chúng ta sẽ dùng véc-tơ này để đi tìm cực đại (hoặc cực tiểu của
một hàm số). Nếu cho hàm g(x, y), gọi P (xk , yk ) là một điểm bất kỳ, ta cho P di chuyển theo
phương gradient để đến P (xk+1 , yk+1 ). Nếu điểm này là mọt cực trị, thì gradient tại đây triệt
tiêu. Và để biết giá trị này, ta sẽ tính chuẩn 2, nếu nhỏ hơn một giá trị e nhỏ, thì coi như là tìm
ra kết quả:
`
Nếu } Pk }2 ¡ e, tính Pk+1 = Pk + λ ` Pk
4
Xin xem môn tối ưu hóa hàm nhiều biến bằng phương pháp số.
`
Nếu } Pk }2 e, ngừng thật toán.
(3.3.1)
Trước tiên chúng ta khởi dọng lại bài và nhập các thư mục cần thiết. Một lưu ý là trong thí
dụ này chúng ta khai báo hàm g(x, y) dưới dạng mệnh đề, các thao tác cũng phải thay đổi theo.
> restart:with(plots):with(linalg):
> g := x*exp(-(x-1)ˆ2-(y+1/4)ˆ2)+y*exp(-xˆ2-yˆ2)+3
> Surf:=plot3d([x, y, g],x=-2..3.5,y= -2.5..2, grid=[30,30],
labels=[x,y,z],axes=framed,tickmarks=[3,3,3]):
> display(Surf):
Vẽ các đường đồng mức và véc-tơ gradient chung trong một đồ thị để thấy một tính chất
quan trọng là véc-tơ gradient tại một điểm luôn thẳng góc với đường đồng mức đi qua điểm đó:
> CDT:=contourplot(g,x=-2..4,y=-2.5..3,contours=20,grid=[40,40]):
> GPL:=gradplot(g,x=-2..4,y=-2.5..3,grid=[15,15],thickness=3):
> display([CDT,GPL]);
> display({CDT,GPL,Surf},axes=frame,orientation=[125,80])
Quan sát hình 3.7 ta có thể đoán được hàm số cực đại trong khoảng (1.4,-0.3) và cực tiểu
trong khoảng (-0.2,-0.7). Ta dùng các kết quả này để tìm tọa độ cực trị bằng phương pháp số
(vì không có lời giải giải tích):
> gx:=diff(g,x):gy:=diff(g,y):
> xy max:=fsolve({gx,gy},{x,y},{x=0..1.4,y=-.3..0});
xy maxtx = 1.391235485, y = 0.1961444222u (3.3.2)
Hình 3.7: Đồ thị gradient, đường đồng mức và chuyển động của Pk
> gradient:=(a,b)¡subs(x=a,y=b,[gx,gy]):
> v:=[-2,.5]:w:=v:
> for i from 1 to 1000 do
p:=evalf(gradient(v[1],v[2])):
if norm(p,2)<10ˆ(-7) then break (3.3.3)
else v:=v+.3*p:
fi:
w:=w,v;
od:
Theo thuật toán (3.3) thì P0 = [2, 0.5] là điểm khởi đầu. λ = 0.3, e = 107 , số vòng lặp
tối đa 1000. Những dữ kiện này đều có thể thay đổi bất cứ lúc nào [5 ].
Kết quả là biến w, dãy các tọa độ của Pk . Ta có thể kiểm chứng so với (3.2):
> w[-1];
[1.391235479, .1961444047]
Hoặc hiển thị chuyển động của Pk trong mặt phẳng dưới dạng tĩnh hoặc động để thấy chuyển
động rất nhanh quanh điểm cực đại:
> pointplot([w],color=black,symbolsize=25);[Hình 3.7 (b)]]
> seq(poinplot([seq(w[n],n=1..k)]),k=1..nops([w]));
> display(%,insequence=true); (không hiển thị)
> f:=unapply(g,x,y);
> st:=pointplot3d([seq([w[i,1],w[i,2],
evalf(f(w[i,1],w[i,2]))],i=1..nops([w]))],connect=true,
thickness=3,axes=boxed,color=red,orientation=[-160,60]);
> display(%); [Hình 3.8 (a)]
5
Dĩ nhiên cách hay nhất vẫn là viết một chương trình con
3.4 Thí dụ 4
Trong bài này, chúng ta sẽ dùng phương pháp nhân tử Lagrange để tối ưu hóa một hàm hai
biến sau đó biểu diễn phương pháp này dưới dạng hình học.
Bài toán của chúng ta như sau:
Không thể dùng phương pháp tách biến vì biểu thức phi tuyến của f (x, y). Lệnh Maple
sau cho ta 2 trang kết quả cực kỳ phức tạp:
> solve(f(x,y),x);
Vì thế Lagrange là phương pháp giải tích độc nhất để giải bài toán này.
Ràng buộc g(x, y) = 0 có đồ thị là một ellips; điều này có nghĩa là phải đi tìm các cực trị
của f khi (x, y) chạy trên ellips g(x, y). Để thấy rõ ý nghĩa hình học của bài toán, chúng
ta vẽ đồ thị g(x, y) dưới dạng tham số.
( )2 ( )2
xh xk
Nhắc lại, ellips phương trình + = 1 có phương trình tham số:
a b
"
x = a cos(t) + h
y = b sin(t) + k
Trong các lệnh dưới đây, Surf,El 2 là đồ thị f (x, y) và hình chiếu g(x, y) trong mặt phẳng
xOy, El 3 là hình chiếu g(x, y) lên đồ thị f (x, y), L là 18 đường thẳng nối giữa El 2 và El 3:
> Surf:=plot3d([x,y,f(x,y)],x=-5..12,y=-5..12):
> El 2:=spacecurve([2*cos(t)+9,3*sin(t)+7,0],t=0..2*Pi);
> El 3:=spacecurve([2*cos(t)+9,3*sin(t)+7,f(2*cos(t)+9,3*sin(t)+7)],
t=0..2*Pi,color=navy,thickness=2):
> n:=18:
> L:=seq(spacecurve([[2*cos(k*Pi/n)+9,3*sin(k*Pi/n)+7,0],
[2*cos(k*Pi/n)+9,3*sin(k*Pi/n)+7,f(2*cos(k*Pi/n)+9,3*sin(k*Pi/n)+7)]],
color=navy),k=0..2*n):
> display(
Surf,El 2,El 3,L,axes=framed,style=patchnogrid,orientation=[22,76]);
Hình 3.9 (a).
Dưới dạng đồng mức:
> display(
Surf,El 2,El 3,L,axes=framed,style=contour,contours=18,orientation=[-
171,70]);
Hình 3.9 (b).
Đường biểu diễn trong mặt phẳng:
> Contours 2d:=contourplot(f(x,y),x=-5..12,y=-5..12,filled=true,
contours=18,coloring=[white,navy]);
> El 2d:=plot([2*cos(t)+9,3*sin(t)+7,t=0..2*Pi],color=green);
> display(Contours 2d,El 2d,tickmarks=[3,3]); [Hình 3.10 (a)].
Quan sát hình 3.9 (b) và 3.10 (a), chúng ta thấy ở điểm f đạt cực trị khi các đường đồng
mức tiếp xúc với ellips của ràng buộc. Điều này có nghĩa là f và g cùng tếp tuyến. Mặt khác
chúng ta cũng biết, gradient tại một điểm luôn thẳng góc với đường đồng mức, có nghĩa là véc-tơ
gradient của f và g tại mỗi tiếp điểm sẽ cùng phươnbg. Nói khác đi, ở các điểm cực trị ta có:
` `
f (x, y) = λ g(x, y)
Hình 3.9: Biểu diễn tham số của hàm ràng buộc g(x, y) trên f (x, y)
`
F (x, y) = 0 với F (x, y) = f (x, y) = λg(x, y)
Dấu của λ không quan trọng, để tiện lợi ta chọn F (x, y) = f (x, y) + λg(x, y).
> F:=(x,y)¡f(x,y)+lambda*g(x,y);
`
Các điểm cực trị thỏa F (x, y) = 0:
> grF:=grad(F(x,y),[x,y]);
grF := [3x3 + y + λ( ), x + 6y 2 + λ( 149 )]
x 9 2y
2 2 9
> EnvExplicit:=true;[7 ].
> Sol:={solve({grF[1],grF[2],f(x,y),g(x,y)},{x,y,lambda})};[8 ]
> s:=map(evalf,Sol); (3.4.1)
> nops(s);
6
`
Hệ F (x, y) = 0 có tất cả 6 nghiệm trong đó chỉ có hai nghiệm thực. Ta loại nghiệm phức
và chỉ lấy 4 số lẻ. Tọa độ của hai điểm cực trị là:
> sr:=remove(has,s,I);
> [eval(x,sr[1]),eval(y,sr[1])]: P:=map(evalf[4],%);
> [eval(x,sr[1]),eval(y,sr[1])]: P:=map(evalf[4],%);
P := [7.697, 4.724], Q := [9.615, 9.855] (3.4.2)
Có được hai điểm cực trị, ta có thể vẽ đường đòng mức tiếp xúc với g(x, y)
> [eval(x,sr[2]),eval(y,sr[2])]: Q:=map(evalf[4],%);
> C 2d:=contourplot(f(x,y),x=0..15,y=0..15,
contours[f(P[1],P[2]),f(Q[1],Q[2])],thickness=3);
7
Options EnvExplicit dùng để xuất tất cả các lời giải dưới dạng tường minh. Ở đây nếu không bằng
true lời giải sẽ thiếu
8
Hai dấu ngoặc nhọn ngoài cùng rất quan trọng, nó tránh sự lặp lại của các nghiệm
Để kiểm chứng tính chất hình học của véc-tơ gradient, ta sẽ chung với các tiếp tuyến tại P
và Q. Tiếp tuyến tại điểm A(xA , yA ) của một hàm ẩn u(x, y) là:
Bu (x , y )
B
y yA = x
Bu (x , y ) (x xA)
A A
By A A
> tg:=(a,b,u)¡y-b=-D[1](u)(a,b)/D[2](u)(a,b)*(x-a);
Đồ thị tiếp tuyến tại P của f (x, y) và tiếp tuyến tại Q của g(x, y):
> t1:=implicitplot(tg(P[1],P[2],f),x=0..12,y=0..10):
> t2:=implicitplot(tg(Q[1],Q[2],g),x=0..15,y=0..15):
Và cuối cùng, ta vẽ tất cả chung trong một đồ thị:
> display(C 2d,El 2d,Point P,Point Q,VGrad2,t1,t2,
scaling=constrained,tickmarks=[3,3]);[Hình 3.10 (b)]
Các trị số cực đại (Q) và cực tiều (P ) của f (x, y) trên g(x, y) là:
> map(evalf[7],[f(P[1],P[2]),f(Q[1],Q[2])]);
[703.2035, 2897.901]
Lưu ý quan trọng: lệnh solve trong (3.4) cho thứ tự các nghiệm rất ngẫu nhiên, vì thế
chúng ta có thể thu được tọa đọ P, Q ngược với kết quả ở (3.5). Trong trường hợp đó cần thiết
phải sắp xếp lại các tọa độ tại các câu lệnh (3.6) và (3.7) để có cùng một đồ thị như hình 3.10
(b).
Hình 3.10: (a) Đường đồng mức và ellips 2D, (b) Véc-tơ gradient tại điểm cực trị
của một cấp số nhân. Tập 9 có 36 mệnh đề chẵn đều có dạng như Euclide đã tìm ra.
nhưng nổi bật nhất vẫn là mệnh đề số 36 vì ở Ngoài ra, ông còn dùng Toán để nghiên
mệnh đề này ông chứng tỏ rằng một số có dạng cứu Thiên văn, kết quả này được trình bày
2n1 (2n 1) là số hoàn hảo[9 ] nếu như (2n 1) trong Phaenomena. Euclide cũng có những
là số nguyên tố. nghiên cứu về Quang học, và cả về âm nhạc
Ngày nay người ta biết được rằng số hoàn nhưng đã bị thất lạc.
hảo là số chẵn có dạng như Euclide đã tìm ra. Những tác phẩm của Euclide rất cơ bản, có
Còn số hoàn hảo nào là số lẻ không thì đến nay giá trị không phải chỉ vì nội dung khoa học mà
vẫn chưa ai tìm ra. Ngay nhà Toán học vĩ đại còn giá trị với hậu thế vì phương pháp nghiên
của thế kỷ 18 (và có lẽ của mọi thế kỷ) là Eu- cứu nữa.
ler cũng chỉ chứng minh rằng mọi số hoàn hảo
9
Số hoàn hảo là số bằng tổng các ước số của nó. Thí dụ 28 = 1+2+4+7+14
Ở cấp trung học, hình học thuần túy đòi hỏi học sinh trí tưởng tượng và óc nhạy bén để
"đoán ra" lời giải trước khi đi tìm chứng minh. Điều này chỉ có thể làm được nếu bài toán đơn
giản. Trên đại học (thậm chí ở các năm cuối trung học), hình học giải tích đưa tất cả về các
phương trình trước khi lý luận. Việc này hệ thống hóa vấn đề đồng thời cho phép giải quyết
những bài toán cực kỳ phức tạp mà không cần phải tưởng tượng như trước. Lấy một thí dụ đơn
giản là bài toán quỹ tích, một môn học "khó nuốt" nhất. Hình học giải tích giúp ta tìm ra tọa độ
của điểm muốn tìm. Một khi biết được tọa đô, xác định và vẽ quỹ tích rất đơn giản: Đường biểu
diễn tham số.
Maple là một công cụ hầu như lý tưởng để giải các vấn đề nêu trên. Mặt khác, nến nắm
vững các nguyên tắc tạo hình động, các bài toán quỹ tích sẽ đem đến cho chúng ta rất nhiều lý
thú qua khía cạnh sinh động của lời giải.[1 ]
Trước tiên, chúng ta bắt đầu với một thí dụ đơn giản.
1
Xin xem trước phần Xử lý hình động của chương 12, trang 219
Chương 4. Hình học giải tích
u := (a, b, e) Ñ
ea
a+b
.y
.K
.X .B
.
A
. .H
.J
Hình 4.1:
Đường tiếp tuyến chéo (P ) cắt trục hoành tại X(x, 0) có phương trình: y = kx ku(a, b, e).
Ta dùng lệnh line trong gói geometry để định nghĩa (P ):
> with(geometry):line(P,y=k*x-k*u(a,b,e);[x,y]):
Khoảng cách từ A(0, 0) đến (P ) bằng bán kính a. Giải phương trình P A = a ta sẽ tìm được
k:
> point(A,0,0):distance(A,P)=a;
?
ea 1
k =a
b + a k2 + 1 (4.1.1)
> vk:=solve(%,k);
Maple không giải được, lý do là trong biểu thức (4.1), k nằm trong trị tuyệt đối và trong
căn. Để đưa k ra ngoài giá trị tuyệt đối, ta giả sử k ¡ 0:
> assume(k>0):
Lệnh solve sẽ cho ra hai lời giải tương ứng với hai tiếp tuyến chéo. Ở đây ta chọn nghiệm
dương. Và khi mọi biến đều hình thức, cách duy nhất là dùng sign.
> vk:=solve(%%,k): op(select(i¡sign(i)>0,[%]));
d
ea 2
a
a2 +
b + a ea 2
a2
b + a
Biểu thức trên tính hệ số k theo a, b, e ta gán vào một hàm số:
> p1:=unapply(%,(a,b,e)):
Áp dụng: Đặt a = 10, b = 7, e = 30 ta được:
Phương trình tiếp tuyến và hoành độ của K:
> et:=simplify(p1(10,7,30)*x-p1(10,7,30)*u(10,7,30));
17 ? 300 ?
et := 611x + 611
611 611
> solve(et):5=evalf(%,4);
300
xK := = 17.65
17
.y
.A
.(C2 )
.O . .C ..D .x
.U
.(C1 ) .B
Hình 4.2:
Diện tích muốn tìm bằng hai lần tổng diện tích của CU A và U DA.
Diện tích của CU A bằng tích phần hàm số của (C2 ) từ C đến U .
Diện tích của U DA bằng tích phân hàm số của (C1 ) từ U đến D.
?
> s1:=sqrt(rhs(isolate(p,yˆ2)));s2:=sqrt(rhs(isolate(q,yˆ2)));
"
s1 := ?R2 x2
s2 := r2 x2 + 2xR R2
Và diện tích của phần giao là: (hãy kiên nhẫn!)
> 2*(int(s2,x=R-r..u)+int(s1,x=u..R)):
Kết quả không in ra đây vì quá phức tạp và vì Maple không tìm ra được giới hạn của biểu
thức sau (xem ra rất đơn giản!):
r2 (4R2 r2 ) )
c
(
lim(rÑ2R) arctan R2
4R r2
2
Chúng ta lưu ý rằng khi r = 2R đại lượng trên có dạng vô định, và phần giao chính là (C1 ).
Điều này dĩ nhiên phải loại trừ. Bây giờ ta giả sử r 2R:
> assume(r<2*R):S:=2*(int(s2,x=R-r..u)+int(s1,x=u..R));
Kết quả của S là một biểu thức khổng lò nên không tiện in ra đây. Mặt khác đi tìm lời giải
r = f (R) với một biểu thức phức tạp như thế này thì chắc chắn Maple phải đầu hàng. Ta phải
giúp một tay bằng cách đặt r = kR(k P R ):
> S:=subs(r=k*R,%);
( c c )
S := k R %1 4 arcsin(
1 2 1 1 2 2 1
k R)R + 2kR π
2 k 2 R2 k 2 R2
( ? 2 2 2
4
(
? 2 1 R (k R 2R2 )
))
2R R π + %1k R 2%1R + 4R arcsin
1 4 2 2 2 3
4R 2 R
k2(4R2 + k2R2)
a
%=
Biểu thức trên thoạt trông cũng "kinh dị" không kém. Nhưng quả thực là nó đã đơn giản đi
rất nhiều vì đã mất biến r. Bằng chứng:
> S:=simplify(%,sqrt,symbolic);
( )
? 2
S := R 2k arcsin( k) + k π + π k 4 k + 2 arcsin(1 + k )
1 2 2 1 2 1 2
2 2 2
Vì diện tích phần giao phải bằng nửa diện tích của (C1 ) nên ta cũng đi tìm lời giải của k
trong phương trình S = πR2 ( vì R 0 ta đơn giản cho R2 ):
1
2
> simplify((S-Pi*Rˆ2/2/Rˆ2));
2 ?
2k2 arcsin( 12 k) + 12 π 12 k 4 k2 + arcsin(1 + 21 k2)
Và cuối cùng ta được:
> fsolve(%,k);
1.158728473
Chúng ta vừa giải một bài toán có ý nghĩa cụ thể như sau:
∼∼∼∼∼∼∼∼∼
Một người nông dân có một cánh đồng cỏ hình tròn bán kính R = 100 mét.
Ông ta cột một con bò vào một cái cọc cắm trên mép đồng. Hãy tính chiều 2
[]
dài đoạn dây sao cho con bò chỉ có thể ăn được đúng một nửa cánh đồng.
Câu trả lời (gần đúng) là 115.87 mét.
2
Chủ đề trích từ [7]
Hình 4.3:
> display(%,insequence=true,scaling=constrained);
Quỹ tích của M được gọi là lá Descartes. Chiếc lá thứ hai tương đương với nhánh hyperbol
thứ hai và khi a P [2π; 0].
B B
2π
»
Viết phương trình 2 đường phân giác của tam giác ABM và tìm giao điểm C của hai phân
giác này.
Nhắc lại: Phương trình chính tắc của đường thẳng có dạng ax + by + c = 0, và phương
trình đường phân giác của hai đường thẳng chính tắc là:
a1 x + b1 y + c1 a2 x + b2 y + c2
a + a =0
a21 + b21 a22 + b22
.y
.M1
.C1
.A . .B .x
.C2
.M2
Hình 4.4:
Khai báo hàm có tên bs áp dụng công thức trên (hàm sẽ nhận 6 tham số):
> bs:=(a1,b1,c1,a2,b2,c2)¡
(a1*x+b1*y+c1)/sqrt(a1ˆ2+b1ˆ2)+(a2*x+b2*y+c2)/sqrt(a2ˆ2+b2ˆ2)=0:
Khai báo A, B, M . Vì vòng tròn bán kính 1 nên M có tọa độ [cos(u), sin(u)]:
> with(plots):with(geometry):
> point(A,0,0):point(B,1,0): point(M,cos(u),sin(u)):
Để khai báo phương trình các đường thẳng AB, BM, AM , ta dùng các hàm trong gói ge-
ometry và trước tiên phải ấp đặt điều kiện cho u. Đây là môt trong vô số các trở ngại của gói
này mà chúng ta sẽ đề cập ở các phần tới:
> assume(-cos(u)<>0,sin(u)<>0):
> EnvHorizontalName:= x: EnvVerticalName:=y:
> line(AM,[A,M]):pAM:=unapply((Equation(AM)),u);
pAM := u ÞÑ x sin(u) + y cos(u) = 0[3 ]
> line(BM,[B,M]:pBM:=unapply((Equation(BM)),u);
pBM := u ÞÑ x sin(u) + y(1 + cos(u)) + sin(u) = 0
{
Đường phân giác của AM B - ta gán phương trình vào hàm f1 :
> bs(-sin(u),cos(u),0,-sin(u),cos(u)-1,sin(u));
x sin(u) + y cos(u) + x sin (u) + y(1 + cos(u)) + sin(u)
= 0[4 ]
(sin(u))2 + (1 + cos(u))2
a a
2
(sin(u)) + (cos(u))2
> f1:=unapply(%,u):
{
Đường phân giác của AM B - ta gán phương trình vào hàm f2 :
> simplify(bs(0,1,0,-sin(u),cos(u),0),symoblic);
y x sin(u) + y cos(u) = 0
3
4
a
Để dễ xem, ta bỏ dấu sau biến u bằng cách chỉnh Options/Assume Variable/No Annotation
Maple không tự động đơn giản sin(u)2 + cos(u)2 , và chúng ta cũng không nên đơn giản vì kết quả còn phức
tạp hơn
> f2:=unapply(%,u):
4π
Đồ thị của tam giác và hai phân giác tương ứng với u = [hình 4.5 (a)]
15
> implicitplot({f1(4*Pi/15),f2(4*Pi/15),pAM(4*Pi/15),pBM(4*Pi/15)},
x=0..1,y=0..1);
Để tìm quỹ tích của C có thể giải phương trình f1 (u), f2 (u) theo y rồi sau đó tìm x.
> solve(f1(u)=f2(u),y);
> vX:=simplify(solve(subs(y=%,f2(u)),x),symbolic):
> vY:=simplify(solve(subs(x=%,f2(u)),y),symbolic):
Tuy nhiên chúng ta có thể giải hệ phương trình f1 (u), f2 (u) để tìm (x, y) cùng một lúc.
Trong trường hợp này đừng quên dấu ngoặc nhọn ở lệnh solve[5 ]
> s:=solve({f1(u)=f2(u)},{x,y});
" *
1 + cos(u) sin(u)
s := x = ,y =
2 2 cos(u) + 2 2 2 cos(u) + 2
a a
Sau cùng, trích ra các giá trị của x, y và vẽ quỹ tích bằng đường tham số:
> X:=eval(x,s):Y:=eval(y,s):
> plot([X,Y,u=0..2*Pi]);
Và để tạo hình động:
> tr:=u¡implicitplot({f1(u),f2(u),pAM(u),pBM(u),xˆ2+yˆ2=1},
x=-1..1,y=-1..1):
> qt:=i¡plot([X,Y,u=0..i],color=red):
> s:=seq(display([tr(i/5),qt(i/5)]),i=0.01..evalf(10*Pi)):
> display(%,insequence=true,scaling=constrained);
> display([tr(7*Pi/5),qt(7*Pi/5)],scaling=constrained);[Hình 4.5 (c)]
Quan sát chuyển động (trên màn hình) ta có những nhận xét sau:
1. Các đường phân giác không chỉ nằm trong tam giác mà còn kéo dài ra ngoài, điều này làm
ta "rối mắt" khi hình chuyển động. Đây là "cái giá phải trả" khi ta dùng implicitplot
để đơn giản cách vẽ đồ thị hình 4:5(b). Để xử lý ta phải tách y ra khỏi biểu thức của
f 1, f 2, gán kết quả vào một hàm và dùng plot để vẽ đường thẳng kiểu polygonal.
2. Các lệnh line, Equation rất tiện lợi để tính phương trình của các đường thẳng, nhưng Maple
bắt buộc phải đặt các điều kiện ban đầu cho góc u(bằng assume). Việc này tạo ra một trở
ngại vô cùng lớn là các thao tác trên u bị giới hạn, đặc biệt là ta không thể dùng u trong
các lệnh piecewise
3. f1 (u) không xác định khi u = 0. Để tránh trị này cách hay nhất là dùng piecewise.
Điều này không được vì lý do 2. Ta bắt buộc phải khởi động từ một góc u 0. Đó là lý
do của giá trị 0.01 trong biểu thức của s.
5
Tùy vào phiên bản của Maple, thao tác này đôi khi đòi hỏi thêm lệnh allvalues để có dạng tường minh.
Hình 4.5:
.y
.M1
.M2
.H1
. .B .x
.A
.H2
Hình 4.6:
$
' 1 + cos u "
!
cos u
& cos u
M Q 2 H u
sin u ' 1 + cos u u cos u tan( )
% tan( ) 2
2 2
Gọi cm,ch,cq lần lượt là các hàm tọa độ của M, H, Q theo u (góc M AB):
> cm:=u¡[cos(u),sin(u)]:
> cq:=u¡[(1+cos(u))/2,(1+cos(u))/2*tan(u/2)]:
> ch:=u¡[cos(u),cos(u)*tan(u/2)]:
[ ABM], hình tròn bằng nét liền. Các đường cao bằng nét đứt
Để dễ nhìn, ta vẽ tam giác
đoạn. Ta đã biết rằng khi u P ,
π π
thì H ở ngoài tam giác, khi ấy ta phải vẽ một cách khác.
2 2
Gọi CR là hình tròn, tg(u) là hàm đồ thị của tam giác ABC (đường liền) f1 (u), f2 (u) là hàm
đồ thị các đường cao (các đường đứt đoạn) khi H nằm trong và ngoài tam giác ABC:
> CR:=[cos(k),sin(k),k=0..2*Pi]:
> tg:=u¡plot([[[1,0],cm(u),[0,0]],CR]):
> f1:=u¡plot([[1,0],ch(u),cm(u),cq(u),[0,0]],linestyle=4):
> f2:=u¡plot([[1,0],ch(u),cm(u),cq(u)],linestyle=4):
Sau cùng ta dùng lệnh textplot để xuất các chữ trên đồ thị. Ta khai báo dưới dạng hàm
với biến là tọa độ của chữ và chữ muốn xuất (dĩ nhiên trừ A và B là hai điểm cố định):
> with(plottools):
> tt:=(x,y,a) ¡textplot([x/10,y/10,a],font=[HELVETICA,BOLD,10]):
> tA:=textplot([-0.6,.06,"A"],font=[HELVETICA,BOLD,10]):
> tB:=textplot([1.05,.06,"B"],font=[HELVETICA,BOLD,10]):
Với những khai báo trên ta có thể vẽ 4 trường hợp tương ứng với 4 vị trí của M trong 4 phần
tư hình tròn. Nhưng ở đây ta gộp chung lại thành 2. Trường hợp đầu, [Hình 4.7 (a)], u P [0, π]
và trường hợp 2, [Hình 4.7 (b)] u P [π, 2π].
> gr1:=display([tg(Pi/4),f1(Pi/4),tB,tt(7,8.5,M),
tt(6.3,3.6,H),tt(9,4,Q)]):
> gr2:=display([f2(23*Pi/34),tg(23*Pi/34),tA,tB,tt(-5,9.5,M),
tt(-6,-9,H),tt(3,5.3,Q)]):
> gr3:=display([f2(21*Pi/16),tg(21*Pi/16),tA,tB,tt(-6.2,10.5,H),
tt(-6.5,-8.5,M),tt(3,-5,Q)]):
> gr4:=display([f1(5*Pi/3),tg(5*Pi/3),tB,tt(4.5,-3.5,H),
tt(6.5,-8.5,M),tt(8,-4.5,Q)]):
> display(gr1,gr2); [Hình 4.7 (a)]
> display(gr3,gr4); [Hình 4.7 (b)]
Hình 4.7: (a), (b) Vị trí tương đối của H; (c) Quỹ tích H
Quỹ tích của H [Hình 4.7 (c): cách đơn giản nhất là đường tham số:
> gs:=plot([op(ch(x)).,x=0..2*Pi],-1..1,-2..2,color=black):
> display(gs,tg(0),scaling=constrained,tickmarks=[2,2]);
[Hình 4.7 (c)]: Cho thấy trong quỹ tích của H còn có cả đường thẳng x = 1[6 ]. Đường
thẳng này là quỹ tích khi u = π. Mặt khác trong lệnh trên ta dùng hàm tg với tham số là 0 đơn
thuần là vì không muốn vẽ tam giác ABM .
Bây giờ ta sẽ vẽ các hình tam giác ABM và quỹ tích của H chung trong một đồ thị. Để
làm việc này, trước tiên ta cần khai báo một hàm f (u) để phân biệt hai trường hợp u P [0, ] Y
π
2
[ , 2pi] và u P [π, 2π]. Trong trường hợp thứ nhất (cos(u) ¡ 0, H nằm trong tam giác ABM )
3π
2
ta chọn hàm f1 (u), ngược lại ta chọn f2 (u), lúc đó H nằm ngoài ABM :
> f:=u¡piecewise(cos(u)>0,f1(u),f2(u)):
Tiếp theo, ta khai báo một hàm gr với hai tham số t1 , t2 dùng để vẽ quỹ tích của H khi u
thay đổi trong khoảng hai tham số này. Sau đó nhập hai giá trị của t1 , t2 để vẽ đồ thị.
> gr:=(t1,t2)¡plot([op(ch(u)),u=t1..t2],x=-1..1.1,-1.5..1.5):
> s1:=seq([gr(0,t),f(t),tg(t)],t=[Pi/5,Pi/3,3*Pi/7]):
> display(s1,scaling=constrained,view=[0..1,0..1]); [Hình 4.8 (a)]
> s2:=seq([gr(Pi,t),f(t),tg(t)],t=[4*Pi/3,10*Pi/7]):
> display(s2,scaling=constrained,view=[-1..1,-1..1]); [Hình 4.8 (b)]
Và sau cùng là hình động. Ta dùng lại các hàm gr,f , và tg. Chúng ta sẽ khai báo một
dãy của 3 hàm trên theo u/10. Chia cho 10 có nghĩa là giảm vận tốc hiển thị 10 lần để có thể
quan sát được. Tuy nhiên, quan trọng nhất là chúng ta phải xác định được giá trị của u (hay M ),
vì khi |u| tiến đến gần π, H sẽ có những trị số rất lớn, ta phải tránh những giá trị lân cận này.
Mặt khác, vận tốc di chuyển của H cũng khác nhau tùy theo giá trị của u. Càng gần đến π vận
tốc của H càng nhanh. Tóm lại, với tất cả những trở ngại nêu trên, chúng ta bắt buộc phải khai
báo các giá trị của u một cách "thủ công":
], hay [0 Ñ 2.24]
5π
- M sẽ cahỵ đều trong khoảng [0,
7
6
Đường x = 1 có thể được vẽ bằng lệnh plot([-1,t,t=-1..0],color=black):
?
> K:=coordinates(center(k));simplify(radius(k),symbolic);
K := [n, m]; m 2
?
> H:=coordinates(center(h));simplify(adius(h),symbolic);
H := [n, m]; n 2
Tọa độ hai giao điểm của hai vòng tròn:
> s:=solve({p1(m,n),p2(m,n)},{x,y});
m3 + m2 n n 2 m n 3
" *
s := ty = m + n, x = 0u, y =
(m + n)mn
,x = 2
m2 + n 2 m2 + n 2
ÝÝÑ
Dùng op,select,has để tách ra tọa độ của P, Q. Gọi v1 = HP , v2 = KP
ÝÝÑ
> v1:=vector([K[1]-rhs(op(select(has,s[2],x))),
K[2]-rhs(op(select(has,s[2],y)))]);
> v2:=vector([H[1]-rhs(op(select(has,s[2],x))),
H[2]-rhs(op(select(has,s[2],y)))]);
> linalg[dotprod](v1,v2);
0
.P
.K. .H
.A .F
.C .B
.Q .(p2)
.(p1)
> solve({KH,p1(m,n)},{x,y});
"
y = %1, x =
m%1 + n%1 m2 n2
*
m+n
%1 = RootOf ((m + n ) Z 2 + (2m2 n 2n3 ) Z m4 + n4 2m3 n)
2 2
Dùng allvalues để hiển thị dưới dạng tường minh, chúng ta sẽ thu được hai nghiệm khá
phức tạp. Chọn ngẫu nhiên nghiệm thứ nhất và gán vào tọa độ của A, B:
> s1:=allvalues(%);
( )
#
12 mm2 +%1n2 + 12 mn2 %+1n2 m2 n2 +
x=
1 %1
,y =
m+n 2 m2 + n 2
?
%1 = (2m2 n + 2n3 + 2 2m4 n2 + m2 n4 + m6 + 2m5 n + 2n3 m3 )
Tọa độ của A, B là:
> Ax:=rhs(op(select(has,s1[1],x))):
> Ay:=rhs(op(select(has,s1[1],y))):
> Bx:=rhs(op(select(has,s1[2],x))):
> By:=rhs(op(select(has,s1[2],y))):
Khai báo hai điểm bằng lệnh point:
> point(A,Ax,Ay);point(B,Bx,By);
Tương đương với vòng tròn p2 ta cũng có hai điểm C, F :
> solve({KH,p2(m,n)},{x,y});
> s2:=allvalues(%);
> Cx:=rhs(op(select(has,s2[1],x))):
> Cy:=rhs(op(select(has,s2[1],y))):
> Fx:=rhs(op(select(has,s2[2],x))):
> Fy:=rhs(op(select(has,s2[1],y))):
.P
.K . .H
.A .F
.C .B
.Q .(p2)
.(p1)
Hình 4.10:
> point(C,Cx,Cy):point(F,Fx,Fy):
> implicitplot({subs(m=3,n=2,KH),p1(3,2),p2(3,2)},
x=-3..10,y=-6..6.5,scaling=constrained ); [Hình 4.9 (b)]
Để xem (A, C, B, F ) có là hàng điểm điều hòa hay không ta chỉ cần nhập:
> AreHarmonic(A,C,B,F);
geometry/smagnitude :"cannot determine the sign of FAIL"
Maple chẳng những không xác định được câu hỏi là hàng điểm có điều hòa hay không mà
nó cũng "chẳng biết tại sao mình không biết". Đến nước này thì chúng ta chỉ còn cách tự giải
quyết bằng cách tính qua biểu thức (4.2). Trước tiên ta phải tính các khoảng cách:
> BF:=distance(B,F):BC:=distance(B,C):
> AF:=distance(A,F):AC:=distance(A,C):
?
> simplify(BF*AC-BC*AF,sybolic);
?
(4mn 4 n2 n%1 + nm + m2 m%1) n2 + n%1 + nm + m2 + m%1
?
%1 = m2 + n 2
> combine(%,radical,symblolic):
> simplify(expand(%));
0
BF AC = AF BC ñ (A, B, C, F ) là một hàng điểm điều hòa. Vậy p1, p2 trực giao.
> restart:with(geometry):
> EnvHorizontalName:=x: EnvVerticalName:=y:
> alias(x[a]=xa,y[a]=ya,x[b]=xb,y[b]=yb,
x[c]=xc,y[c]=yc,x[e]=xe,y[e]=ye ):
> point (A,xa,ya),point(B,xb,yb),point(C,xc,yc),point(E,xe,ye):
Tọa độ trung điểm M của AB và AB:
> midpoint(M,A,B):[coordinates(M)],distance(A,B);
[ ]
xa + xb , ya + yb , (xa xb )2 + (ya + yb )2
1 1 1 1 a
2 2 2 2
Đến đây thì mọi chuyện đều êm thắm, nhưng khi muốn tìm phương trình đường thẳng AB
cũng như khoảng cách từ C tới đường thẳng AB thì mọi chuyện trở lên phức tạp:
> line(AB,[A,B];line(CE,[C,E]));
geometry/checkline: One of the following conditions must be satisfied
Thông báo sai! Maple "cắc cớ" đòi các điểm A, B không được trùng nhau, ta bắt buộc phải
vâng lời bằng cách dùng assume, để sau đó mới có thể đi tiếp. Ta tìm được phương trình của
AB cũng như khoảng cách từ C tới đường thẳng AB:
> assume(xa<>xb,ya<>yb,xc<>xe,yc<>ye):
> line(AB,[A,B];line(CE,[C,E]));
> Equation(AB);distance(C,AB);
(ya yb )x + (xa + xb )y + yb xa ya xb = 0
| (ya yb)xc + (xa + xb)yc ybxa + yaxb|
b
7
Đường Euler là đường nối liền trực tâm, trọng tâm và giao điểm ba đường trung trực
? ? ]
> combine(coordinates(center(vI)),radical):%=evalf(%,3);
[
1, 3 ? ?
7 13 + 109
= [1.0, 1.58]
5 13 + 109
> collect(combine(factor(Equation(vI)),radical),[x,y]);
( )
1? 3?
x2 2x + y 2 + df rac473 + 1417 y
107
1417 + =0
3 2 2
8
Dĩ nhiên, người ta có thể có trực tiếp phương trình này sau khi khai báo tam giác ABC bằng lệnh Equation(
EulerLine(El,ABC))
Hình 4.11:
> EL:=implicitplot(eMH,x=-4..9,y=-6..9,linestyle=2):
> display(Tr,gI,gE,EL,MQH,scaling=constrained);
Archimède sinh trưởng ở Syracuse, một ý kiếm Archimède làm sao xác định được mà
đô thị lớn thời Hy Lạp cổ đại. Sử chép rằng không làm hỏng vương miện. Ông suy nghĩ
ở ông có một thời lưu học ở Ai Cập, đặc biệt mãi. Một hôm nhân ngâm mình tắm trong
ở Alexandrie, và chính tại đây ông được gặp nước, ông thấy cơ thể như nhẹ đi, ông sung
Connon, học trò của Euclide và Eratostène, sướng hét to lên: Eurêka ! Eurêka !. Một lần
Giám đốc Thư viện Alexamdrie nổi tiếng, nhờ khác, khi nghiên cứu về đòn bẩy, ông thấy có
đó mà Archimède tiếp cận được với những phát thể dùng một lực nhỏ để bẩy một vật nặng hơn
minh mới về Toán học và khoa học. Trở về quê gấp nhiều lần vì vậy ông nói vui: Hãy cho tôi
hương, ông say sưa nghiên cứu, truyền thụ cho một điểm tựa tôi sẽ bẩy được Quả Đất nên!
học trò những tri thức, phát minh vè Toán học, Khi tim ra diện tích hình ellipse, ông dùng
khoa học đã làm cho tên tuổi ông trở thành bất phương pháp chia ellipse ra thành rất nhiều tam
tử. giác có diện tích tăng theo cấp so nhân có công
Cuộc đời cũng như cái chết của ông đã trở 1
bội là . Theo ngôn ngữ của chúng ta ngày
thành huyền thoại được đời đời truyền tụng, 4
thán phục và thương cảm. Vào năm 212 trước nay, Archimède đã tính tổng của một chuỗi hội
Công Nguyên, thành Syracuse bi quân La Mã tụ, một kỹ thuật tính toán kỳ lạ của nhân loại
vây hãm trong hai năm nhưng không tài nào hạ vào thời đó, tiền thân của phép tính tích phân.
nổi vì Archimède đã giúp dân Syracuse sáng Sinh thời, ông thích thú với bài toán mà
chế vũ khí giết giặc. Tướng La Mã là Marcel- ông đã giải: "một hình cầu nội tiếp trong một
lus đành cho quân vây thành chờ thời cơ. Lâu hình viên trụ" và ông nói rằng: Mai kia, sau
ngày, quân Hy Lạp mất cảnh giác. Nhân dịp lễ khi tôi qua đời, nên ghi hình ảnh bài toán này
nữ thần Diane, quân La Mã lẻn được vào trong trên bia mộ tôi. Và người ta đã thực hiện đúng
thành vì thế mà Syracuse thất thủ. Marcellus nguyên ước của ông. Chính nhờ đó mà hơn
mến mộ tài Archimède đã ra lệnh cho quân lính một trăm năm sau Cicéron đã tìm ra được ngôi
không được chạm đến ông nhưng đã quá muộn, mộ Archimède bị bỏ hoang theo năm tháng, gai
quân La Mã say sưa chém giết vì thế mà ông mọc đầy và cỏ dại phủ kín!.
đã bị sát hại. Ông đã đẻ lại cho đời sau một gai tài vô giá
Trong những huyền thoại về cuộc đời ông, về các phát minh khoa học thuộc các lĩnh vực
thì có lẽ câu chuyện ông phát minh ra nguyên Hình học phẳng, Hình học không gian, Số học,
lý đầu tiên của Thủy tĩnh học là thú vị nhất. Cơ học, Thủy tĩnh học, Thiên văn học. Ngôn
Tục truyền, vua Hiéron sai thợ kim hoàn làm ngữ trình bày trong các công trình khoa học ấy
một vương miện nhưng nhà vua nghi ngờ thợ thật mạch lạc, trong sáng, khiến ngày nay ai
kim hoàn ăn bớt vàng và thay bạc vào, bèn hỏi đọc cũng kinh ngạc.
Mô phỏng là một lĩnh vực quan trọng không chỉ riêng trong nhà trường, trong các cơ quan
nghiên cứu mà còn cả trong mọi tầng lớp xã hội.
Làm thế nào để biết được sự thay đổi, sự biến hóa thương vụ của một doanh nghiệp trước
tình trạng cạnh tranh với nhiều xí nghiệp khác, làm sao hiểu và tiên hiệu tình trạng kẹt xe trong
các thành phố lớn, làm sao chế ngự được sự lan tràn của một bệnh dịch, nên tăng thuế đánh
vào thuốc lá bao nhiêu để đảm bảo nguồn thu nhập nhưng vẫn đồng thời giữ gìn sức khỏe cho
cộng đồng, làm sao cân bằng sự duy trì sinh thái trong một khu rừng có nhiều sinh vật khác
nhau. . . Tất cả những vấn đề này đều được "mô phỏng hóa", nghĩa là được biểu diễn dưới các
công thức toán học, mà phần lớn được đưa về phương trình vi phân và ma trận.
Mô phỏng hóa là một bài toán cụ thể và có rất nhiều ảnh hưởng trong đời sống của chúng
ta, những vấn đề phức tạp này trở nên hữu ích và thú vị nếu chỉ với một chút suy nghĩ cùng với
sự giúp đỡ của Maple.
- số khách ở A là: xX + Y (1 y)
- số khách ở B là: yY + X(1 x)
M là ma trận chuyển từ thời điểm này sang thời điểm kế tiếp, như thế ta có:
S2 = M S1 = M 2 S0 , S3 = M S2 = M 3 S0 , . . . , Sn = M Sn1 = M n S0 (5.1.1)
Chương 5. Bài toán mô phỏng
1 2 5
Đặt X = Y = , x = , y = . Ta có:
2 3 9
> restart:with(plots):with(plottools):with(linalg):with(LinearAlgebra):
> M:=matrix(2,2,[2/3,4/9,1/3,5/9]):M:=evalm(M*9)/9;
1 [6 4]
M=
9 3 5
> S:=matrix(2,1,[1/2,1/2]):S:=evalm(S*2)/2:'S[0]'=eval(S);
1 [1]
S0 =
2 1
Lưu ý rằng để M có nghĩa, tổng các phần tử trong một cột phải bằng 1, vì (x, y) phải tỷ lệ
chứ không phải số lượng khách.
Hình 5.1:
[ ]
x3 + x xy 2 + 1 x2 + y 2 y yx2 y 3
x + 1 y 2 x3 x + xy 2 + y yx2 + y 3
P = 2
> alias(EC='x=0..1,y=0..1,axes=frame,grid=[15,15]'):
> plot3d(P[1,1],EC); [Hình 5.2(a)] plot3d(P[2,1],EC); [Hình 5.2(b)]
Đồ thị hình [5.2(a)] (cửa hàng A) cho thấy khi y cố định, x thay đổi từ 0 đến 1, thương vụ
của A luôn luôn tăng. Khi x = 1, y = 0 (tất cả mọi khách hàng đều ở lại A, không ai sang B),
lượng khách ở bên A sẽ tăng tối đa, bằng 2.
Và cứ thế tiếp tục, ở năm n ta phải sùng kết quả của năm n 1.
Lập trình
Với lập luận trên ta có chương trình đơn giản để tính Xn như sau:
> pp:=proc(p,r,n)
> local i,P:P:=p:
> for i to n do P:=P*(1+r)-12*m: od: P; end:
Với P = 50000, r = 11%, n = 25, ta được:
> pp(50000,11/100.,25);
679273.1899 1372.959687m
Và muốn trả hết sau 25 năm, số tiền phải trả hàng tháng là:
> solve(%,m);
494.7511
Hàm số hợp
Sự kiện kết quả của lần n được dùng để tính lần n + 1 gợi cho ta phương pháp hàm số hợp,
một phương pháp nhẹ nhàng và không cần phải lập trình:
> X:=P¡P*(1-r)-12*m;
-X(2) tương ứng với số tiền còn phải trả ở năm thứ 2 và bằng X(X(P)).
-X(n) tương ứng với số tiền còn phải trả ở năm thứ n và bằng X(@@n)(P) .
Và áp dụng các trị số như câu trên, ta có:
> subs(r=11/100.,(X@@25)(50000)): %,solve(%);
679273.5 1372.960m, 494.7511
Gán kết quả cho một hàm theo n, áp dụng các trị số như phần trên:
> g:=unapply(%,n):
> subs(P = 50000.,r=11/100.,g(25)):solve(%,m):
Kiểm chứng: Maple có sẵn nhiều lệnh để xử lí các tính toán về lãi suất, được tóm gọn vào
gói finance. Lệnh amortization sau khi thiết lập một bảng chi tiết khấu hao. Dùng các kết
quả đã tính ở trên ta có kết quả là một bảng 26 phần tử, phần tử sau cùng là:
> p:=finance[amortization](50000,494.7511*12,.11):p[1,26];
[25, 5936.887686, 588.3402212, 5348.547465, 0]
Vậy nếu hàng tháng trả 494.7511, 25 năm phải trả xong 50000.
So sánh giữa 3 phép giải:
-Về vận tốc tính rõ ràng là dãy truy hồi nhanh nhất, vì máy chỉ cần thay các trị vào công
thức 5.3, trong khi hai phương pháp trên đều phải cần dùng n vòng lặp nếu tính đến n năm.
Phương pháp lập trình nhanh hơn hàm số hợp vì các lệnh nhập (move) đều là các lệnh sơ đẳng.
- Về cách đặt phương trình thì rõ ràng hàm số hợp tiện lợi hơn.
Tuy nhiên, trong bài toán này, rất ít khi phải tính đến n ¡ 50, nghĩa là lãi suất trả trên 50
năm! Nến tiết kiệm thời gian CPU (Central Processing Unit) là một điều dư thừa. Và do đó
hàm số hợp là phương pháp tốt nhất cho bài toán này.
Hình 5.3:
Nhưng bây giờ chúng ta sẽ thử bằng một cách khác mà bản chất khác hẳn, người ta quen
gọi là cách giải các biến liên tục, bởi vì kết quả của phép giải không còn là nhiều điểm rời rạc
nhưng là một phương trình giải tích. Đó là cách giải bằng phương trình vi phân Và phương trình
vi phân của bài toán là:
> eq2:=diff(u(t),t)=r*u(t);
d
eq2 := u(t) = ru(t);
dt
> s2:=dsolve({eq2,u(0)=P});
s2 := u(t) = P ert
> p2:=unapply(rhs(%), (P,r,t)):
> map(trunc,[p2(50000,.11,t)$i=1..10]);
[55813, 62303, 69548, 77635, 86662, 96739, 107988, 120544, 134561, 150208]
> g2:=plot(p2(50000,.11,t),t=1..10),linestyle=dash:
> plots[display](g1,g1b,g2);
Quan sát trên hình 5.4(a) ta thấy khi n càng lớn, sai biệt giữa hai phép giải rời rạc và liên
tục càng lớn. Ở năm thứ 10, ta thấy có gần 9000 cách biệt:
> f1(10),f2(5000,.11,10);
[141971.0493, 150208.3012]
Hình 5.4: Sai biệt giữa phép giải rời rạc và liên tục
Lý do của sự khác biệt này chính là bản chất của hai phép giải. Khi giải rời rạc ta chỉ có
giá trị ở các điểm đặc biệt (cuối năm). Giữa hai điểm giá trị của hàm số không thay đổi. Đường
biểu diễn thực của nó là một đường bậc thang và đạo hàm của các điểm đặc biệt không hiện
hữu. Còn ở phép giải liên tục, giá trị hàm và đạo hàm của các điểm luôn hiện hữu. Hình 5.4(b)
[2 ], biểu diễn chung cả 3 đồ thị:
> f2:=(i)¡piecewise(x<i and x>i-1,p1[i]):
> g2c:=plot([seq(f2(i),i=2..10)],x=1..10,50000..145000,discont=true):
> plots[display](g1,g1b,g2,g2c);
Bây giờ ta mô phỏng giống như phần đầu, mỗi tháng khách trả m đồng:
> eq3:=diff(u(t),t)=r*u(t)-12*m;
eq3 := u(t) = ru(t) 12m
d
dt
> s3:=dsolve({eq3,u(0)=P}): f3:=unapply(solve(rhs(s3),m),(P,r,t));
1 ert P r
f 3 := (P, r, t) ÞÑ
12 1 + ert
Và để trả hết 50000 trong vòng 25 năm thì mỗi tháng phải trả:
> f3(50000,.11,25);
489.6346278
Kết quả này ít hơn với m = 494.75 đã tính ở các phương pháp rời rạc. Tuy nhiên ở đây
sưh khác biệt là, ở phép rời rạc cho dù đã trả mỗi tháng m đồng, nhưng số tiền này không được
2
Hình này nếu vẽ trong version 8 sẽ có những lằn dọc.
khấu trừ khi tính tiền lời cho các năm kế tiếp. Còn ở phương trình 5.4 thì được khấu trừ. và sự
chênh lệch sau 25 năm là:
> 494.7511*12*25-%*12*25;
1534.9417
Mai này khi vay tiền nhớ đòi ngân hàng phái tính bằng phương trình vi phân, nhưng phải
là phương trình (5.4)(!).
1
Với các dữ kiện đã cho, khai báo ma trận M rồi biến đổi thành dạng hữu tỉ đồng thời đặt 10
làm thừa số chung như sau:
> matrix(4,4,[0,0,0,100,0.1,0,0,0,0,0.2,0,0,0,0,0.3,0.4]);
> map(convert,eval(%),fraction):
> M:=evalm(%*10)/10;
Với z0 = 10 ( khởi đầu 10 con tằm), ta khai báo A dưới dạng hàm theo u:
> A:=u¡matrix(4,1,[0,0,0,u]):
Và các dữ kiện ban đầu của bài toán là:
> with(linalg):eval(M),eval(A(10));
0 0 0 1000 0
1 1 0 0 0 , 0
10 0 2 0 0 0
0 0 3 4 10
Gọi g(i, u) là hàm của (M i (A(u)))T , ta được đồ thi biến thiên về sự sinh sản của tằm (với
số lượng ban đầu u = 10:)
> g:=(i,u)¡transpose(evalm((Mˆi)&*A(u)));
> plot([seq([i,g(i,10)[1,4]],i=1..40)]); [hình 5.5(a)]
Và với số tằm ban đầu là u = 80, ta được:
3
Chủ đề được trích từ [34]
Hình 5.5: (a), (b) Phát triển ổn định sau 30 tháng và (c) phát triển không ổn định
Quan sát cả hai hình 5.5(a) và 5.5(b) ta thấy chúng có cùng một dạng và qua đó có thể kết
kuận rằng số tằm ban đầu hoàn toàn không ảnh hưởng đến giai đoạn cân bằng của tằm. Bất kì
với số lượng ban đầu là bao nhiêu đến tháng thứ 35 cũng ổn định. Nếu không tuỳ thuộc vào A,
kết quả chắc chắn phụ thuộc vào M và vì M n (u) = v n .u, người ta có thể dễ dàng chứng minh
được rằng nó tùy thuộc vào vm = max(vi ), với vi là những trị riêng của M :
Nếu 0 vm 1, lượng tằm sẽ giảm cho đến khi tuyệt chủng (!)
Nếu vm = 1, lượng tằm sẽ không đổi sau một khoảng thời gian
Nếu vm ¡ 1, lượng tằm sẽ liên tục gia tăng (bùng nổ dân số)
Các giá trị riêng (thực) được tính là:
> evalf(select(i¡Im(i)=0,[eigenvals(M)]));
[1., .7948411750]
Bây giờ ta thay đổi tỉ lệ sinh sản và tỉ lệ sống sót để có kết quả là sự bùng phát của tằm. Lúc
này cứ 100 trứng sẽ nở ra 11 ấu trùng. ta gọi tỉ lệ này là m.
> M:=matrix(4,4,[0,0,0,100,0.11,0,0,0,0,0.2,0,0,0,0,0.3,0.4]);
Hình 5.5(c) xác định một điều quan trọng: sự ổn định không tùy thuộc vào số lượng ban
đầu, mà phụ thuộc và giá trị riêng lớn nhất của M . Ở đây số lượng không ổn định theo chiều
"bùng nổ dân số" (vì vmax ¡ 1).
> max(op(evalf(select(i¡Im(i)=0,[eigenevals(M)]))));
1.020683729
Bây giờ ta giả sử rằng đang có sự bùng nổ dân số (m = 0.11). Hỏi với độ sinh nở nào của
ấu trùng ra nhộng và nhộng ra tằm thì ta lại có sự ổn định?
Gọi P là tỉ lệ ấu trùng ra nhộng và để đơn giản tỉ lệ nhộng ra tằm vẫn không thay đổi là
30%:
> M:=matrix(4,4,[0,0,0,100,0.11,0,0,0,0,p,0,0,0,0,0.3,0.4]);
0 0 0 100
0.11 0 0 0
0 p 0 0
0 0 0.3 0.4
> s:=eigenevals(M):
Error, (in linalg /evalf) matrix entries must all evaluate to flloat
Maple không tính nổi trị riêng? Đây là một trong những bug của Maple v.6 là: trong trường
hợp hệ số của M có số lẻ (float), M không có biến hình thức. Để khắc phục tình trạng trên, ta
phải cho giá trị p ngay từ đầu và kết hợp với toán tử mũi tên (¡). Ta khai báo một ma trận M
có biến hình thức p, nhưng khi tính trị riêng của M , ta nhập trị số của p.
> M:=p¡matrix(4,4,[0,0,0,100,0.11,0,0,0,0,p,0,0,0,0,0.3,0.4]):
Khai báo hàm s để tính các trị riêng của M (p), và hàm mvđể tính giá trị riêng thực lớn nhất:
> s:=i¡eigenvals(M(i)):
> mv:=p¡max(op(evalf(select(i¡Im(i)=0,[s(p)])))): mv(.2);
1.020683729
Tương ứng với một giá trị của p ta có được một trị riêng mv(p). Cách đơn giản nhất để tìm
trị riêng tương ứng bằng 1 là dùng phép nội suy từ một dãy các giá trị của p và mv(p).
1
Để kiến tạo hai dãy, trước tiên ta cho p thay đổi với bước 40 và trích ra vài cặp giá trị
[p,mv(p)], chung quanh giá trị mv(p) 1. Thí dụ dưới đây mv(7) 1.
> lu:=seq([i/40.,mv(i/40)],i=4..9);
lu := [0.100000, 0.881605], [0.125000, 0.923588], [0.150000, 0.959814],
[0.175000, 0.991851], [0.20000, 1.02068], [0.225000, 1.04698]
Tách các giá trị của p và mv rồi dùng phép nội suy Lagrange (interp):
> lx:=seq(lu[i,1],i=1..nops([lu])): ly:=seq(lu[i,2],i=1..nops([lu])):
> f:=interp([lx],[ly],x);
f := 255.999x5 254.933x4 + 108.139x3 + 26.1982x2 4.71089x + .587293
Sau cùng, ta giải phương trình f (x) = 1 và chỉ lấy nghiệm thực:
> select(i¡is(Im(i)=0),[solve(f-1)]);
[.181816]
Vậy khi tỉ lệ trứng nở sang ấu trùng là 11%, phải chế ngự tỉ lệ ấu trùng thành nhộng ở tỉ lệ
p = 18.18% để có sự ổn định.
Đến giai đoạn này điều chúng ta nghĩ ngay đến "tự động hóa" việc tính p theo m bằng cách
đặt các lệnh trên một chương trình có tên auto với tham số duy nhất là m. Tuy nhiên, ở đây có
một khó khăn là chọn các bước của p sao cho mv(p) 1 bằng cách tìm p sao cho mv( ) 1
p
50
) ¡ 1.
p+1
và mv(
50
Sau khi giải chỉ lấy nghiệm dương và nhỏ hơn 0.2.
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
> auto:=proc(m)
local M,s,mv,lu,lx,ly,f,i:
M:=p¡matrix(4,4,[0,0,0,100,m,0,0,0,0,p,0,0,0,0,0.3,0.4]);
s:=i¡eigenvals(M(i)):
mv:=p¡max(op(evalf(select(i¡Im(i)=0,[s(p)]))));
for i to 20 do
if mv(i/50)<1 and mv((i+1)/50)>1 then break: fi:
od:
lu:=seq([j/50.,mv(j/50.)],j=i-2..i+3);
lx:=seq(lu[i,1],i=1..nops([lu]));
ly:=seq(lu[i,2],i=1..nops([lu]));
f:=interp([lx],[ly],x);
op(select(i¡is(Im(i)=0 and i<=.2 and i>0),[solve(f-1)]));
end:
Bảng 5.1:
Nhập auto(0.11), chúng ta tìm lại được giá trị của p như ở (5.5) là 0.181818.
Biến thiên của p theo m với p đi từ 0.11 đến 0.18 là:
> seq([i/100. ,auto(i/100)],i=11..18):
> plot([%],thickness=3,tickmarks=[3,3],labels=[m,p]); [hình 5.6(a)]
Hình 5.6(a) cho thấy p rõ ràng là một hàm nghịch biến với m. Điều này hợp lí vì khi trứng
nở nhiều, cần thiết phải giảm số ấu trùng biến thành nhộng.
Kiểm chứng bằng đồ thị 3d
Bây giời ta tìm lại những kết quả trên bằng cách dùng đồ thị 3D. Cụ thể m và p bây giời là
các biến hình thức (các dữ kiện còn lại giữ nguyên). Mục đích là biểu thị đường biểu diễn của
trạng thái ổn định theo hai biến m và p. Xin nhắc lại, trạng thái này có được khi trị riệng nhở
hơn hay bằng 1. Để làm được điều này ta chỉ cần ssi tìm đa thức đặc trưng ma trận phụ thuộc
m, p (tạm đặt là ω) rồi giải phương trình ω = 1. Các bước thực hiện:
Khai báo ma trận M (m, p), tính đa thức đăng trưng Ω(m, p) với biến x.
Giải phương trình Ω(m, p) = 1 và vẽ đồ thị (biến ps) đây là trạng thái ổn định theo hai
biến m, p.
Nhập các giá trị m chạy từ 0.1 đến 0.3 vào nghiệm của phương trình ω(m, p) = 1 để vẽ
biến thiên của m, p. Đồ thị này cho thấy sự thay đổi của p theo m trong không gian.
> M:=matrix(4,4,[0,0,0,100,m,0,0,0,0,p,0,0,0,0,0.3,0.4]):
> Omega:=charpoly(M,x);
Ω := x4 0.3x3 30mp
> rc:=solve(Omega=1,x);
rc := RootOf (r Z 4 2 Z 3 150mp 5)
Cho dù không thể giải bằng hình thức, nhưng vẫn sẽ vẽ được đồ thị của lời giải trong không
gian! Đây quả là một khả năng "siêu phàm" của Maple.
> ps:=plot3d(rc,m=0.05..0.2,p=0..0.25,grid=[15,15],axes=boxed):
Maple không thể giải bằng hình thức? Đúng ra là đã có lời giải nhưng nó đã giữ dưới dạng
RootOf. Để có được dạng tường minh phải khởi đông môi trường EnvExplicit:
> EnvExplicit:=true:
> sc:=solve(Omega=1,x):
Maple tìm ra lời 4 giải (dài hai trang nên không in). Lúc đó nghiệm riêng của ma trận M
4
là:[ ]
> subs(m=0.11,p=0.1818,sc[1]);
1.239726281
Đến đây, ta có ứng với mỗi giá trị m ta có p = auto(m) và một nghiệm tương ứng của
phương trình ω(m, p) = 1. Như vậy, cho m thay đổi ta sẽ vẽ được một đường trong không gian:
> f:=(u)¡[u,auto(u),subs(m=u,p=auto(u),sc[1])]:
> pt:=pointplot3d([seq(f(0.1+0.02*i),i=0..10)],connect=true):
> display(pt,ps);
Hình 5.6:
Hình [5.6(b)] cho thấy sự thay đổi của p theo m trong không gian của những trị riêng 1
và nó cho ta ước đoán giá trị của m một khi biết trước p.
4
Các nghiệm khác hoặc âm hoặc phức
.12kg/phút
.3lít/phút
.A .B
.4lít/phút .2lít/phút
.
.1lít/phút
Hình 5.7:
(Trước khi ) giải ta cần lưu ý rằng lượng muối là một đại lượng được tính bằng gram và nồng
lượng
độ có thứ nguyên là (gr/l).
thể tích
⃝1 Gọi x(t) là lượng muối trong hồ ở thời gian t, nó sẽ bằng sự chênh lệch giữa lượng muối
vào và lượng muối chảy ra. Phương trình vi phân của bài toán là:
> diff(x(t),t)=p*a-a*x(t)/u;
x(t) = pa x(t)
d a
dt u
Lượng muối trong hồ ban đầu là 0, lời giải của phương trình là:
> s:=factor(dsolve({%,x(0)=0}));
s := x(t) = pu(1 + e u )
at
Khi t Ñ 8, x(t) Ñ pu (nhớ dùng assume để giả sử p, a, u ¡ 0). Điều này hợp lí vì lúc đó
trong hồ chỉ toàn muối.
> Limit(rhs(s),t=infinity):%=simplify(value(%),assume=positive);
at
limtÑ8 pu(1 + e u ) = pu
Và thời gian để nồng độ muối đạt k gr/l (lưu ý răng s có thứ nguyên nên phải nhân k với
thể tích u):
> ss:=solve(rhs(s)=u*k,t);
( )
pk
ss := ln
u
a p
Nhập các số liệu tùy ý (kết quả tính bằng phút)
> subs(a=6,u=1000,k=1/2,p=1,s):%=evalf(%,5);
500
ln(2) = 115.53
3
Đường biểu diễn của x(t):
> plot(subs(u=1000,a=6,p=1,rhs(s)),t=0..1000); [Hình 5.8(1)]
⃝2 Với các số liệu như hình 5.7 và gọi x(t), y(t) là lượng muối trong A và B ta có hệ phương
trình:
> sys:=diff(x(t),t)=12+y(t)/100-7*x(t)/100,
diff(y(t),t)=3*x(t)/100-3*y(t)/100;
$
y(t)
' d 1 7
& x(t) = 12 + x(t)
sys = dt 100 100
' d
x(t)
3 3
% y(t) = y(t)
dt 100 100
> s:=dsolve({sys,x(0)=0,y(0)=200}):
Lời giải của hệ là hai biểu thức cực kì phức tạp nhưng ta đều có:
> limit(rhs(s[1]),t=infinity):limit(rhs(s[2]),t=infinity):
limtÑ8 x(t) = limtÑ8 y(t) = 200
Điều này có nghĩa là với những dữ kiện đã cho, cả hai bồn nước đều "bão hòa" ở 200
kg muối. Và đồ thị của sự thay đổi lượng muối là hình 5.8(b). Theo đó, lượng muối trong
A, (x(t)đường nét liền) liên tục tăng từ 0 đến 200, trong khi lượng muối ở B(y(t), đường nét
gián đoạn) giảm từ 200 xuống gần 100 rồi tăng trở lại đến mức bão hòa. Phải nói rằng nếu không
có Maple thì không dễ gì đoán ra sự thay đổi này.
> plot([rhs(s[1]),rhs(s[2])],t=0..300,view=[0..250,100..200],
linestyle=[1,3],tickmarks=[3,2]);
Hình 5.8: Đường biểu diễn của lượng muốn (a) trường hợp ⃝
1 và (b) trường hợp ⃝
2
b là hiệu suất sinh sản của rắn khi bắt được chuột. Nghĩa là phải bắt được b con chuột thì
rắn mới sinh được một con.
(c dx(t))y(t)
cách giải hệ phương trình:
=0
> solve({rhs(eq1), rhs(eq2)},{x(t), y(t)});
[x(t) = 0, y(t) = 0], [x(t) = 25, y(t) = 100]
Maple tìm ra hai cặp nghiệm tương ứng với hai điểm cân bằng. Cả hai nghiệm đều có nghĩa
là với số lượng ban đầu có sẵn, số lượng này sẽ vĩnh viễn không đổi.
Bây giờ chúng ta thử với ba dữ kiện ban đầu và dùng mặt phẳng pha để thấy cụ thể sự tương
giao giữa hai số lượng x(t), y(t):
> DEtools[phaseportrait]([eq1,eq2],[x(t),y(t)],o..310,
[[x(0)=8,y(0)=100],[x(0)=12,y(0)=100],[x(0)=18,y(0)=100]],
arrows=none,linecolour=red,stepsize=.1);
Quan sát hình 5.9 ta thấy cả 3 đường biểu diễn đều xoay quanh một điểm cân bằng: x
25, y 100
Vậy cần phải duy trì số lượng chuột khoảng gấp 4 lần số lượng rắn để có sụ ổn định môi
sinh.
Hình 5.9:
5.7 S.A.R.S
[5 ]
Một bệnh dịch lan truyền trong cộng đồng N người khép kín. Gọi pn là số người
chưa bị nhiễm ở ngày n và Qn là người đã bị nhiễm. Giả sử mỗi ngày số người mới
bị nhiễm tỷ lệ với số lần tiếp xúc giữa người đã nhiễm với người chưa nhiễm. Mô
phỏng bài toán trong hai trường hợp:
Bệnh không chết người và nhờ có thuốc đặc trị mỗi ngày có một số phần trăm
khỏi bệnh và miễn dịch
người này đều phải "xuất hiện" cùng một lúc. Nói khác đi nó là tích của hai đại lượng Pn và Qn
cũng như tỷ lệ mà ta gọi là a.
a) Ở trường hợp thứ nhất chúng ta nhận định: Số người chưa bị nhiễm ngày mai bằng số
người chưa bị nhiễm đến ngày hôm nay trừ đi số người bị nhiễm trong ngày hôm nay. Tương
tự, số người bị nhiễm ngày mai bằng số người đã bị nhiễm đến ngày hôm nay cộng với số người
bị nhiễm đến ngày hôm nay.
Hệ phương trình sai phân trong trường hợp này là:
Pn+1 = Pn aPn Qn
!
Trước tiên, ta lưu ý rằng nếu cộng hai vế của hệ thì ta có Pn+1 + Qn+1 = Pn + Qn tức là
tổng của hai nhóm luôn bằng hằng số (cộng đồng khép kín).
Hệ (5.6) là một hệ phức tạp không có lời giải giải tích, mặt khác:
-đại lượng tích pn Qn trong hệ trên đã vô hiệu hóa cách giải bằng ma trận.
-trong Maple, hàm số hợp "bất lực" khi có hai biến trở lên.
Tóm lại các tính độc nhất là lập trình:
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
> prg1:=proc(P,Q,a,n)
global lP, lQ,vP,vQ,P1,Q1,i:
lP:=NULL:lQ:=NULL:P1:=P:Q1:=Q:
for i to n do
vP:=round(P1-a*P1*Q1):vQ:=round(Q1+a*P1*Q1):
lP:=lP,vP:lQ:=lQ,vQ:
P1:vP:Q1:=vQ:
od:end
Bảng 5.2:
Hình 5.10: Lây lan của bệnh dịch khi không có và khi có thuốc chữa
[594, 406, 1000], [353, 647, 1000], [125, 8785, 1000], [16, 984, 1000], [0, 1000, 1000]
b) Trong trường hợp thứ hai, ta phải đưa thêm vào biến Rn thể hiện số người bị nhiễm
nhưng đã khỏi và miễn dịch tại ngày thứ n + 1. Gọi b là tỷ lệ số người này. Hệ (5.6) trở thành:
Pn+1 = Pn aPn Qn
#
Và dĩ nhiên chúng ta sẽ phải giải bằng lập trình. Chương trình không thay đổi gì, chỉ cần
thêm vào các biến mới.
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
> prg2:=proc(P,Q,R,a,b,n)
global lP, lQ,lR,vP,vQ,vR,P1,Q1,R1,i:
lP:=NULL:lQ:=NULL:lR:=NULL:P1:=P:Q1:=Q:R1:=R:
for i to n do
vP:=round(P1-a*P1*Q1):vQ:=round(Q1+a*P1*Q1-b*Q1):
vR:=R1+b*Q1:
lP:=lP,vP:lQ:=lQ,vQ:lR:=lR,vR:
P1:=vP:Q1:=vQ:R1:=vR:
od:end
Bảng 5.3:
> gR:=seq([i,lR[i]],i=1..20):
> gP1:=plot([gP],symbol=box,style=point):gP2:=plot([gP]):
> gQ1:=plot([gQ],symbol=cross,style=point):gQ2:=plot([gQ]):
> gR1:=plot([gR],symbol=circle,style=point):gR2:=plot([gR]):
> display(gP1,gP2,gQ1,gQ2,gR1,gR2);
Quan sát đồ thị hình [5.10(b)] ta cũng thấy sự giảm thiểu liên tục của số người chưa bị
nhiễm và tăng liên tục của số người bị nhiễm. Đến ngày 15 mọi người đều bị nhiễm và đó là
khởi điểm của sự giảm thiểu liên tục của số người đã bị nhiễm. Nếu ta đi xa hơn, đến ngày thứ
55 thì tất cả mọi người sẽ khỏi bệnh.
1 1
Hình 5.11: Lây lan của bệnh dịch với b = và b =
10 2
Bây giờ ta giả sử b = 0.5 nghĩa là tỷ lệ khỏi bệnh nhiều gấp 5 lần:
> b:=.5:
> sol:=dsolve({eq1,eq2,eq3,CI},{P(t),Q(t),R(t)},type=numeric);
> display([gr(P,30,1),gr(Q,30,3),gr(R,30,4),
> tx(9.5,900,P),tx(17,170,Q),tx(22,700,R)],tickmarks=[3,3]);
Hình 5.11 (b) cho thấy đến ngày thứ 30 coi như mọi người đã khỏi bệnh.
c) Bây giờ ta giả sử có tiêm chủng. Việc tiêm chủng sẽ chữa khỏi bệnh và làm miễn dịch,
vì thế nên chỉ những người chưa nhiễm bệnh mới cần tiêm chủng. Gọi số đã được tiêm
dS
chủng là S(t), ta chọn một mô hình đơn giản nhất là = cP (t), vậy với c là một hằng
dt
số có nghĩa là số người có khả năng nhiễm bệnh (số người chưa nhiễm) càng cao thì tốc
độ tiêm chủng càng cao.
$
(5.7.4)
> c:=.1:b:=.1: CI:=P(0)=999,Q(0)=1,R(0)=0:
> sol:=dsolve({eq1,eq2,eq3,CI},{P(t),Q(t),R(t)},type=numeric);
> display([gr(P,20,1),gr(Q,20,3),gr(R,20,4),gr(S,20,3),
> tx(3,800,P),tx(8,160,Q),tx(20,220,R),tx(20,220,S)],tickmarks=[3,3]);
Quan sát Hình 5.12 (a) thì thấy số người khỏi bệnh tự nhiên hoặc do tiêm chủng càng ngày
càng tăng, và nếu ta đi đến ngày thứ 50 thì chỉ còng 6 người bị nhiễm như bảng dưới đây (để có
thể in trên hai cột, ta bỏ bớt đi các số lẻ):
∼∼∼∼∼∼∼∼∼∼∼
Bảng 5.4:
d) Bây giờ ta lại thêm một giả thuyết khác: phải tính đến tỷ lệ sinh sản và chết tự nhiên,
tuy nhiên cộng đồng vẫn còn khép kín, nghĩa là không có di cư và nhập cư. Để đơn giản
ta giả sử bệnh dịch không gây chết người và cũng không có yếu tố tiêm chủng. Gọi f là
tỷ lệ sinh sản và g tỷ lệ chết tự nhiên. Bài toán được mô phỏng theo hệ:
$
Với a = .001, b = .1, f = .05, g = .02 ta làm lại các lệnh như trên:
> display([gr(P,30,1),gr(Q,30,3),gr(R,30,4)]);
Quan sát đồ thị 5.12 (b) chúng ta thấy đơn thuần là trường hợp a) (trường hợp có tiêm
chủng) nhưng trong một cộng đồng có sinh và chết tự nhiên. Số người không nhiễm liên tục
giảm nhưng với tỷ lệ khỏi và tỷ lệ sinh sản lớn hơn so với tỷ lệ chết tự nhiên lên sau khoảng 30
ngày, số người khỏi bệnh chiếm đa số. Nên lưu ý tổng số người trong cộng đồng đã tăng lên
gấp đôi:
∼∼∼∼∼∼∼∼∼∼∼
Bảng 5.5:
Chúng ta có thể tiếp tục thay đổi các trị số của a, b, c, f, g hoặc thêm và các giả thuyết để
phức tạp vấn đề.
Eratosthene
(Cyrene 276 - Alexandrie 194 trước Công Nguyên)
Sinh ra vào thế kỷ thứ ba trước Công Nguyên tại Cyrene, ngày nay là thành phố Shahhat (Libye).
Trong lịch sử hiếm thấy một nhà khoa học và nhất là khoa học cổ đại mà lại tinh thông nhiều
lãnh vực như ông.
Về sử, ông đã nghiên cứu về dòng các triều đại Ai Cập cổ. Về Địa, ông đã khảo sát về các
đại lục, đại dương, về gió, về núi và về các vùng khí hậu khác nhau. Eratosthene đã để lại cho
hậu thế một tấm bản đồ sau này được đánh giá là tại liệu độc nhất về cơ sở của môn địa lý: Tấm
bản đồ này xác định vòng cung xích đạo nằm xấp xỉ vĩ tuyến 47o 42. Hai mươi thế kỷ sau, Hàn
Lâm Viện khoa học Pháp tính được chính xác là 47o 40! Tuy nhiên nhân loại biết đến ông nhiều
hơn trong hai lãnh vực là Toán và Thien văn học. Eratosthene đã thiết lập được lịch các nhật
thực và danh sách của 675 ngôi sao. Tuyệt vời hơn, ông đã tính được độ nghiêng của trái đất là
23o 51. Eratosthene cúng là người đầu tiên xây dựng được một đài thiên văn.
Hai mươi thế kỷ sau ngày ông mất, cộng đồng khoa học còn nhớ đến hai công trình bất hủ
là "sàng Eratosthene" và cách xác định chu vi trái đất chỉ bằng tính toán.
"Sàng Eratosthene"
Đây là một phương pháp di tìm các số nguyên tố. Số nguyên tố là một số chỉ chia chẵn
cho 1 và cho chính nó. Thí dụ: 11, 23 là số nguyên tố, 15, 27 không là nguyên tố.
Thuật toán của Eratosthene để tìm các số nguyên tố nhỏ hơn n như sau:
Viết tắt các số lẻ từ 3 đến n(3, 5, 7, 9...)
Bắt đầu bằng 3, tìm và gạch bỏ những số chia chẵn cho 3
Làm y như vậy với 5 rồi 7, 9... và chấm dứt khi tới ?n
Kết quả là những số chưa gạch bỏ (và thêm số 2 là số nguyên tố đầu tiên).
Theo như thuật toán này ta phải có (n = 120):
2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49,
51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97,
99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119,
6
Chương trình crible (ở trang sau) chỉ có thể áp dụng cho n 120. Lý do là vì Maple không chấp nhận làm
? array. Sàng Eratosthene cũng
việc (chỉnh sửa) trên một dãy (list) có trên 200 phần tử, bắt buộc phải đổi sang
chỉ được áp dụng cho những só tương đối nhỏ, vì độ phức tạp thuật toán là O( n)
Bảng 5.6:
Cách tính của Eratosthene chỉ đúng khi trái đất tròn! Nhưng chân lý này chỉ được chấp
nhận vào thế kỷ 13. Trước đó người ta vẫn nghĩ là nó phẳng như tấm gương. Đó chính
là cái hay của Eratosthene khi đoán ra độ cong của trái đất khi quan sát cái bóng tháp
Alexandrie.
Khi Eratosthene nhìn thấy mặt trời đứng bóng ở giếng Syene, làm thế nào cùng lúc ấy ông
ta biết được góc nghiêng 7o 2 ở một nơi cách đó 800 km? (thời ấy có lẽ chưa có điện thoại
hoặc "mô-bai")
Để lại cho hậu thế những khám phá siêu việt nhưng Eratosthene lại ra đi trong buồn tủi
vô hạn. Về cuối đời ong bị mù cả hai mắt. Đối với nhà khoa học đã từng phát minh ra đài
thiên văn và sống suốt đời với vũ trụ sâu thẳm và đầy huyền bí thì mất đôi mắt là mất tất
cả. Sử sách chép rằng ông đã nhịn đói cho đến chết.
7
Các tia sáng mặt trời song song với nhau vì coi như đến từ vô cực.
.Tháp Alexandrie
.87.5km
.Giếng Syene
.7.2o
t
Đấ
ái
.Tr
.7.2o
Hình 5.13: Thuật toán "Sàng Eratosthene" và cách đo chu vi trái đất.
Để ghi nhớ công lao của Eratosthene, và cũng như để ong sống mãi với niềm đam mê,
người ta dùng tên ông để đặt tên cho một thiên thạch. Thiên thạch mang mã số 3251.
Đây là một ứng dụng trực tiếp của tích phân. Cho hàm y = f (x). Phép quay của đồ thị
f (x) quanh trục Ox sẽ tạo ra một khối có hình dạng tùy thuộc vào f (x) nhưng có tiết diện tròn.
Để tính thể tích hoặc diện tích khối này (gọi tắt là tính kích thước), ta "cắt" nó ra làm nhiều lát
thẳng góc với Ox có chiều dày dx vô cùng bé (có thể xem là những hình trụ) mà ta có thể tính
kích thước của nó dễ dàng. Và để có kích thước toàn khối, ta lấy tích phân trên miền tương ứng.
Tương tự, khi hàm xoay quanh Oy ta phải tính hàm đảo x = f 1 (y) rồi làm như trên.
Bài toán kích thước qua tích phân này có một ứng dụng cụ thể khi hàm f (x) được tính ra
bằng các phép nội suy Lagrange, spline, nghĩa là khi vật thể có một hình dạng bất kỳ.
Trong phần này chúng ta cũng sẽ dùng một ưu điểm của Maple là phần đồ họa ba chiều
tubeplot để vẽ các đường cong phức tạp.
Chúng ta bắt đầu bằng các đường cong quen thuộc.
s :=
x + a b , x + a b
a a
Nếu chúng ta muốn chọn nghiệm dương, cách hay nhất là đi tìm dấu cảu nó:
> s1:=op(select(i¡sign(i)>0,[s]));
? 2 2
s1 :=
x + a b
a (6.1.1)
Để tính diện tích ellipse, ta chia diện tích nằm giữa đồ thị f (x) và trục hoành ra nhiều phần
Chương 6. Bài toán kích thước hình xoay
vô cùng nhỏ mà ta có thể xem như là những hình chữ nhật [Hình 6.1 (a)] [1 ]. Chiều rộng của
mỗi hình chữ nhật là dx và chiều cao là f (x). Diện tích của hình chữ nhật sẽ là dS = f (x)dx.
Và diện tích của ellipse là:
» »
S= dS = f (x)dx
S S
.y .y .x
. .x .
.x
.f (x)
.dx
> int(s1,x=0..a);
?
lim b(x x2 + a2 + a2 arctan( ?
1 x
))
xÑa 2a x2 + a2
> assume(a>0):value(%);
1
a πb
4
Vì ta lấy nguyên hàm từ 0 đến a nên kết quả trên là một phần tư ellipse. Vậy diện tích của
cả ellipse là πab. Và khi a = b = R, ta tìm lại diện tích hình tròn πR2 .
V = dV = πf (x)2 dx
V V
> V[x]=int(Pi*s1ˆ2,x=-a..a);
4
Vx = πab2
3
Tương tự, nếu ellipse xoay quanh Oy, ta sẽ có một trái bí dợ bán kính là a. Để tính thẻ tích,
ta làm y như trên nhưng bây giờ ta sẽ cắt thành từng lát thẳng góc với Oy, mỗi lát có chiều dày
dy, bán kính x = f 1 (y). Ta có thể dùng isolate để tách ra x2 thay vì y như trường hợp trên:
> isolate(eq,xˆ2);
1
Xem cách vẽ hình này ở cuối chương.
b2 x 2
dS :=
a
x + a2b 1+
(x2 + a2 )a2
?
Và diện tích trái dưa Thái sẽ là:
? ? ? ?
πb(2b a2 + b2 + a2 ln( b a? b + a + b) a2 ln( b a b + a + b)
a2 + b2
Khủng khiếp! Làm thế nào để biết công thức này đúng? Ta thử cho a = b để tìm lại diện
tích khối tròn (ta không thể làm a:=b vì mẫu số sẽ bằng không). Bắt buộc phải tính giới hạn:
> limit(%,a=b):
Kết quả không in ra đây vì Maple không tìm ra giới hạn và cũng sẽ xuất lại y như kết quả
trên, lý do là Maple gặp khó khăn khi không biết dấu của b.
> assume(b>0): value(%);
4πb2
Kết quả này rõ ràng "có vấn đề" vì diện tích không thể âm!. Đây có lẽ là một bug của
Maple trong quá trình đơn giản các biểu thức cồng kềnh trên. Để khắc phục, ta cần phải xác
định (assume) a, b là các số dương trước khi lấy nguyên hàm. Tuy nhiên bây giờ ta sẽ làm một
cách khác và bằng lý luận như sau:
Biểu thức của s1 (6.1) được rút ra một cách rất "trực quan" từ hai nghiệm của phép giải
solve trước đó, hơn nữa, biểu thức này có căn nên khi lấy đạo hàm sẽ rất phức tạp và hâu quả
như ta đã thấy. Trong những trường hợp này ta phải:
- Thay vì solve trên biến y, ta thực hiện trên y 2 . Làm như thế ta không phải mất công chọn
ra một nghiệm (với những trục trặc về sau).
- Đơn giản đến mức tối đa biểu thức trên hoặc các phép tính dùng biểu thức trên trước khi
lấy nguyên hàm.
> u := sqrt(solve(eq, yˆ2))
b (aa2+ x )
c
2 2 2
u :=
Ta bình phương diện tích xung quanh của một lát (theo công thức 6.2) nên để triệt tiêu căn
số trước khi đơn giản:
> (2*Pi*u*sqrt(1+diff(u, x)ˆ2))ˆ2:
?
> simplify(sqrt(%), symbolic);
πb a4 a2 x2 + b2 x2
2
a2
Và nguyên hàm sẽ có dạng đơn giản hơn rất nhiều (!):
(
?2 2 2 ?2 2)
> s := simplify(int(%, x = -a .. a), symbolic)
? 2 2 b a b + a arctan( a b b )
2πb
a b
Đó chính là diện tích mặt của ellipsoid, và khi a = b = R, ta sẽ có diện tích hình cầu:
> simplify(subs(b=R,limit(%,a=b)),symbolic);
4πR2
6.2 Thể tích sinh ra bởi phép quay quanh trục Ox của một hàm
Cho hàm f (x) bất kỳ và gọi Hx là hình sinh ra bởi phép quay trục Ox của f (x). Để tính
thể tích V của Hx , ta cắt nó ra thành nhiều lát thẳng góc với Ox có chiều dày dx và bán kính
đáy f (x). Thể tích của mỗi lát là dV = πf (x)2 dx và thể tích của Hx là:
» »
V = dV = πf (x)2 dx
Hx Hx
Ví dụ tích thể tích hình xoay f (x) = x3 , miền giới hạn x P [0, 1]
1
2
> f:=y=xˆ3/2;
Ta có dV = πrhs(f )2 dx, thể tích sinh ra bởi phép quay của f (x) là:
> Int(Pi*rhs(f)ˆ2,y=0..1):%=value(%):%=evalf(rhs(%),4);
»1
1 6 1
πx dx = π = 0.1122 đơn vị thể tích[2 ]
4 28
0
Câu lệnh sau vẽ đồ thị f (x), và hình xoay quanh Ox (Hình 6.2):
> with(plots): alias(OP='axes=normal,labels=[x,y,z]'):
> plot(rhs(f),x=0..1,tickmarks=[2,2]);
> tubeplot([x,0,0],x=0..1,radius=rhs(f),
tubepoints=80,orientation=[-79,96],tickmarks=[0,3,3],OP);
6.3 Thể tích sinh ra bởi phép quay quanh trục Oy của một hàm
Lý luận tương tự, nhưng bây giờ ta tính x = f 1 (y) và chọn y P [0, 21 ]:
> isolate(f,x);
x = RootOf ( Z 3 2y)
> w:=allvalues(%);
w := x = 2( 3 ) y ( 3 ) , x = 2( 3 ) y ( 3 ) (1)( 13 ), x = 2( 3 ) y ( 3 ) (1)( 13 )
1 1 1 1 1 1
(6.3.1)
2
Kể từ đây, để đơn giản ta không cần ghi đơn vị
1
Hình 6.2: Đồ thị y = f (x) = x3 và hình xoay quanh Ox
2
> assume(y>0):select(i¡is(rhs(i)>0),[w]);
1 1
x = 2( 3 ) y ( 3 )
> Int(Pi*rhs(op(%))ˆ2,y=0..1/2):%=value(%):%=evalf(rhs(%),4);
1
(»2 )
( 13 ) ( 13 ) 12 1 1
π2 y dy = 4( 3 ) π2( 3 ) = 0.9246
5
0
Ta cũng có thể làm đơn giản hơn nhiều bằng cách isolate x3 thay vì x:
> y:='y':vx:=rhs(isolate(f,xˆ3))ˆ(1/3):
> Int(Pi*vxˆ2,y=0..1/2):%=value(%):%=evalf(rhs(%),4);
Các lệnh sau vẽ đồ thị f 1 (y) và hình xoay quanh Oy (Hình 6.3). Tuy nhiên Maple hiển
thị mặc định nằm ngang nên muốn thấy rõ là hình xoay quanh Oy, phải tự quay để dựng đứng
hình lên bằng lệnh orientation cũng như hiển thị tên trục:
> plot(vx,y=0..1/2,tickmarks=[2,2]);
> tubeplot([0,y,0],y=0..1/2,radius=vx,
tubepoints=80,orientation=[63,156],tickmarks=[3,0,3],OP);
6.5 Tìm thể tích sinh ra bởi phép quay của phần giao của hai hàm
x3
Khảo sát phần giao của hàm f (x) = (như mục 6.2) và đường thẳng y = 2x.
2
Xoay quanh Ox
> y:='y': eq1:=y=xˆ3/2; eq2:=y=2*x;
1
eq1 := y = x3
2
eq2 := y = 2x
Thể tích muốn tìm bằng thể tích lớn trừ thể tích nhỏ. Trước tiên ta phải tìm gao điểm của
hai hàm.
> solve({eq1,eq2});
tx = 0, y = 0u, tx = 4, y = 2u, tx = 4, y = 2u
> plot([rhs(eq1),rhs(eq2)],x=0..2,0..4.2); [Hình 6.5]
> g1:=tubeplot([x,0,0],x=0..2,radius=rhs(eq1),tickmarks=[3,2,2],OP):
Hình 6.4: Đồ thị một hàm nội suy và hình xoay quanh Ox
> g2:=tubeplot([x,0,0],x=0..2,radius=rhs(eq2),tickmarks=[3,2,2],OP):
> display(g2,g1); [Hình 6.6 (a)]
> Int(Pi*(rhs(eq2)ˆ2-rhs(eq1)ˆ2),x=0..2):%=value(%):%=evalf(rhs(%),5);
(»2 )
π(4x x )dx =
2 1 6 128
π = 19.149
4 21
0
1 3
Lưu ý: Vẽ hình xoay quanh Ox [Hình 6.6 (a)], ta giới hạn hàm eq1 = x trong khoảng
2
[1, 2] vì nếu không nó sẽ bị che khuất bởi hàm eq2 = 2x bao bên ngoài.
Xoay quanh Oy
> s2:=rhs(isolate(eq2,x));
1
s2 := y
2
Dùng lại biểu thức w(6.3) (biểu thức tính eq11 (y)):
> Int(Pi*rhs(w[1])ˆ2-s2ˆ2,y=0..4):%=value(%):%=evalf(rhs(%),5);
(»4 )
π(2 y y )dy = 4 3 π2 3 π = 13.403
( 13 ) ( 13 ) 1 2 12 ( 1 ) ( 1 ) 16
4 5 3
0
> h1:=tubeplot([0,y,0],y=0..2,radius=rhs(w[1]),
tubepoints=80,orientation=[79,145],tickmarks=[3,2,2],OP);
> h2:=tubeplot([0,y,0],y=0..2,radius=s2,
tubepoints=80,orientation=[79,145],tickmarks=[3,2,2],OP);
> display(h2,h1);
Lưu ý: Vẽ hình xoay quanh Oy [Hình 6.6 (b)], ta giới hạn trong khoảng [0, 2] thay vì [0, 4]
vì nếu không sẽ chỉ thấy một phương trình.
Hình 6.5:
Xoay quanh Ox
> Int(Pi*rhs(f)ˆ2,x=0..2):%=value(%):%=evalf(rhs(%),5);
(»2 )
πx (x 2) dx =
2 4 128
π = 3.8296
105
0
> h1:=tubeplot([x,0,0],x=0..3,radius=rhs(f),
tubepoints=80,orientation=[79,145],tickmarks=[3,2,2],OP);[3 ]
Xoay quanh Oy
Tương tự ta tính x = f 1 (y)
> s:=rhs(isolate(f,x));
x
Biểu thức hàm số đảo của f 1 (y) cực kỳ phức tạp và là số phức. Và chắc chắn Maple
không thể tính được nguyên hàm. Trong trường hợp này ta phải giúp Maple bằng cách lại
3
Hình 6.8 (a)
Hình 6.6: Phần giao của hai hàm và hình xoay quanh Ox, Oy
cắt nhỏ hình xoay quanh Oy thành nhiều khối ? chữ nhật có chiều dày dx cực bé, chiều cao
(g f )(x) = 2 x(x 2) , và chiều rộng 2 R x2 với R là giao điểm của f (x) và g(x)
2 2
[Hình 6.8 (b)]. Thể tích của hình xoay quanh Oy sẽ là tổng của các khối này. Chúng đi từ 0 đến
R:
> u:=rhs(g)-rhs(f): R:=evalf(fsolve(u,x),4);
R := 2.839
> 2*Int(2*u*sqrt(Rˆ2-xˆ2),x=0..R):%=evalf(%,5);
2.839
»
?
2 2(2 x(x 2)2 ) 8.06162449 x2 dx = 34.334
0
f 1 (y) không xác định nên không thể vẽ hình xoay bằng tubeplot được.
Các lệnh để vẽ hình 6.8 (b). Gọi S là đồ thị của hàm f (x) = x(x 2)2 .
Ta vẽ S dễ dàng bằng plot. Riêng về các hình chữ nhật ta sẽ dùng lệnh rectangle trong
gói plottools để vẽ[4 ]. rectangle có hai tham số: tọa độ đỉnh trên phía trái và đỉnh đáy
phía phải. (Đỉnh L là đỉnh R trong Hình 6.8 (c)). Các đỉnh bên trên hình chữ nhật đều nằm trên
đường thẳng y = 2, ta chọn chiều rộng 0.2, vậy tạo độ các điểm này sẽ là [2i, 2]i P N .
Các đỉnh đáy có hoành độ là (i + 1)0.2 và tung độ là f (a) với a là trung điểm của chiều
rộng hình chữ nhật đang tính. Vậy tọa độ của chúng là:
1
[(i + 1)0.2, f ((2i + 1)0.2)]
2
> with(plottools):
> S:=plot([rhs(g)-rhs(f)],x=0..2.84,thickness=2:
> r:=i¡rectangle([i*.2,2],
[(i+1)*.2,subs(x=(2*i+1)*.1,rhs(f))],color=gray:
> display(S,seq(r(i),i=0..8));
4
Xem phần Help Maple online
Hình 6.7:
.y
.L
.R .x
.
Hình 6.8: Phần giao của hai hàm trong một trường hợp phức tạp và (b),(c) cách vẽ để tính thể
tích
Galileo Galilée
(Pise 1564 - Florence 1642)
Ông là con trai của một nhà buôn vải sợi, giảng dạy ở Đại học. Nhưng ông cho răng
có tên gọi theo tiếng Ý là Galilei. Ban đâu, cha Copernic có lý nên cho công bố một tác phẩm
muốn ông theo nghề buôn của gia đình, nhưng dưới hình thức đối thoại, ngụ ý xa gần bênh vực
sau nhân thấy con mình thích khoa học nên cho cho học thuyết Copernic. Do nhà cầm quyền
Galilée theo học Y khoa ở Toscane. Năm 1581, thời ấy không dễ gì bị qua mặt, Galilée bị bắt.
Galilée vào học Đại học Pise nhưng rồi càng Ông bị buộc nói lại khác với suy nghĩ của mình.
ngày càng bị toán học chinh phục, nên ông theo Năm 1637, ông bị mù, nhưng sức làm việc
học những lớp riêng không chính thức và được không giảm. Năm 1642, Galilée qua đời sau
đền bù xứng đáng: năm 1589 ông được phong một cơn sốt ác tính nhưng còn kịp trăn trối lại
Giáo sư Toán Đại học Pise và 3 năm sau về dạy những ý nghĩ cuối cùng của mình về chuyển
Đại học Padoue. động của các hành tinh trong Thái dương hệ
Thời bấy giờ, lý thuyết Copernic về Quả cho hai học trò giỏi của mình là Torricelli và
Đất chuyển động quanh Mặt Trời bị Giáo Hội Viviani
cho là "tà đạo" và cấm đoán đẻ không cho phép Sáng tạo của Galilée chủ yếu là về Vật lý
và Thiên văn, nhưng đóng góp của ông cho vì thế mà Galilée càng khẳng định lý thuyết
Toán học không phải là nhỏ. Lấylaij ý kiến của Copernic về Vũ trụ (hệ nhật tâm) là đúng; ông
Nicole Oresme,Galilée cho vẽ đồ thị vận tốc còn đóng góp phát triển kính hiển vi, sáng chế
của một chuyển động tăng dần đều phụ thuộc ra compa tỷ lệ, đồng hồ quả lắc.
vào thời gian và ông ước lượng rằng diện tích Vì thành tích của Galilée về Vật lý và
giữa đường biểu diễn của vận tốc và trục hoành Thiên văn quá rực rỡ nên người ta có cảm
tương ứng với quãng đường đã đi. Để đi đến giác đóng góp của ông cho Toán học bị lu mờ,
nhận thức ấy,Galilée đã chia trục thời gian ra nhưng thực ra chính nhờ sự nghiên cứu của
từng phần vô cùng bé, có nghĩa là chia diện tích Gelilée qua các công cụ toán học, ông đã đưa
ra từng phần rất bé. Chính ông đã dẫn đương toán học vào vị trí then chốt vì ông đã từng nói
cho "Lý thuyết các phần không thể chia nhỏ rằng: "Thiên nhiên đã tuân theo các quy luật
được nữa" của học trò ông là Cavalieri, người Toán học bất di bất dịch!". Ý nghĩa triết học
được hậu thế xem như đã tiếp cận với Lý thuyết toát ra từ nghiên cứu khoa học của ông có giá
tính tích phân từ thế kỷ 16. trị hùng hồn.
Nhưng đóng góp của Galiée cho Vật lý rất Nhờ những phát minh kỳ diệ đó mà khoa
cơ bản. Ông đã khám phá ra nhưng đăc điểm học đã thoát y hẳn những lý luận thần học bí
của chuyển động quả lắc, chuyển động tăng dần hiểm của thời đại ông đang sống. Người ta nói
đều của một vật rơi tự do. Ông còn sáng chế ra Galilée đã đem cơ sở Toán học làm nên tảng
kinh thiên văn, nhờ đó phát hiện các vệ tinh của cho mọi hoạt động khoa học nhân loại thời bấy
Jupiter (Mộc tinh) (1609-1610) và cũng chính giờ. Theo [28].
Trong chương này, chúng ta sẽ khảo sát một ứng dụng của phương trình vi phân cấp cao
trong lãnh vực cơ học: Bài toán dầm. Bảy trường hợp thường gặp là:
Tải trọng phân bố đều Tải trọng tập trung
Ngàm một đầu, đầu kia tự do Ngàm một đầu, lực bất kỳ
.y
.l
.q .x
.
.ω ¡0
Hình 7.1:
Quy ước chung về dấu Gọi l là chiều dài dầm, tải trọng q suốt chiều dài dầm, E, I là module
đàn hồi và moment quán tính của dầm.
Trong hệ trực chuẩn Oxy, gọi y là chuyển vị (y ¡ 0) khi hướng lên trên ), ω là góc quay
ω ¡ 0 ngược chiều lượng giác ), M là moment (M ¡ 0) khi sợi đặt trên dầm nén ), V là lực
cắt và q là tải trọng phân bố đều. Ta được các hệ thức:
Chương 7. Bài toán sức bền vật liệu
ω(x) =
d
y(x)
dx
M (x) = EI ω(x) = y(x)EI
d d
dx dx
d3
V (x) = M (x) = 3 y(x)EI
d
dx dx
d4
q(x) = V (x) = 4 y(x)EI
d
dx dx
Và phương trình vi phân trong trường hợp tải trọng đều là (q(x) = q = hs):
d4 q
4
y(x) + =0 (7.1.1)
dx EI
Tất cả trường hợp dưới đây, chúng ta sẽ làm một cách rất trình tự:
Vẽ đồ thị
Chính vì phải lặp đi lặp lại quá trình tính toán này, chúng ta sẽ khai báo ba hàm kể trên bằng
lệnh macro. Thao tác này có lợi là người ta chỉ việc giải phương trình vi phân là tức khắc ba
hàm sẽ tự động thay đổi.
Gọi f l(x), rt(x), mt(x) lần lượt là hàm chuyển vị, góc quay và moment uốn. Gọi eq, ci là
phương trình vi phân và điều kiện biên. s là lời giải. Ta có:
f l(x) = s, rt(x) = f l1 (x) và mt(x) = EI.l2 (x)
> macro(fl = unapply(s, x)):
> macro(rt = unapply(diff(s, x), x)):
> macro(mt = unapply(expand((diff(s, x, x))*EI), x)):
> eq := diff(y(x), x$4)+q/EI:
.y
.l
.q .x
.
Hình 7.2:
Điều kiện biên: moment hai đầu và chuyển vị hai đầu đều bằng không:
M (0) = M (l) = y(0) = y(l) = 0
> ci1:=((D@@2)(y)(0)=0,(D@@2)(y)(l)=0,y(l)=0,y(0)=0):
> s := rhs(dsolve({ci1, eq}, y(x))):
s là một mệnh đề Maple và nghiệm của (7.1). Một khi s được xác định,
các hàm f l(x), rt(x), mt(x) tự động xác định theo:
Vẽ đồ thị của ba hàm: chuyển vị f l(x), góc quay f t(x) và moment uốn mt(x). Để đơn
giản, ta đặt q = 1, EI = 1, l = 10. Ta tìm lại được những kết quả quen thuộc trong cơ học.
Riêng đối với đồ thị của góc quay ω(x), nên nhớ rằng giá trị của nó sẽ đổi dấu ở điểm chuyển
l
vị cực đại (x = ). Ta cũng có thể lấy trị tuyệt đối để có một đường biểu diễn phản ánh đúng
2
thực tế hơn.[1 ]
> q:=1: l:=10: EI:=1:
> plot(fl,0..10); plot(rt(x),x=0..10); plot(mt,0..10);
Ta vẽ đồ thị của ba hàm tương tự như trường hợp hai nối đơn. Và vì lặp đi lặp lại, nên kể
từ bây giờ các lệnh này không được in ra.
> plot(fl,0..10); plot(rt(x),x=0..10); plot(mt,0..10);
Hình 7.3: Chuyển vị, góc quay và moment trường hợp hai gối đơn
.y
.l
.q .x
.
Hình 7.4:
[ [ ] [ ]
1 ql4 1 ql3
384 EI , 128 EI , 12 ql
1 2
Ngàm một đầu, đầu kia gối đơn (hệ siêu tĩnh)
Điều kiện biên:
ω(0) = y(0) = M (l) = y(l) = 0
> ci4:=((D)(y)(0)=0),(D@@2)(y)(l)=0,y(l)=0,y(0)=0):
> s := rhs(dsolve({ci4, eq}, y(x))):
> 'fl(x)'=fl(x); 'rt(x)'=rt(x); 'mt(x)'=mt(x);
1 qx4 5 qlx3 1 ql2 x2
f l(x) =
24 EI
+
48 EI
16 EI
3 2 1 ql2 x
rt(x) =
1 qx 5 qlx
+
6 EI 16 EI 8 EI
mt(x) = qx + qlx ql
1 2 5 1 2
2 8 8
(Lưu ý: Đồ thị hàm góc quay trong Hình 7.9 được lấy trị tuyệt đối là |rt(x)|)
> plot(fl,0..10); plot(-|rt(x)|,x=0..10); plot(mt,0..10);
Ngàm một đầu, đầu kia gối đơn ở một điểm bất kỳ u
Đây là trường hợp phức tạp. Ta sẽ giải theo hai cách:
a) x u
Điều kiện biên:
q(l u)2
y(0) = ω(0) = y(u) = 0, M (u) = (7.1.2)
2EI
> ci41:=((D)(y)(0)=0,y(u)=0,y(0)=0,EI*(D@@2)(y)(u)=-q*(l-u)ˆ2/2):
> s := rhs(dsolve({ci41, eq}, y(x))):
> fl1:=unapply(fl(x),u):rt1:=unapply(rt(x),u):mt1:=unapply(mt(x),u):
> 'fl1(x)'=fl(x); 'rt1(x)'=rt(x); 'mt1(x)'=mt(x);
1 qx4 1 q(6l2 12lu + u2 )x3 1 q(u2 + 2l2 4lu)x2
f l1(x) = +
24 EI 48 uEI 16 EI
1 qx3 1 q(6l2 12lu + u2 )x2 1 q(u2 + 2l2 4lu)x
rt1(x) = 16 +
6 EI uEI 8 EI
Hình 7.5: Chuyển vị, góc quay và moment trường hợp ngàm một đầu
4 qlx2 3
mt1(x) = qx2 + qxl qux + qu2 + ql2 qlu
1 1 1 1 1
2 3 u 2 8 8 4 2
b) u x l
Trước tiên, ta thử điều kiện biên:
q(l u)2
M (l) = y(u) = V (l) = 0, M (u) = (7.1.3)
2EI
Và kết quả của dsolve là:
4 1 qlx3 2 2 1 u(qu3 + 24 C3EI + 4uq l 6uql2 )
241 qx
EI
+
6 EI
14 qlEIx + C3 x
24 EI
Rõ ràng là điều kiện trên "có vấn đề" vì kết quả còn dư ra một hằng số tích phân, mặc dù
trong lãnh vực cơ học các điều kiện trên đều đúng. Để tìm câu trả lời ta thử tự giải phương trình
(7.1):
y (3) = V (x)
q
x+A
EI
q x2
y (2) = M (x) + Ax + B
EI 2
.y
.l
.q .x
.
Hình 7.6:
q x3 x2
y (1) = ω(x) + A + Bx + C
EI 6 2
q x4 x3 x2
y (0) = y(x) + A + B + Cx + D
EI 24 6 2
Khi M (u) 0 ta có một phương trình khác theo A, B. Vậy ta có thể tính được A, B
Khi V (l) = 0 trên nguyên tắc ta tính được A, nhưng A đã có. Vậy ta còn dư C hay biến
C3
Tóm lại ta phải dùng một điều kiện khác với V (l) = 0, và điều kiẹn này phải tièm ra C.
Ta chỉ có hai lựa chọn: hoặc chuyển vị y hoặc quay ω; và vì ta không thể có giá trị nào của
y(x), (u x l), ta thử dùng kết quả của (7.2) để tính
omega(l). Và điều kiện biên là:
q(l u)2 q(l u)3
M (l) = y(u) = 0, M (u) = , ω(l) = (7.1.4)
2EI 6EI
> ci42:=(y(u)=0,EI*(D@@2)(y)(u)=q*(l-u)ˆ2/2,
> (D@@2)(y)(l)=0,EI*(D)(y)(l)=-q*(l-u)ˆ3/6):
> s := rhs(dsolve({ci42, eq}, y(x))):
> fl2:=unapply(fl(x),u):rt2:=unapply(rt(x),u):mt2:=unapply(mt(x),u):
> 'fl2(x)'=fl(x); 'rt2(x)'=rt(x); 'mt2(x)'=mt(x);
1 qx4 1 qlx3 1 ql2 x2 1 qu(3lu + u2 + 3l2 )x 1 qu2 (3u2 + 6l2 8lu)
f l2(x) = +
24 EI 6 EI 4 EI 6 EI 24 EI
1 qx3 1 qlx2 1 qxl2 1 qu(3lu + u2 + 3l2 )
rt2(x) = + 2 EI + 6
6 EI 16 EI EI
mt2(x) = qx + qlx ql
1 2 1 2
2 2
Để vẽ đồ thị, ta dùng piecewise để xác định hàm và khoảng tương ứng:
> q:=1:l:=10:EI:=1:u:=7:
> mte:=a¡piecewise(x>a,mt1(a),mt2(a)):
> rte:=a¡piecewise(x>a,rt1(a),rt2(a)):
> fle:=a¡piecewise(x>a,fl1(a),fl2(a)):
> plot([mte(7),fle(7)],x=0..10,-6..2,linestyle=[1,4]);
Quan sát Hình 7.11 (a) ta thấy đồ thị của chuyển động liên tục nhưng bị gẫy khúc. Để kiểm
chứng, ta tìm giá trị của góc quay ở hai bên điểm s = 8:
Hình 7.7: Chuyển vị, góc quay và moment trường hợp ngàm hai đầu
> subs(x=8,[rt1(8),rt2(8)]);
[ ]
20
,0
3
Kết quả này rõ ràng có vấn đề. Và "vấn đề" đi từ việc ta đã "ép buộc" các điều kiện biên
bằng các giá trị cho sẵn tại gối đơn (x = u) như ở các biểu thức (7.3, 7.4, 7.5). Tuy nhiên nếu
không có các giá trị này thì thiếu điều kiện cho phương trình vi phân.
Tóm lại phải đi tìm một cách giải không theo các hướng "truyền thống".
x u
Điều kiện biên ω(0) = y(0) = 0
> ci41:=((D)(y)(0)=0,y(0)=0);
> g1:=rhs(dsolve({eq,ci41},y(x)));
.y
.l
.q .x
.
Hình 7.8:
1 qx4 1 qlx3 2 2
g2 = + 14 qlEIx + C3 x + C4
24 EI 6 EI
Chúng ta có bốn hằng số tích phân, và vì thế cần phải có bốn phương trình.
$
g1 (u) = 0
'
&
: tại gối đơn
g1 (u) = g2 (u) : liên tục của chuyển vị
1 1
' g1 (u) = g2 (u) : liên tục của góc quay
g1 (u) = g22 (u) : liên tục của moment
2
%
> p1:=subs(x=u,g1=0):
> p2:=subs(x=u,g1)=subs(x=u,g2);
> p3:=subs(x=u,diff(g1,x))=subs(x=u,diff(g2,x)):
> p4:=subs(x=u,diff(g1,x,x))=subs(x=u,diff(g2,x,x)):
Giải hệ phương trình trên để tìm ra bốn hằng số tích phân:
> s:=solve({p1,p2,p3,p4},{ C1, C2, C3, C4});
1 u2 (4lu + 4l2 + u2 ) 1 u(4lu + 4l2 + u2 )
$ ,
& C4 =
' /
, C3 = , .
482 EI 16 EI
1 u 4lu + 2l 1 (12lu + 6l + u )
s := 2 2 2
, C1 =
' /
% -
C2 =
8 EI 8 uEI
Thay thế các trị số tìm được vào biểu thức của g1 và g2 . Và sau đó ta gán kết quả vào biến
f để tự động thay đổi các hàm f l(x), rt(x), mt(x):
> f:=subs(s,g1);
1 x4 1 (12lu + 6l2 + u2 )x3 1 (u2 4lu + 2l2 )x2
f := +
24 EI 48 uEI 16 EI
> fl1:=unapply(fl(x),u):rt1:=unapply(rt(x),u):mt1:=unapply(mt(x),u):
> f:=subs(s,g2);
1 qx4 1 lx3 1 l2 x2 1 u(4lu + 6l2 + u2 )x 1 u2 (4lu + 6l2 + u2 )
f := + +
24 EI 6 EI 4 EI 16 EI 48 EI
> fl2:=unapply(fl(x),u):rt2:=unapply(rt(x),u):mt2:=unapply(mt(x),u):
Để vẽ đồ thị, ta dùng piecewise để xác định hàm và khoảng tương ứng:
> mte:=a¡piecewise(x>a,mt1(a),mt2(a)):
> rte:=a¡piecewise(x>a,rt1(a),rt2(a)):
> fle:=a¡piecewise(x>a,fl1(a),fl2(a)):
> q:=1:l:=10:EI:=1:
> plot([mte(8),fle(8)],x=0..10,-6..2,linestyle=[1,4];
Hình 7.13 (a) cho thấy khi u = 8, đoạn dầm bên phải nối đơn bị nhấc lên. Để tìm xem ở
giá trị nào của u đoạn này sẽ bắt đầu nằm ngang, ta giải phương trình f l(l) = 0( với l = 10):
> eu:=op(select(i¡is(i<10),[fsolve(fl(10))]));
eu := 7.400789501
> plot([mte(eu),fle(eu)],x=0..10,-6..2,linestyle=[1,4]);
Hình 7.9: Chuyển vị, góc quay và moment trường hợp ngàm một đầu, đầu kia gối đơn
Khác với cách thứ nhất, lần này đồ thị góc quay liên tục ở điểm áp dụng lực:
> subs(x=8,[rt1(8),rt2(8)]);
[ ]
20 20
,
3 3
Hình 7.13 (b) cho thấy khi u = 7.4 thì chuyển vị ở đầu bên phải bằng 0. Vị trí của u sao
cho góc xoay rt(u) = 0 (tiếp tuyến ngang):
> eu:=op(select(i¡is(i>0 and i<10),[fsolve(rt(u))]));
eu := 7.1010 7.4
Lệnh sau đây tạo hình động của chuyển vị và góc xoay khi u thay đổi trong khoảng [6, 10].
Dĩ nhiên ta chỉ có thể thấy được trên màn hình.
> gi:=seq(plot([mte((i)/10),fle((i)/10)],
.y
.l
.q .x
.
.u
Hình 7.10:
Hình 7.11: Chuyển vị, moment ngàm một đầu và gối đơn ở: (a) x = 8 và (b) x = 7 (cách giải
thứ nhất)
x=0..10,-20..10,linestyle=[1,4]),i=60..80):
> plots[display]([gi],insequence=true);
ω(x) =
d /
y(x) /
/
dx /
. 3
d d2
M (x) = EI ω(x) = 2 y(x)EI ùñ dx
d
3
y(x)
P
EI
=0
dx dx /
/
/
d3
V (x) = M (x) = 3 y(x)EI
d /
-
dx dx (7.2.1)
> eq:=diff(y(x),x$3)-P/EI:
Ngàm một đầu, lực tập trung ở đầu kia. [Hình 7.14 (a)]
Điều kiện biên:
.y
.l
.q .x
.
.u
Hình 7.12:
Hình 7.13: Chuyển vị, moment trường hợp ngàm một đầu và gối đơn ở: (a) x = 8 và (b) x = 7
(cách giải thứ hai)
.y
.P
. .l .x
.(a)
.y
.P
. .l .x
.u
.(b)
Hình 7.14: Các trường hợp tải trọng tập trung với ngàm
1 P x2 P ux
rt(x) =
2 EI
EI
mt(x) = P l P u
Với u = 4 và u = 6 (nhân các đại lượng với 5 cho dễ nhìn) ta được:
> q:=1:l:=10:EI:=1:u:=4:P:=1:
> plot([fl(x),rt(x),5*mt(x)],x=0..10,-45..20,linestyle=[1,3,4]);
> q:=1:l:=10:EI:=1:u:=6:P:=1:
> plot([fl(x)/5,rt(x),5*mt(x)],x=0..10,-35..20,linestyle=[1,3,4]);
Hình 7.15: Chuyển vị, góc quay và moment trường hợp ngàm một đầu, lưu tập trung khi: (a)
u = 4 và (b) u = 6 (các tỷ lệ được sửa đổi để dễ nhìn)
.y
.P
. .l .x
.u
Hình 7.16:
Trường hợp này khác với 6 trường hợp trên. Ở đây phương trình (7.6) thay đổi tùy theo bên
trái hay bên phải của lực, giả sử tại x = u:
> eq1:=diff(y(x),x$3)-P/EI:eq2:=diff(y(x),x$3)+p/EI:
> ci41:=(y(0)=0,(D@@2)(y)(0)=0):
> g1:=rhs(dsolve({eq1,ci41},y(x))):
> ci42:=(y(l)=0,(D@@2)(y)(l)=0):
> g2:=rhs(dsolve({eq1,ci42},y(x))):
> p1:=subs(x=u,g1)=subs(x=u,g2):
> p2:=subs(x=u,diff(g1,x))=subs(x=u,diff(g2,x)):
> s:=solve({p1,p2},{A,B}):
> f:=subs(s,g1);
1 P x3 1 P x(9lu2 + 6l2 u + 4u3 2l3 )
f l(x) = +
6 EI 6 lEI
> fl1:=unapply(fl(x),u):rt1:=unapply(rt(x),u):mt1:=unapply(mt(x),u):
> f:=map(simplify,subs(s,g2));
1 P x3 1 P lx2 1 P x(4u2 3lu2 2l3 ) 1 P u2 (4u 3l)
f := + + 6
6 EI 2 EI 6 lEI EI
> fl2:=unapply(fl(x),u):rt2:=unapply(rt(x),u):mt2:=unapply(mt(x),u):
Và với những giá trị như trên, với u = 6 ta có đồ thị [Hình 7.17 (a)]. Quan sát đồ thị ta
nhận thấy có sự đứt đoạn của moment ở điểm lực tác động. Nguyên nhân là vì chúng ta có hai
hằng số tích phân, nhưng chúng ta phải cần có ba điều kiện liên tục về chuyển vị, góc quay và
moment. Dư ra một phương trình moment nên có sự gián đoạn này.
Bây giờ chúng ta bắt buộc phải lý luận trên cơ sở của cơ học chư không đơn thuần đi từ
phương trình (7.6) được. Lý thuyết sức bền vật liệu cho phép ta viết:
> ode1:=EI*diff(y(x),x$2)-P*(l-u)*x/l;
d2 P (l u)x
ode1 := EI 2 y(x)
dx l
> dsolve({ode1},y(x)):eq1:=rhs(subs( C1=A, C2=B,%));
1 P (l + u)x3
eq1 := + Ax
6 lEI
> dsolve({ode2},y(x)):eq2:=rhs(subs( C1=E, C2=F,%));[2 ]
( )
1 P ul2
eq2 := P u lx + x + Ex El
1 1 2 1 3
lEI 2 6 3 EI
Điều kiện biên: y(0) = 0, y(l) = 0, y1 (u) = y2 (u), y11 (u) = y21 (u):
2
Xin đừng lẫn hằng số tích phân E với module đàn hồi trong EI
Hình 7.17: Lực tập trung, hai nối đơn qua hai cách giải
> subs(x=0,eq1=0):assign(%):
> isolate(subs(x=l,eq2=0),F):assign(%):
> p3:=subs(x=u,eq1)=subs(x=u,eq2):
> p4:=subs(x=u,(diff(eq1,x)))=subs(x=u,(diff(eq2,x))):
B và F đã được xác định ở hai điều kiện đầu, chỉ còn A và E:
> s:=solve({p3,p4},{A,E});assign(%):
1 P u(u2 + 2l2 3lu)
" *
1 P u(u2 + l2 )
A= ,E =
6 lEI 6 lEI
Và hai lời giải, tức hai phương trình chuyển vị là:
> y[1]=eq1; y[2]=eq2;
1 P (l + u)x3 1 P u(3lu + u2 + 2l2 )x
y1 = 6
6 lEI
( ) lEI
1 P u(u2 + l2 )x 2 1 P u(u2 + l2 )
y2 := P u lx + x 13 PEI
1 1 2 1 3 ul
+
lEI 2 6 6 lEI 6 EI
Dùng lại cách khai báo góc quay và moment với u = 7 ta có Hình 7.17 (b).
Johannes Képler
(Wurtenberg 1571 - Ratisbonne 1630)
Ông xuất thân từ một gia đinh người Đức rất nghèo khó. Hồi nhỏ, képler là một cậu bé ốm yếu,
lên 4 tuổi bi bệnh đậu mùa suýt nguy đến tính mạng, nhưng may mắn qua khỏi, di chứng để lại
là thị lực bi giảm.
Dù sức khỏe kém, nhưng Képler đã sớm chứng tỏ cho mọi người thấy rằng mình học được,
vì vậy cậu được theo học có hệ thống, từ trường Dòng địa phương cho đến Trường Đại học
Tubingen, và may mắn là Képler được theo học bài giảng của nhà thiên văn nổi tiếng thuộc
trường phái Copernic. Năm 1595, Képler công bố sách viết về các hành tinh.
Năm 1600, vì lý do tôn giáo ông đành rời bỏ công việc đang làm là dạy toán và sang làm
trợ lý cho nhà thiên văn nổi tiếng Đan Mạch Tycho Brahe. Năm 1601, Brahe mất, Képler được
cử tiếp tục công việc của thầy. Năm 1613, sau khi vợ và con trai qua đời, ông đau buồn trở về
Linz, một thành phố thuộc Áo nằm trên bờ Danube, để dạy học. Trong 4 năm cuối đời, Képler
lang thang qua nhiêu thành phố, kiếm sống bằng cách xem tử vi!
Tuy là một nhà khoa học tên tuổi,nhưng cuộc đời của ông thật là bất hạnh. Người vợ đầu
tiên bị điên và mất sớm. Để tránh điều xấu số xảy ra một lần nữa trong đời, Képler đã nghiên
cứu tỉ mỉ các ưu khuyết điểm của 11 người đàn bà khác và quyết định đi bước nữa với người
đàn bà khá nhất trong số ấy. Nhưng bước đi này còn tệ hại hơn.
Képler nổi tiếng vì đã tìm ra 3 định luật về quĩ đạo của các hành tinh. Nhưng điều mà giới
toán học nhớ đến ông là các nghiên cứu về coniques. Chính ông là người đầu tiên đã dùng từ
"tiêu điểm" và "một điểm ở vô tận". Mặt khác ông cũng có sáng kiến chia nhỏ một mặt ra thành
những phần vô cùng nhỏ mà diện tích ấy tính được, rồi lấy tổng của chúng. Tuy phương pháp
của ông chưa thật có hệ thống lắm, nhưng đó chính là nhưng ý tưởng báo hiệu cho Lý thuyết
các vô cùng nhỏ, không thể chia nhỏ hơn của Cavalieri. Chính nhờ đó mà ông đã suy ra diện
tích quỹ đạo của các hành tinh( trong chứng minh của ông có hai cái sai, nhưng may mắn thay
chúng triệt tiêu lẫn nhau !).
Định luật thứ nhất: Các hình tinh trong thái dương hệ đều có quỹ đạo ellipse, mà mặt trời
là tiêu điểm.
Định luật thứ hai: Trong những khoảng thời gian t bằng nhau, vật quay sẽ quyét những
diện tích hình quạt bằng nhau.
Định luật thứ ba: Gọi T là chu kỳ của một thiên thể, a là nửa bán kính lớn của ellipse quỹ
T2
đạo. Tất cả các thiên thể trong vũ trụ đều có chung một tỷ lệ 3 .
a
Cột A: khoảng cách với mặt trời (đơn vị: triệu km).
Vì các hành tinh đều có quỹ đạo ellipse, nên ở đây là khoảng cách trung bình.
Cột D: trọng lượng của một vật có trọng lượng bằng 1kg trên trái đất.
Theo Newton, nếu một người trên trái đất (bán kính 6400 km) nặng M kg, thì trên hành
R 2 mi
tinh i sẽ nặng 2 kg (với mi và ri là khối lượng và bán kính hành tinh i).
ri M
Theo cột D thì người này hầu như sẽ có cùng trọng lượng trên Kim, Thổ, Thiên vương và
Hải vương tinh; trên Thủy tinh chỉ còn 0.4M nhưng trên Mộc tinh là 3M .
Cột E: Chu kỳ quay quanh mặt trời (88d : 88 ngày, 10y : 10 năm).
Càng gần mặt trời, sức hút mặt trời lên hành tinh càng lớn, nếu không quay nhanh để tạo
ra một lực ly tâm lớn thì hành tinh sẽ lao vào mặt trời. Điều này cắt nghĩa tại sao càng gần
mặt trời, hành tinh quay càng nhanh. Và như thế nếu có một ai đó sống được trên Thủy
tinh, một năm của họ sẽ kéo dài 88 ngày. Ngược lại, nếu sống trên Thổ tinh, phải 30 năm
mới được... ăn Tết mộ lần.
Cột F: Chu kỳ quay quanh trục của nó ()58d : 58 ngày, 17h : 17 giờ).
Càng gần mặt trời, sức hút mặt trời lên hành tinh càng lớn, và lực hút này có tác dụng
"trì" hành tinh lại, làm giảm vận tốc quay quanh trục (trừ Kim tinh là một trường hợp đặc
biệt). Và dĩ nhiên càng xa mặt trời, hành tinh quay nhanh hơn. Một ngày trên Mộc trinh
chỉ kéo dài 10 tiếng.
Một khẩu đại bác nghiêng một góc α so với mặt đất, bắn một viên đạn khối lượng
m với vận tốc đầu v0 . Khảo sát hiện tượng.
.y
.v0
.mg
.α .x
.
Hình 8.1:
> restart:with(plots):with(plottools):
> Digits:=4:alias(alpha=a):
Chọn hệ tọa độ trực chuẩn với y ¡ 0 hướng lên trên, gọi g là gia tốc trọng trường. Áp dụng
nguyên lý cơ bản về động lực học lên m, ta có hệ:
y 2 (t) = g
"
x2 (t) = 0 (8.1.1)
Vì Maple xuất trình lời giải x(t), y(t) theo một thứ tự bất kỳ nên nếu muốn lấy được x(t)
và y(t) ta cần thực hiện[1 ]:
> ex:=subs(s,x(t));ey:=subs(s,y(t));
#
ex := v0 cos(α)t
ey := gt2 + v0 sin(α)t
s := 1
2 (8.1.3)
Loại t trong biểu thức ex, ta có phương trình chuyển động y = f (x):
> y:=subs(isolate(x=ex,t),ey);
gx2
y :=
1 sin(α)x
+
2 v0 cos2 (α) cos(α) (8.1.4)
1
Độ cao tối đa của viên đạn: tại điểm khi đạo hàm y (x) đổi dấu (ta gán kết quả vào một
hàm số h(α)):
> solve(diff(y,x),x):
> h:=unapply(subs(x=%,y),a);
v 2 sin(α)2
h = α ÞÑ 0
g
Và độ cao này tương đương với góc bắn:
> solve(D(h)(a),a);
π
0,
2
Điểm viên đạn rơi: khi y(x) = 0 (Phương trình 8.4). Gán kết quả vào một hàm số q(α)):
> p:=solve(y,x):
> q:=unapply(combine(p[2],trig),a);
v 2 sin(2α)
q := α ÞÑ 0
g
d
Và tầm bắn xa nhất tương đương với góc bắn (giải phương trình q(α) = 0):
dα
> solve(D(q)(a),a);
1
π
4
Thời gian viên đạn bay: thời gian sao cho y(t) = 0. Dùng biểu thức của ey (8.3). Gán kết
quả vào một hàm số t(α):
> solve(ey,t);
v0 sin(α)
0, 2
g
> t:=unapply(%[2],a):
Áp dụng bằng số: đặt g = 10m/s2 , v0 = 300m/s , và khai báo một chuỗi các góc bắn (α =
π
k , k = 2..6):
16
> g:=10:v0:=300:s:=seq(k*Pi/16,k=2..6);
π 3π π 5π 3π
s := , , , ,
8 16 4 16 8
1
Kết quả được sắp xếp khác với trong worksheet cho dễ nhìn
Độ cao tối đa, điểm rơi (mét) và thời gian bay (giây) của viên đạn tương ứng với 5 góc bắn
trên đây là :
> 'h'=seq(evalf[4](h(i)),i=s);
'q'=seq(evalf[4](q(i)),i=s); 't'=seq(evalf[4](t(i)),i=s);
h=(659.2, 1389., 2250., 3112., 3840.)
q=(6363., 8314., 9000., 8314., 6363.)
t=(22.97, 33.34, 42.42, 49.90, 55.43)
> g1:=plot({ seq(y,a=[s])},x=0..9000,0..4000):
> g2:=plot([[0,2000],[2000,2000],[0,0],[2000,2000],[2000,0]]):
> v0:=900:
> g1a:=plot({seq(y,a=[s])},x=0..85000,0..38000):
> g2a:=plot([[0,10000],
[10000,10000],[0,0],[10000,10000],[10000,0]]):
> plots[display](g1,g2); [hình 8.2 (a)]
> plots[display](g1a,g2a); [hình 8.2 (b)]
Hình 8.2: Quỹ đạo trong trường hợp không ma sát với: (a) v0 = 300 và (b) v0 = 900m/s
π 3π
Hai hình 8.2 (a) và (b) gần như giống nhau hoàn toàn : q( ) = q( ) là tầm bắn ngắn nhất,
8 8
π 3π
q( ) xa nhất, h( ) cao nhất. Và nếu có tăng hoặc giảm v, hình dáng hai đồ thị vẫn không thay
4 8
đổi.
Bây giờ chúng ta giả sử có một chiếc xe khởi hành từ điểm x0 ¡ 0 và di
∼∼∼∼∼∼∼
chuyển trên trục Ox về hướng x ¡ 0 với vận tốc vh không đổi. Tìm góc α
để bắn trúng xe.
v0 = 300m /s):
> v0:=300: eq:=(q(a)-x0)/vh=t(a);
90000 sin(2α) x0
eq := = 60 sin(α)
vh
Giải phương trình theo α ta được một kết quả vô cùng phức tạp :
> r1:=solve(eq,a);
( )
1 x0 + 60%vh
r1 := arctan %1,
18000 %
%1 = RootOf (324000000 Z + (324000000 + 3600vh2 ) Z 2 + 120x0 Zvh + x20 )
4
Trong trường hợp này chúng ta gán cho lời giải vào một hàm với hai biến là
(x0 , v0 ), rồi thử với một vài giá trị của hai biến này (x0 = 6000m , vh = 5m /s):
> f:=unapply(r1,x0,vh):
> evalf(f(6000.,5));
.3731
Quan sát biểu thức của r1, chúng ta thấy đây là một phương trình bậc 4,vậy còn 3 nghiệm
khác. Để hiển thị mọi nghiệm, phải dùng hàm allvalues trong lệnh solve:
> r2:=evalf(subs(x0=6000,vh=5,[allvalues(r1)]));
r2 := [1.184+0.1308e4 I, .3745+0.2140e3 I, 2.783+0.2137e3 I, 1.915+0.1437e4 I]
Kết quả 4 nghiệm đều là nghiệm phức. Rõ ràng là có chuyện gì không ổn ! Thực ra đây là
một trường hợp tế nhị thường gặp khi tính toán bằng số. Quan sát ta thấy các phần phức đều rất
nhỏ, và tất cả 4 nghiệm đều là số thực. Dĩ nhiên ta chỉ chọn các nghiệm có phần thực dương [2 ]:
> r3:=op(select(¡is(i>0),[Re(r2[j])$j=1..nops(r2)]));
r3 := 1.184, 0.3745
Để kiểm chứng kết quả của hai lời giải trên, ta chỉ cần so sánh thời gian bay t(α) của viên
đạn và thời gian xe chạy. Thời gian xe chạy là :
> tc:=(x0,vh,a)¡(q(a)-x0)/vh;
q(α) x0
tc := (x0 , vh , α) ÞÑ
vh
Thay số và so sánh với thời gian viên đạn bay. Ta tính luôn khoảng cách (từ gốc tọa độ):
> tc(6000,5,r3[1]),t(r3[1]),q(r3[1]);
57.60, 55.56, 6288.
> tc(6000,5,r3[2]),t(r3[2]),q(r3[2]);
25.60, 21.94, 6128.
Kết luận : hai góc bắn trúng xe là 1.185 rad 67o88 (xe đi được 287m) và 0.3728 rad
21o30 (xe đi được 109m).
Vì bắn lên trời chứ không bắn xuống đất ! Mặt khác ta phải có α P [0,
2 π
]
2
my 2 (t) = kvy |v | mg
> y1:=diff(y(t),t):y2:=diff(y1,t):x1:=diff(x(t),t):x2:=diff(x1,t):
> v:=sqrt(x1ˆ2 + y1ˆ2);
d
( )2 ( )2
d d
v := x(t) + y(t)
dt dt
> eqx:=diff(x(t),t$2)=-x1*k/m*'v';[3 ]
3
v được đặt trong dấu (') để có thể hiển thị chữ v thay vì biểu thức phức tạp của nó.
> eqy:=diff(y(t),t$2)=-y1*k/m*'v'-g;
$
'
& eqx :=
d2 k d
2
x(t) = x(t)v
dt2 m dt
eqy := 2 y(t) = y(t)v g
'
%
d k d
dt m dt
> cond:=D(y)(0)=v*sin(a),D(x)(0)=v*cos(a),x(0)=0,y(0)=0:
> s:=dsolve({eqx,eqy,cond},{x(t),y(t)});
Phép giải hình thức không đưa ra lời giải cho bài toán phức tạp này, phải đưa đến phép giải
bằng số gần đúng. Để giải bằng số, cần phải cho các giá trị số. Chúng ta dùng lại các số liệu
trong mục (8.1) cộng thêm m = 50kg (hệ MKS) vì khi đó với trường hợp không ma sát, lần này
phương trình chuyển động phụ thuộc vào m. Sau cùng cho k = 1, nghĩa là hệ số ma sát tối đa:
> k:=1:g:=10:v:=900:m:=50:a:=Pi/4:Digits:=4:
> s:=dsolve({eqx,eqy,cond}, {x(t),y(t)},numeric);
s := proc(rkf 45x ) . . . endproc
Có nhiều phương pháp để giải phương trình bằng số, mặc định Maple Gunge-Kutta 4 hoặc
5 nút. Kết quả là một chuỗi số khá phức tạp. [4 ]
> s(.03);
d
[t = 0.03, x(t) = 15.2660497092393293, x(t) = 414.341519104685861,
dt
d
y(t) = 15.2621296241892282, = 413.016962647166963]
dt
Trên đây là giá trị của hàm kết quả s vào thời điểm t = 0.03. Hàm cho giá trị của
x(t), y(t)vx (t), vy (t). Để vẽ đồ thị y = f (x), vấn đề đặt ra là phải thay đổi từ đầu đến đâu?
Riêng trong trường hợp này chúng ta chỉ cần y(t) vậy là không còn cách nào khác là phải "lần
mò" từng giá trị của t đến khi y(t) 0. Dưới đây chúng ta chỉ tìm x(t) và y(t) : [5 ]
> [subs(s(9),x(t)),subs(s(9),y(t))];
[180.705204957416953, 18.5527249728920652]
> [subs(s(10),x(t)),subs(s(10),y(t))];
[181.832601218771543, -3.62096932828829132]
Vậy y = 0 khi t P [9,10] (giây). Cụ thể là lúc ấy viên đạn rơi xuống đất.
> plot([seq([subs(s(i),x(t)),subs(s(i),y(t))],i=0..10)]);
[hình 8.3 (a)]
Trong hình [8.3 (a)] ta thấy với cùng góc bắn và một vận tốc đầu, viên đạn chỉ đi được một
khoảng cách rất ngắn ( w 180m so với tầm bắn 80km trong trường hợp không có ma sát). Sức
cản của không khí đã có một tác động vô cùng to lớn. Trong trường hợp trên, ta lấy k = 1, nó
tương đương với một lực ma sát tối đa. Trên thực tế lực ma sát tùy thuộc vào các yếu tố : hình
dáng, chất liệu viên đạn và mật độ không khí. Bây giờ, để gần với thực tế, chúng ta giảm lực
ma sát này bằng cách áp dụng một tỷ lệ nhỏ (k ! 1):
> k:=1/10:
> s:=dsolve({eqx,eqy,cond},{x(t),y(t),numeric}):
Và thay vì dò tìm "thủ công", ta có thể tìm ra ngay t sao cho y(t) 0:
> for i from 1 to 1000 while subs(s(i),y(t)) > 0 do od: i;
4
Mặc dù Digits = 4 nhưng các kết quả của hàm s vẫn gồm 15 số lẻ
5
s (Kết quả của(dsolve,numeric) là một hàm có nhiều sai số giữa hai lần thực hiện. Vậy bạn đọc cũng
đừng ngạc nhiên nếu thu được một kết quả không hoàn toàn giống như ở đây
1
Hình 8.3: Đạn đạo với hệ số ma sát bằng : (a) k = 1 (tối đa) và (b) k =
10
25
> plot([seq([subs(s(n),x(t)),subs(s(n),y(t))],n=0..i)]);
[hình 8.3 (b)]
Nhận xét:
fr
Với lực ma sát bằng , viên đạn bay cao và xa hơn gần 9 lần - [hình 8.3 (b)]. Về đạn
10
đạo, đạn vẫn rơi gần như thẳng đứng.
Ta có thể vẽ đồ thị bằng hàm odeplot trong gói plots, nhưng cũng vẫn phải dò dẫm để
tìm t khi y(t) 0. Ta có thể không xác định các giá trị của t, trong trường hợp đó Maple
lấy mặc định t=-10..10 :
> plots[odeplot](s,[x(t),y(t)],0..i,color=black):
Trong hình 8.3 (a), đồ thị có vẻ gẫy khúc. Lý do là chỉ dùng 10 điểm để vẽ. Để có được
hình mịn hơn ta dùng nhiều điểm hơn:
> plot([seq([subs(s(i*2),x(t)),subs(s(i*2),y(t))],i=0..10*2)]);
Đến đây chúng ta có thể đặt câu hỏi: Trong trường hợp có ma sát không
π
khí phức tạp, góc bắn xa nhất có phải là nữa không?
4
Căn cứ vào đạn đạo (rơi thẳng đứng), câu trả lời có lẽ sẽ là không. Cách duy nhất để tìm
câu trả lời là lập trình.
Ý tưởng: chúng ta sẽ laạp trình để tính tầm bắn tương ứng với nhiều góc bắn khác nhau và
sau đó dùng nội suy để tìm ra phương trình của hàm só tầm bắn theo biến và góc bắn. Sau đó
chúng ta đi tìm cực trị của hàm này.
Chương trình có tên là canon. canon sẽ có hai hàm số nhập vào (input) là vận tốc đầu
π
v0 và tỷ lệ k của lực ma sát. Nơi xuất ra (output), sẽ có đồ thị của 5 góc bắn thay đổi từ đến
10
π
7 và một chuỗi 5 phần tử có 3 thông tin: góc bắn thời gian và độ xa.
30
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
1. restart:
2. canon:=proc(v0,k)
3. global y1,y2,i,j,m,s,v,x1,x2,eq,cond,g,a,r,ig,param, gr:
5. ig:=1:g:=10:m:=50:param:=NULL:
6. y1:=diff(y(t),t):y2:=diff(y1,t):x1:=diff(x(t),t):x2:=diff(x1,t):
7. v:=sqrt(x1ˆ2+y1ˆ2);
8. eq:={y2=-g-y1*v*k/m,x2=-x1*v*k/m};
9. cond:={D(y)(0)=v0*sin(a),D(x)(0)=v0*cos(a),x(0)=0,y(0)=0};
10. r:=i*Pi/30$i=3..7;
11. for a in r do
12. s:=dsolve(eq union cond,{x(t),y(t)},numeric);
13. for i from 1 to 500 while subs(s(i),y(t))>0 do od:
14. subs(s(i),x(t)):param:=param,[a,i,evalf(%,6)]:
15. gr[ig]:=plots[odeplot](s,[x(t),y(t)],0..i);
16. ig:=ig+1:
17. od:
18. print(param);
19. i:='i':plots[display]([gr[i]$i=1..nops([r])]);
20. end:
π
Bảng 8.1: Chương trình của 5 góc bắn với độ gia tăng
30
Sau ki nhập chương trình ở Bảng 8.1, ta thử với vận tốc đầu v0 = 900(m/s) và sức cản
1
không khí fr = :
40
> canon(900,1/40);
Vì đồ thị 8.8 (a) quá nhỏ nên phải phóng đại ra bằng cách dùng view để xác định tầm nhìn.
Nhưng để làm được điều này, chỉ có một cách duy nhất là dùng biến toàn cục (global) thay vì
biến cục bộ local. Ta đặt tên cho biến là gr và hiển thị bằng Hình 8.8 (b):
> plots[display]([gr[i]$i=1..4],view=[4000..4900,0..800]);
π π
, tầm bắn và cao độ từ từ gia tăng, nhưng đến thì
Căn cứ vào đô thị ta thấy khởi đầu từ
10 5
tầm bắn giảm, và vì cao độ vẫn tiếp tục tăng, ta có thể suy luận ra rằng tầm
[ bắn liên
] tục giảm đến
π π 7π
0 khi α = !. Điều này có nghĩa là góc bắn xa nhất phụ thuộc khoảng , hay [18o , 42o ].
2 10 30
Để tìm góc bắn xa nhất ta dùng nội suy Lagrange. Trước tiên phải kiến tạo dãy các góc và tầm
bắn bằng biến toàn cục param, sau đó tìm cực trị:
> va:=[seq(param[i,1],i=1..nops([param]))];
[ ]
π 2π π π 7π
, , , ,
10 15 6 5 30
[ ]
Hình 8.4: Đạn đạo 5 góc bắn α P
π 7π
, với ma sát
10 30
> vd:=[seq(param[i,3],i=1..nops([param]))];
vd := [4722.32, 4824.12, 4864.68, 4758.84, 4561.90]
> f:=interp(va,vd,alpha);
α4 α3 α2
f := .473985107 4 .322704107 3 + 7007.45 + 752405. 2 70561.0 απ
π π π
> R:=[solve(diff(f,alpha),alpha);]
R := [.27896, .50333, .82190]
> evalf[5](map(convert,R,degrees));
[15.983.degrees, 28.893.degrees, 47.091.degrees]
[ ]
Chỉ R2 P π 7π
,
10 30
vậy góc bắn xa nhất 28.8o và tầm xa tương ứng là:
> evalf(subs(alpha=R[2],f),7);
4867.59
Hình 8.5 biểu diễn hàm nội suy và tọa độ của điểm cực đại. Ta dùng các kết quả vừa tính
được để vẽ:
> g1:=plot([[R[2],0],[R[2],%],[0,%]],linestyle=4):
> g2:=plot(f,alpha=0..1,4400..5000,color=black):
> plots[display](g1,g2,labels=[rad,mét]);[6 ]
Ta cũng có thể dùng nội suy spline. Phép nội suy n cho ta bốn hàm số. Cẩn thận khi trích
ra hàm thích ứng để lấy cực trị (tương ứng với R ở đây ta phải lấy hàm thứ hai tức op(4,sp))
> convert(va,float):[7 ]
> sp:=spline(%,vd,alpha,cubic):
> subs(u=solve(diff(op(4,sp),u))[2],op(4,sp));
6
Ta có thể đánh chữ mét để có kết quả như trong hình!
7
Ở phiên bản 8, phải hoán chuyển dãy va thành dạng float
4867.02722
Hình 8.5:
Các tính toán sau đây cho thấy khi: α 28o ( rad) và lực ma sát =
1 1
thì tầm bắn xa nhất
2 40
khoảng 4867m. Bây giờ người ta nối dài tầm bắn bằng cách dùng một loại đạn đặc biệt. Loại
đạn này có trang bị thêm một ít thuốc nổ, và thuốc nổ này sẽ phát hỏa trên không để tạo ra thêm
một sức đẩy cho đạn đi xa hơn.
Logic nhất là chúng sẽ phát hỏa khi đạn đạt đến độ cao cực đại, có nghĩa là khi vận tốc dọc
vy = 0. Chúng ta dùng lại các biến và các giá trị như câu trên:
> restart:with(plots):
> y1:=diff(y(t),t):y2:=diff(y1,t):x1:=diff(x(t),t):x2:=diff(x1,t):
> v:=sqrt(x1ˆ2+y1ˆ2):
> eq:={y2=-g-y1*v*k/m,x2=-x1*v*k/m}:
> cond:={D(y)(0)=v0*sin(a),D(x)(0)=v0*cos(a),x(0)=0,y(0)=0}:
> g:=10:m:=50:v0:=900:a:=1/2:k:=1/40:
> s1:=dsolve(eq union cond,{x(t),y(t)},numeric);
Lệnh sau đây thực hiện việc tìm thời điểm khi đạn lên độ cao nhất và khi rơi xuống đất:
> j:=0:for i to 300 while subs(s1(i),y(t))>0 do
if subs(s1(i),y1)<0 and j=0 then j:=i:fi:od:
> j-1,i;
12, 32
Nghĩa là khi t Ñ 12, vy Ñ 0 đạn với độ cao cực đại, và ở t 32 đạn sẽ rơi xuống đất [Hình
8.6 (a)]
Ở thời điểm t = 12, nghĩa là khi đạn tới độ cao cực đại, giá trị tính được là:
> s1(12);
Tầm bắn bây giờ là 6633 mét với thời gian khoảng 12 + 21 = 33 giây.
8
trên nguyên tắc sẽ có 12 số lẻ
π
Hình 8.7: (a), (b): Các hàm sức cản p(h) và (c) tầm bắn tương ứng với α =
4
di chuyển trên trục Ox về hướng x ¡ 0 với vận tốc không đổi. Tính góc
riêng của khẩu súng để bắn trúng xe.
Điều khác biệt căn bản so với 8.1 là không có phương trình giải tích để lấy cực trị mà chỉ
có 3 dãy của những góc bắn va, thời gian vt và tầm bắn vd rút ra từ biến param và các hàm
nội suy. Vì thế phương pháp không khác so với mục 8.2.3.
9
Cung thủ của thời Đông Chu (200 năm trước Công Nguyên) với khả năng "bách bộ xuyên dương"
Sửa chương trình ở bảng 8.1 và thay một dòng duy nhất (dòng thứ 9)
r:=i*Pi/50$i=3..8
Khởi động lại chương trình và có kết qủa như sau:
> canon(900,1/40);
> display([seq(gr[i],i=1..6)],view=[4000..4900,0..600]);
[ ] [ ] [ ]
3π 2π π
, 17, 4249.74 , , 20, 4481.61 , , 24, 4722.32 ,
50 25 10
[ ] [ ] [ ]
3π 7π 4π
, 27, 4830.24 , , 29, 4842.14 , , 32, 4866.27
25 50 25
π
Hình 8.8: Đạn đọa của 6 góc bắn với độ gia tăng
50
⃝
a bắn tại một điểm cho sẵn C: Nếu cho sẵn C ta có thể tính được thời gian xe chạy trước
khi đến C và đặt là t1 và tính được thời gian viên đạn bay nhờ hàm nội suy f dt(xc ) và đặt là t2 .
Để có nghĩa, cả hai thời gian này bắt buộc phải nằm trong khoảng thời gian định bởi dãy va.
Nếu t2 t1 có nghĩa là viên đạn tới C trước. Để bắn trúng phải đợi t1 t2 giây trước
khi bắn.
Nếu t1 t2 có nghĩa là chiếc xe tới C trước, như thế sẽ chẳng bao giờ bắn trúng xe. Bài
toán không có lời giải. Vì không thể với một tọa độ có hai thời gian hoặc hai góc bắn trúng.
Đừng quên ột điều quan trọng là tất cả các dãy va, vd, vt đều phải là các dãy đồng biến nghiêm
cách và các hàm nội suy đều là các song ánh.
⃝
b bắn vào một điểm sớm nhất: Vì tính chất các hàm nội suy đã trình bày ở trên, người ta
có thể nói rằng thời điểm sớm nhất để bắn trúng là lúc se khởi hành, nghĩa là viên đạn và chiếc
xe phải khởi hành cùng lúc. Mặt khác trường hợp ⃝ a cũng là trường hợp ⃝b nhưng chỉ lùi thời
gian lại một tý.
Tóm lại, điều chúng ta quan tâm là tính góc bắn vào mọt thời điểm sớm nhất, và cách này
có nhiều ứng dụng có thể khai triển về sau.
Bây giờ chúng ta vẽ đồ thị của các hàm nội suy:
> plot(ftd,vt[1]..vt[6]); [Hình 8.9 (a)]
> plot(fdt,vd[1]..vd[6]); [Hình 8.9 (b)]
> plot(fad,va[1]..va[6]); [Hình 8.9 (c)]
Xem đồ thị hàm nội suy f dt(u) [Hình 8.9 (b)] thì thấy khi d P [4260, 4460], t có giá trị âm
và đồ thị cũng chẳng là một song ánh. Mặt khác, dù là hai hàm đảo nhưng f dt(u) cũng không
có vẻ đối xứng qua đường phân giác thứ nhất so với f td(u). Tóm lại cách n suy này sai hoàn
toàn và phải đổi phương pháp khác.
10
Ngoại trừ ở các giá trị biên (hiện tượng Runge)
[ ] [ ] [ ]
π 7π 2π
, 24, 4722.32 , , 26, 4786.33 , , 28, 4824.12
10 60 15
> va:=[seq(param[i,1],i=1..nops([param]))];
> vt:=[seq(param[i,2],i=1..nops([param]))];
> vd:=[seq(param[i,3],i=1..nops([param]))];
[ ]
π π π π 7π 2π
, , , , ,
20 15 12 10 60 25
[15, 18, 21, 24, 26, 28]
[4052.81, 4334.20, 4554.35, 4722.32, 4786.33, 4824.12]
> ftd:=unapply(spline(vt,vd,t,cubic),t):
> fdt:=unapply(spline(vd,vt,x,cubic),x):
> fda:=unapply(spline(vd,convert(va,float),x,cubic),x):
> fad:=unapply(spline(convert(va,float),vd,a,cubic),a):
> plot(ftd,vt[1]..vt[6]);plot(fad,va[1]..va[6]);plot(fda,vd[1]..vd[6]);
π
Hình 8.11: Đạn đạo của 6 góc bắn với độ gia tăng
60
> plot(fda,vd[1]..vd[6]);
Quan sát các đồ thị 8.12 thì có một điều lạc quan là không còn các dạng ngoắt ngoéo hoặc
các giá trị bất thường. Một điều đáng mừng nữa là fad(a) và fda(x) là hai hàm đảo nhau hầu
như đối xứng qua đường phân giác thứ nhất. Bây giờ ta sẽ kiểm chứng những giá trị tính được:
Giả sử xe khởi hành ở x0 với lần lượt các vận tốc vi , để tìm thời gian bắn trúng xe sớm nhất,
phải giải phương trình:
f dt(t) = vi t + x0 (Hàm nội suy thời gian theo tầm bắn)
Nhưng trước tiên để có một cái nhìn cụ thể, ta vẽ đồ thị hàm f td(t) cùng với các đường
thẳng di (t) = vi (t) + x0 .
> dr:=plot([vt[1],t,t=3000..max(op(vd))]): (vẽ đường thẳng x = 15)
> gr:=plot([ftd(t),seq((3900+t*i),i=[2,17,23,32])],
t=1..32,3400..4950):
> display(dr,gr);
Hình 8.13 cho thấy 4 đường thẳng tượng trưng cho chuyển động của xe với vi = 2, 17, 23,
32m/s, với x0 = 3900m đường thẳng t = 15 = vt[1] biểu tương cho giới hạn thời gian. Nên
nhớ hàm nội suy thời gian chỉ nằm trong khoảng [15, 32] giây. Giao điểm của các đường thẳng
di chính là thời gian sớm nhất để bắn trúng xe.
Với v0 = 2:
Lệnh dưới đây tính thời gian băn trúng xe và thời gian đó phải lớn hơn vt[1] (15 giây):
> op(select(i¡i>vt[1],[solve(ftd(t)=3900+t*2)]));
Vô nghiệm! Trên Hình 8.14 cũng cho thấy giao điểm A ở vào khoảng 13.5 giây. Ta có
thể tính dễ dàng vận tốc tối thiểu:
> ftd(15);
4052.81
Hình 8.12: Các hàm nội suy spline của fdt(t), fad(a), fda(x)
> solve((%-3900)/vm=fdt(%));
10.1873
Với v0 = 17:
> T:=op(select(i¡i>vt[1],[solve(ftd(t)=3900+t*17)]));
T := 16.2671
> ftd(T); fdt(%);
4176.5415, 16.2462927
> fta(%); evalf(fad(%));
0.0568π, 4173.5621
Cụ thể là xe vị bắn ở d = 4176m, sau 16.24 giây, góc bắn 0.0568πrad(10.23 độ ), và từ
góc bắn này ta nội suy ngược ra tọa độ (4173.56) với một sai số là:
> %-ftd(T);
Hình 8.13:
2.979
Với v0 = 23:
> T:=op(select(i¡i>vt[1],[solve(ftd(t)=3900+t*23)]));
T := 17.6787
> ftd(T); fdt(%);fta(%);evalf(fad(%));
4306.6111, 17.6713, 0.0648π, 4305.4958
Với v0 = 32:
> T:=select(i¡i>vt[1],[solve(ftd(t)=3900+t*32)]);
[21.5460467, 30.24909411, 31.69626222]
Đường thẳng tương ứng với v0 = 32 cắt f td(t) ở bốn điểm trong đó có ba điểm lớn hơn
15 giây, dĩ nhiên phải lấy nghiệm nhỏ nhất.
> ftd(T[1]); fdt(%);fta(%);evalf(fad(%));
4589.4886, 21.5337, 0.860π, 4586.0135
Các sai số đều vào khoảng 3 đến 4 mét trên một khoảng cách 5000 mét. Đây là những sai
số đén từ bản chất của phép nội suy. Không thể tránh được và cũng không thể cải thiện
được. Ở đây chúng ta đã tính trên 6 số lẻ, cho dù có nâng lên 10 thì cũng không chính xác
hơn là bao, trái lại thời gian tính hầu như dài gấp đôi.
Hướng khai triển tương lai cho chủ đề "chiến tranh" này
π
- Nội suy Lagrange với độ chia các góc bắn hoặc nhỏ hơn.
60
- Thiết lập một hàm nội suy hai chiều opti(x0 , v) với (x0 và v là tọa độ và vận tốc đầu). Vẽ
đồ thị trong không gian ba chiều.
- Trong trường hợp thay vì một chiếu xe thì sẽ là một máy bay?
- Tạo hình động.
Hình 8.14:
11
Khẩu đại bác lớn nhất hồi Đệ nhất thế chiến 1914 - 1918
Hình 8.15: Hình 8.14: Đại bác Schwerer Gustav (hình mẫu trưng bày)
Nhập trận. tiêu nát bấy. Thậm chí tầu vè trên mặt nước
Khi khẩu Dora đầu tiên xuất xưởng vào cũng bị đánh chìm. Sau đó pháo đài Staline
tháng 11/1941 thì mục tiêu đầu tiên đã không cũng sụp đỏ sau khi lanh trọn 6 quả. Bắn xong
còn. Chiến lũy Maginot đã rơi vào tay quân 14 phát Dora nghỉ vì chuẩn bị cho một viên đạn
Đức một cách quá dễ dàng trước đó. Bộ Tham cực kỳ phức tạp.
Mưu Dức dự tính đem Dora xuống tuêu diệt Hôm sau, chỉ cần 7 phát, pháo đài Molo-
căn cứ Anh đang chiếm giữ eo biển Gibral- tov đã thành đóng gạch vụn, và ngày qua ngày
tar. Muốn thế phải đi xuyên qua Tây Ban Nha, các pháo đài Siberie, Maxime Gorky lần lượt
nhưng trong đệ nhị thế chiến, Tây Ban Nha, bị đánh sập. Ngày 1/7/42, toàn vẹn Sebastopol
trung lập và Tướng Franco không cho phép rơi vào tay quân Đức. Tổng cộng Dora "mới"
Hitler đi vào lãnh thổ mình. Người Đức phải chỉ mã 48 phái, và đó cũng là 48 phát cuối cùng.
tìm một chiến trường khác, và điều đó đã xảy Vì sau khi Sebastopol thất thủ Dora được tháo
ra trên mặt trận phía Đông. ra và đưa vào xưởn bảo trì ở Essen. Sau khi
Vào năm 1941, quân đội Đức xâm chiếm xuất xưởng, Dora không tìm ra mục tiêu "xứng
Liên Xô với chiến dịch Barbarossa dưới sức đáng" nên đành bỏ phế. Nhều ý tưởng chỉnh
chống trả yếu ớt của Hồng quân Liên Xô. Mỗi sửa Dora cho gọn nhẹ hơn nhưng đã không
ngày Đức tiến sâu hàng trăm cây số và tiến sát được thực hiện.
tới cảng Sebastopol nổi danh "bất khả chiến Người ta tự hỏi tại sao vào năm 1944 Hitler
bại" gồm địa thế thiên nhiên cũng như những không điều Dora đến bờ Normandie để ngăn
pháo đài vô cùng kiên cố. Hồng quân đã chuẩn chặn cuộc đổ bộ ? vì mỗi phái đạn có thể đánh
bị chiến tranh bằng cách cho xây nhưng hầm đắm dễ dàng một thiết giáp hạm. Nhưng nói
chứa đạn sâu dưới đáy biển vịnh Sever-naya. cho cùng, cho dù có sức công phá khủng khiếp
Trong suốt một tháng, nửa triệu viên đạn đại nhưng chỉ hiệu quả với nhưungx mục tiêu cố
bác đã rơi xuống đây nhưng căn cứ này vẫn đinh kiểu Sebastopol, đó là chưa kể thời gian
đứng vững. nạp đạn quá lâu đủ cho đối phương phản công.
Dora được điều tới "xử" Debastopol. Tuy nhiên điều quan trọng hơn cả là vào năm
Nhày 5/6/1942, sau nhiều tuần lễ chuẩn bị, 1944, quân Đức không biết được ở đâu và lúc
Dora nã những viên đạn đầu tiên nhắm vào các nào cuộc đỏ bộ sẽ xảy ra.
hầm chứa đạn. Nhưng viên đạn 7 tấn đi qua 30 Biết được những yếu điểm của Dora,
mét nước, xuyên thủng bê-tông như đạu hủ và Hitler đã ra lệnh chế tạo ra khẩu Dora đời mới
phái nổ bên trong hầm đạn. Chỉ sau 8 phát, mục có tầm bắn lên đến 160 km, nghĩa là có thể
đứng trên bờ biển Pháp nã đạn vào thủ đô Lon- sớm kết thúc sớm. Vào những phút sau cùng
don, nhưung lúc ấy quân đội Đức đang gấp rút của cuộc chiến, người Đức đã ra lện phá hủy
khai triển hỏa tiễn V-1 và V-2 gọn nhẹ và có Dora bằng chất nổ và khi hòa bình tái lập,
tầm bắn cực xa. những phần của Dora được nấu chảy đẻ phục
Cũng may cho nhân loại là chiến tranh đã vụ cho việc xây dựng đất nước.
Dao động là một bài toán chiếm một vị trí quan trọng trong cơ học, nó thường đòi hỏi một
khốilượng tính toán khá lớn, đặc biệt là phép giải phương trình và hệ phương trình vi phân; và
đó chính là điểm mạnh của Maple. Mặt khác trong chương này, chúng ta cũng khai thác một ưu
điểm khác của Maple là tạo hình động. Nhờ đó chúng ta có thể quan sát và khảo sát những hiện
tượng mà không thể hoặc không dễ thấy được trong các phòng thí nghiệm cổ điển.
Vì tính phức tạp và đa dạng của bài toán, chúng ta sẽ lần lượt khảo sát các hiện tượng sau:
Lò xo đơn: dao động tự do và có lực giảm xóc. Tính toán hình thức.
Hệ ba lò xo kết nối với một đầu tự do. Tính toán số.
Hệ hai lò xo kết nối. Tính toán hình thức và tính toán số.
f (x) = sin(ux + v) = 0 ñ
ua + v = 0
ub + v = 2π
9.1. Lò xo nằm ngang
Tuy nhiên đây chỉ là một hình dạng sin có chu kỳ là (b a)π, tần số và biên độ bằng 1. Để
cho lò xo "thực" hơn, chúng ta giảm biên độ xuống một nửa và tăng chu kỳ lên 5 (lò xo có 5
vòng xoắn), nghĩa là chia hàm số cho 2 và biến hàm sin(x) thành sin(5x). Và sau cùng phương
trình lò xo có dạng:
> RS:=(a,b) ¡plot(sin(5*(2*Pi*x/(b-a)-2*Pi*a/(b-a)))/2,x=a..b,SC);
( )
RS := (a, b) ÞÑ plot
1 2πx 2πa
ba ba
sin(5( )), x = a..b, SC (9.1.1)
2
Và để hiển thị một lò xo có hai đầu nằm trên trục hoành có tọa độ hai đầu x = 0, x = 5, có
gắn một khối tròn ở x = 5.5, bán kính 0.3:
> display(disk([5.5,0],.0),RS(0,5));
Kết quả không thấy khối tròn [hình 9.1 (a)]. Đây có lẽ là một bug của Maple: Lệnh display
gồm disk và plot, khi hiển thị Maple lấy mặc định tọa độ định nghĩa trong lênh plot (ở đây
bằng [0, 5]) và không biết đến hoành độ của khối m là 5.5. Để "chữa cháy" tạm thời, chúng ta
dùng một lệnh plot hiển thị một đoạn thẳng kéo dài trong khoảng [0, 6] [1 ]
> w:=u¡plot(0,x=0..u):
> display(disk([5.5,0],.3),RS(0,5)),w(6);
Bước vào phần tính toán, trước tiên chúng ta khai báo các ký hiệu để Maple hiển thị ra giống
1 d
như trong cách viết thông thường (x (t) thay vì viết x(t))
dt
1
Tuy nhiên nếu ta treo lò xo thẳng đứng thì đồ thị lại hoàn hảo, không có gì xảy ra
Để tiện lợi cho việc trình bày, chúng ta đặt m = 1, B = 2λ, K = ω 2 , và được:
> eq:=(D@@2)(x)(t)+2lambda*diff(x(t),t)+omegaˆ2*x(t);
eq := x2 (t) + 2λx1 (t) + ω 2 x(t) = 0 (9.1.2)
Hình 9.2:
Một trong những ưu điểm của Maple là hình động animation. Để làm điều này ta theo
quy trình sau (dĩ nhiên ta chỉ thấy được kết quả trên màn hình)[2 ]
- Định nghĩa một hàm theo t để xác định vị trí của lò xo và khối tròn (ta đã có f1 ). Rồi cộng
giá trị của f1 và hoành độ của lò xo và khối tròn.
- Cho thay đổi t để biến thành một hình động bằng cách dùng hàm display trong gói
plots, đừng quên insequence=true cần thiết cho hình động và scaling=constrained
để có một tỷ lệ cân xứng.
> g1:=t¡display(disk([5.5+f1(1,sqrt(2)/2,t),0],.3),
RS(5+f1(1,sqrt(2)/2,t),0),w(7));
2
Xin xem phần xử lý hình động - Chương 12
∆ 0ñλ ω
> f2:=unapply(rhs(%),(x0,lambda,omega,t)):
> simplify(f2(1,1/20,1/sqrt(2)): collect(%,exp);
( ) ( )
1 ?
? 1 ? ?
i 199 e1/20t(1+i 199)
1 1/20t( 1+i 199) 1
i 199 e +
2 398 2 398
Đồ thị Hình 9.3 (nét đậm) cho thấy trong trường hợp giảm xóc với cường độ nhẹ (λ ω),
biên độ có giảm nhưng tần số góc gần như không thay đổi nhiều so với khi không có giảm xóc.
> plot([f1(1,1/sqrt(2),t),f2(1,1/20,1/sqrt(2),t)],
t=0..15*Pi,linestyle=[4,1],thickness=[1,3]);[Hình 9.3 (a)]
> plot([f1(1,1/sqrt(2),t),f2(1,1/11,1/sqrt(2),t)],
t=0..15*Pi,linestyle=[1,4],thickness=[1,3]);[Hình 9.3 (b)]
Lưu ý quan trọng: Hàm f2 phải là hàm của t, nếu không sẽ gặp vấn đề khi vẽ hình động
Để tạo hình động ta làm như (9.3)
> g2:=t¡display(disk([5.5+Re(f2(1,1/20,1/sqrt(2),t)),0],.3),
RS(5+Re(f2(1,1/20,1/sqrt(2),t)),0),w(7));
> movie:=NULL:for i to 45 do movie:=movie,g2(i);od:
Error, (in evalr/shake) not a real nember
Maple xuất ra một thông báo sai. Có thể các bạn cũng có một thông báo khác:
3
Thời gian để thực hiện "đoạn phim". Tuy nhiên con số này rất tương đối, nó tùy thuộc vào xức mạnh của máy
tính, thậm chí trên cùng máy tính cũng khác nhau tùy vào tình trạng máy
1
Hình 9.3: Chuyển động với giảm xóc λ = df rac120 và
11
Đây là vấn đề thường gặp khi phải tính toán với những biểu thức có dạng phức. Để khắc
phục, ta có thể dùng Re,evalc,evalf. Re dùng để tách ra phần thực[4 ], evalc dùng biểu
thức có chứa biến hình thức (ở đây là biến t) evalf lấy giá trị số lẻ. Để "chắc ăn", ta áp dụng
luôn cả ba lệnh trên, đây cũng là dịp để thử với toán tử @. Toán tử này có công dụng liên kết
hiều lệnh:
> super:=evalf@evalc@Re:
> g2:=t ¡display(disk([5.5+super(f2(1,1/20,1/sqrt(2),t)),0],.3),
RS(5+super(f2(1,1/20,1/sqrt(2),t)),0),w(7));
> movie:=NULL:for i to 45 do movie:=movie,g2(i);od:
> display(movie,insequence=true,scaling=constrained);
Quan sát (trên màn hình) ta thấy chuyển động của hệ thống chậm dần cho đến lúc tắt hẳn.
Để có thể quan sát, cần phải chọn các giá trị của m, w và λ một cách thích hợp. Ở đây ta chọn
m = 1 nghĩa là cần số góc băng
ω
2π
. Khi ω = 3 (lò xo cứng) ta sẽ có
3
2π
0.5, chuyển động
trong một giây là rất khó quan sát vì quá nhanh. Nhưng trái lại cũng không nên trọn ω quá nhỏ
(
1
) nghĩa là lò xo quá mềm, chu kỳ sẽ rất dài và chuyển động quá chậm, không tiện quan
20
sát. Còn riêng về λ là lực giảm xóc (λ ω), nên chọ đủ để thấy chuyển động tắt dần nhưng
cũng đừng quá nhỏ so với w.
∆¡0ñλ¡ω
> combine(simplify(f2(1,4/sqrt(2),1/sqrt(2),t)),radical);
( )
? t?30 ? ? ? ?
4 15 + 15 e1/2 2t(4+ 15)
1 t 30
4 15e + 15e
30
> plot([f2(1,4/sqrt(2),1/sqrt(2),t),f2(1,8/sqrt(2),1/sqrt(2),t)],
t=0..20*Pi,linestyle=[1,4,3],thickness=[3,2,1]);
Quan sát Hình 9.4 (a), ta thấy khi lực giảm xác lớn, thì dao động không còn tuần hoàn nữa.
Lò xo đang giãn thì từ từ co lại để trở về vị trí ban đầu. Một điểm đáng lưu ý khác, là với cùng
một trị của m và ω lực giảm xóc càng nhỏ (λ nhỏ) thì vận tốc trở về vị trí cân bằng càng nhanh
(đường biểu diễn liên tục là đường tương ứng với λ = ? ).
4
2
Hình 9.4: Chuyển động với độ giảm xóc lớn ∆ ¡ 0 và (b) giảm xóc tớn hạn (∆ = 0)
Có thể thấy sự kiện này nơi ống giảm xóc ở xe, đặc biệt là các xe thể thao. Ống giảm xóc
càng cứng (λ nhỏ), thời gian trở về vị trí ban đầu càng nhanh nghĩa là xe càng bán đường, đổi
lại, tiện nghi càng kém và người lái mệt hơn (đau lưng). Ngược lại, sau một thời gian sử dụng,
ống giảm xóc mềm đi (vì nhớt đã bớt độ nhờn), λ lớn, thời gian trở về vị trí ban đầu lâu hơn,
nghĩa là xe ít bán đường hơn.
Tạo hình động (không cần dùng hàm super vì đây là nghiệm thực):
> g3:=t¡display(disk([5.5+f2(1,4/sqrt(2),1/sqrt(2),t),0],.3),
RS(5+f2(1,4/sqrt(2),1/sqrt(2),t),0),w(7)):
> movie:=NULL:for i to 40 do movie:=movie,g3(i);od:
> display([movie],IT,SC);
∆=0ñλ=ω
> f2(1,Pi,Pi,t);
Error, (in f2) division by zero
Dĩ nhiên là hàm f2 không xác định khi ∆ = 0. Ta phải tìm lời giải bằng cách thay các trị
(hình thức) vào (9.2) và giải trực tiếp:
Gọi M, B, K lần lượt là khối lượng viên bi, lực giảm xóc, và độ cứng lò xo.
Dao động của hệ thống cũng có cùng mọt vận tốc góc u và có phương trình là x(t) =
Aei(ut+ϕ)
?
> solve(diff(%),u),u);
?
0, ω 2 2λ2 , ω 2 2λ2
> select(i¡i<>0,select(i¡sign(i)>0,[%]));
?
ω 2 2λ2
Chứng minh trên cho thấy hiện tượng cộng hưởng xảy ra khi:
? c
2
u2 = ω2 2λ2 =
K
M
2M
B
2
Ứng dụng số
, ω = ? ). Dĩ nhiên
1 1
Dùng các trị số tương ứng (M = 20, K = 10, B = 1) hay (λ =
40 2
không thể chọn λ ¡ ω, vì lúc ấy không có dao động tuần hoàn. Hơn nữa, vì:
B2
2λ2 =
2M 2
=
1
800
! ω2 = M
K
=
1
2
B2
Nên để đơn giản hóa vấn đề, ta có thể loại .
2M 2 ?
2
Riêng về lực cưỡng bức ta chọn biên độ bằng 3 và vân tốc góc u = ω = . Tóm lại
2
phương trình chuyển động có độ giảm xóc và cưỡng bức sẽ là:
> lambda:=1/40:omega:=sqrt(1/2):u:=1/sqrt(2):
> F0:=3/20:x0:=1:f:=F0*cos(u*t):eq=f;
x2 (t) + λx1 (t) + x(t) = cos( ? )
1 1 3 t
20 2 20 2
> dsolve({eq=f,x(0)=1,D(x)(0)=0}):
? ?
1? 7? 1?
t) + e 40 t cos( 799t) 799e 40 t sin(
2 1 1
x(t) = 3 2 sin( 799t)
2 40 47 40
> p:=unapply(evalf(rhs(%)),t):
> plot(p(t),t=0..120);
Hình 9.6: Chuyển động khi ngoại lực (a) cùng vận tốc góc và (b) không cùng vận tốc góc
Tạo hình động (p(t) P R ), không cần dùng hàm super (9.5)):
> g5:=t¡display(disk([5.5+p(t),0],.3),RS(5+p(t),0),w(10)):
> tu:=time():
> movie:=NULL:for i to 100 do movie:=movie,g5(i);od:time()-tu;
15.911[5 ]
5
Nếu p(t) khong được khai báo với evalf, thời gian tính sẽ nhiều hơn gấp đôi. Vì khi t lớn, các phân số sẽ
> display([movie],IT,SC);
Qua đồ thị 9.6 (a) và nhất là qua hình động trên, chúng ta thấy rõ ràng tính chất, hiện tượng
cộng hưởng và nhất là những kết quả nghiêm trọng của nó. Lực cưỡng bức ở đây mang một vận
tốc góc với hệ thống và với một biên độ băng 3. Mặc dù ta chỉ kéo khối m ra 1 đơn vị chiều dài
nhưng biên độ dao đọng gia tăng từ từ cho đến khi có dài gấp 4!. Chúng ta dễ dàng tưởng tượng
ra rằng nếu lò xo không được làm bằng một loại thép tốt thì nó có thể đứt chỉ sau một thời gian
ngắn. Hình ảnh khôi hài, sinh động mà chúng ta thấy được trên màn hình đã là nguyên nhân của
nhiều tai nạn thảm khốc trên thế giới, và ký ức của con người còn ghi lại những hình ảnh sụp đổ
đầy ấn tượng của chiếu tàu Tacoma (Hoa Kỳ) và năm 1940 (Xem bài đọc thêm cuối chương).
Điều quan trọng ở?đây không phải là biên độ mà là tần só dao động. Vì nếu chúng ta tăng
2 ?
tần số lên gấp đôi (từ lên 2) thì dao động sẽ giảm đáng kể cho dù tăng biên đọ lên gấp 3
? 2
3 1
(từ lên )!
20 2
> u:=sqrt(2):F0:=1/2:eq=f;
?
x2 (t) + λx1 (t) + x(t) =
1 1 1
cos( 2t)
20 2 20
> dsolve({eq=f,x(0)=1,D(x)(0)=0}):
201 ? 1?
799e 40 t sin(
1
x(t) = 799t)+
360349 40
601 1 t 1? ? ? 150 ?
sin( 2t) 2
5
e 40 sin( 799t) + cos( 2t)
451 40 451 451
> plot(rhs(%),t=0..200); [Hình 9.6 (b)]
Ta dùng lại các định nghĩa của lò xo và khối m giống như chương trước (phương trình
(9.1)).
> restart:with(plots):with(plottools):
Lò xo thứ nhất đầu trái cố định, đầu phải có giá trị là X[i, 2]
Lò xo thứ hai đầu trái có giá trị là X[i, 2], đầu phải là Y [i, 2]
Lò xo thứ ba đầu trái có giá trị là Y [i, 2], đầu phải là Z[i, 2]
Và ta làm như thế i lần, với i là tham số của mọt hàm (thí dụ f ). Điều này có nghĩa là f (i)
là trạng thái (vị trí) của m (hay một lò xo) ở điểm i. Sau cùng để tạo hình đọng ta chỉ cần cho i
thay đổi và dùng insequence=true.
Riêng ở đây, vì một lý do không giải thích được (có thể vì sơ sót hoặc có thể giống trường
hợp 9.1), khối m bên phải không hiện ra trên màn hình. Và để giải quyết, ta phải tiếp tục "lừa"
Maple bằng cách tạo ra một hàm:
> bidon:=plot(1,x=23..23.1):
Và sau cùng, chúng ta có những dòng lệnh sau (bạn cần có mọt máy tính khá mạnh để có
thể xem "đoạn phim" này):
Bảng 9.1: Các lệnh tạo hình động cho hệ ba lò xo có một đầu tự do
Trước tiên chúng ta cần có một chút khái thẳng. Nhịp chính ở cầu treo dài hơn rất nhiều
niệm cơ bản giữa loại loại cầu : cầu bê-tông và so với cầu bê-tông, và đó chính là nguyên nhân
cầu treo: của những tai hại.
Cầu bê-tông : thoạt đầu người ta xây dựng Thử tưởng tượng khi chúng ta treo một
các trụ cầu với khoảng cách thay đổi từ 20 đến viên bi vào đầu một sợi dây, viên bi sẽ lắc lư
dưới 100m (khoảng cách này còn gọi là nhịp nếu có gió. Sợi dây càng dài, lắc càng dữ.Nếu
cầu). Tiếp đó người ta mới gác lên giữa hai trụ chiều dài này lên đến hàng trăm mét và với cơn
những cây đà (còn gọi là dầm) bằng bê-tông cốt gió 50km/h, viên bi này sẽ dao động mạnh, và
thép. Tùy theo bề mặt cầu lớn hay nhỏ, người như ta đã biết trong chương này, khi dao động
ta sẽ bố trí số dầm cho phù hợp. Lấy thí dụ đến mức cộng hưởng, biên độ sẽ tăng dẫn đến
cầu Sàigòn nằm trên xa lộ Hà Nội có 21 dầm sự phá hủy. Điều này không thể xảy ra được
tiết diện 1.5 x 1 cho mỗi nhịp 24 mét. Trên 21 với cầu bê-tông, vì để thổi văng 2000 tấn thì
thanh dầm này người ta sẽ đổ những tấm đan gió cũng đã thổi văng tất cả các công trình khác
làm mặt cầu. Tất cả những cấu trúc này đều trên mặt đất.
được gắn chặt với nhau tạo thành một khối có Cầu Tacoma trong bang Washington(Mỹ)
trọng lượng xấp xỉ 2000 tấn. Sau khi xong một do Pacific Bridge Company xây dựng với kinh
nhịp, người ta lại bắt đầu nhịp kế tiếp. phí 6,4 triệu đô la, được khánh thành vào ngày
Cầu treo : có hai loại cầu treo, cầu treo 1/4/1940. Đây là dạng cầu treo cáp thẳng có
cáp thẳng và cầu dây văng (hay cáp xéo). Ở nhịp chính 853 mét, bề rộng mặt cầu 11.7m.
Việt Nam, đến năm 2007 thì mới chỉ có cầu Để tạo cho mặt cầu độ cứng cần thiết, người
Mỹ Thuận, cầu Bãi Cháy, trong tương lai có ta gia cố hai bên thành cầu những tấm sắt có
cầu cần thơ, cầu Rạch Miễu. Tất cả đều là cầu chiều cao 2.4m. Ngay sau ngày khánh thành,
dây văng. Nhưng cho dù là dây văng hay cáp người ta đã thấy có những dao động bất thường,
treo thì nguyên tắc chung cũng chỉ là treo sàn nhưng thời ấy mọi người không quan tâm mà
cầu lên hai trụ chính. Khoảng cách giữa hai còn cảm thấy thích thú ! Có người đã đi hàng
trụ (còn gọi là nhịp chính) thay đổi từ 400 đến trăm cây số đến để hưởng thụ cảm giác "phiêu
800m cho dây văng và 500 đến 2000m cho cáp bồng" y như Tề Thiên đằng vân gia vũ ấy.
Để có một cái nhìn cụ thể, chúng ta thử cây cầu xem ra chỉ "cứng" hơn một cọng bún
chia tất cả các kích thước cho 100. Như thế sẽ ! Cũng nên nói, thoạt đầu kĩ sư thiết kế là ông
có một tấm thép tiết diện hình chữ U lật ngược 1
Clark Eldridge đã tính toán là , nhưng sau
rộng 11.7 cm, cao 2 cm, dầy 3 ly và dài 8.5 112
mét. Đem treo trước gió thì tấm thép này sẽ đó chủ đầu tư đã thuê một công ty khác duyệt
1
đong đưa, uốn éo đủ mọi chiều. Nếu là tấm lại bản thiêt kế để giảm xuống . Cõ lẽ thời
thép và những sợi dây treo bằng kim loại thì có 350
ấy người ta chưa biết đến khí động học, hoặc
thể không sao nhưng nếu đó là một vật liệu dòn
cũng đơn thuần là vì "chảnh" ! Chiều dài của
như bê-tông thì chắc chắn các mấu nối giữa dây
Tacoma đưa nó trở thành cây cầu dài thứ ba
và sàn sẽ bung ra, và đó chính là hình ảnh sụp
thế giới vào lúc ấy !
đổ của cầu Tacoma.
Những chi tiết lý thú:
Ngày định mệnh.
Vào sáng sớm ngày 7/11/1940, vận tốc gió
Đúng là thiết kế sai lầm nhưng chúng ta
là 55km/h. Đến 10g, cảnh sát ra lệnh cấm lưu
cũng cần lưu ý tốc độ xây dựng nhanh
thông vì ngoài dao động lên xuống lại có thêm
: chỉ mất 17 tháng để hoàn tất một cây
dao động xoắn, và biên độ xoắn mạnh đến lỗi
cầu treo dài 1800m, khẩu độ 853m, tĩnh
sàn cầu nghiêng một góc 450 so với phương
không (khoảng cách từ sàn cầu đến mắt
ngang và kéo dài suốt ba tiếng đồng hồ, sức
nước) 20m, hai trụ tháp 130m. Một kỷ
gió lúc đó lên đến 70km/h với biên độ 8 mét và
lục đáng nể vào năm 1940.
tần số 0.2 Hz. Một mối nối sàn ở giữa nhịp với
dây treo bị bung ra.
Rất may, khi cầu sụp, giao thông đã
Một dao động xoắn mạnh đến nỗi nó "bẻ"
gián đoạn nên không có thiệt hại nhân
cây cầu ra làm 2 phần theo chiều dài và xoắn
mạng. "Nạn nhân" độc nhất là một... con
ngược chiều nhau. Đến 11 giờ bất chợt một
chó. Ông chủ của nó muốn biết cảm giác
đoạn sàn dài gần 200 mét đổ ụp xuống sông :
mạnh và đã may mắn bám kịp vào chỗ an
các mối nối đã không chịu nổi sự "tra tấn" của
toàn khi nhịp giữa rơi xuống nước.
thiên nhiên và sự mất cân bằng về trọng lượng
đã làm phần còn lại của nhịp giữa nhanh chóng
rơi xuống nước. Không có nhịp chính, hai bên Vào ngày khánh thành, một ngân hàng
cầu dẫn bị nhấc bổng lên cao 10 mét. ở Tocoma đã trưng bảng quảng cáo cho
thương hiệu của mình là vững chắc như
Các cuộc điều tra đã tức khắc nhìn ra điểm
cầu Tacoma. Không cần phải nói cũng
yếu của cây cầu là nó quá "mềm", nói theo
biết là sau đó ông giám đốc đã hạ cái biển
ngôn từ xây dựng là tỷ só chiều dây sàn cầu
quảng cáo chết tiệt này xuống ngay tức
trên chiều dài là
2.4
850
1
350
là quá nhỏ và khắc.
.θ
.l
.m
.H
.A
.mg
Hình 10.1:
Trước tiên ta nhập các thư mục và định nghĩa chữ viết tắt: a = θ.
> restart:with(plots):with(plottools):alias(theta=a):
> setoptions(color=black,thckness=2):
Để tạo hình động (dĩ nhiên chỉ nhìn thấy được trên màn hình):
> sd := seq(display([ld(i), fd(i)]), i = 0 .. 20):[1 ]
> display(sd, insequence = true, scaling = constrained);
1
Chỉ số trong hàm fd được chia cho 10 vì giảm vận tốc 10 lần.
> tk:=1:p:=NULL:q:=NULL:
> v:=1,1.4,1.8,1.95,2,1.98;
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
> for i to 6 do
cond ini:=a(0)=0,D(a)(0)=v[i]:
u:=dsolve({eq2,cond ini},{a(t)},numeric):
if i=6 then tk:=2:fi:
p:=p,odeplot(u,[t,a(t)],0..15,numpoints=200,thickness=tk);
q:=q,odeplot(u,[t,diff(a(t),t)],0..15,numpoints=200,thickness=tk);
od:
display([p]);
display([q]);
Bảng 10.1: Các lệnh để tạo hình tĩnh chuyển động con lắc đơn.
Hình 10.3(a) biểu diến biện độ dao động của 6 điều kiện đầu. Ta nhận thấy khi θ1 (0) càng
lớn, chu kỳ càng lớn, chuyển động chậm dần. Khi θ1 (0) = 2, con lắc dao động đến t = 4 và
đứng yên ở biên độ bằng 3. Đường nét đậm tương đương với θ1 (0) = 1.98 biểu diễn cho dao
động có biên độ lớn nhất trước khi đứng yên.
Hình 10.3(b) biểu diến tốc độ dao động của 6 điều kiện đầu. Ta nhận thấy khi θ1 (0) càng
lớn, chu kỳ càng lớn. (đường nét đậm tương đương với θ1 (0) = 1.98).
Để vẽ hình tĩnh các chuyển động, cần phải xác định thời gian để con lắc thực hiện hết một
chu kỳ. Khối lượng m khởi động ở điểm cân bằng (θ(0) = 0) với vận tốc bằng 1.98 đi đến biên
độ cực đại và rơi xuống. Điểm này được xác định khi θ1 (t) đổi dấu từ dương sang âm:
> for i to 1000 while eval(diff(a(t),t),u(i/100))>0 do od: i;
336
Và điểm chấm dứt một dao động chính là lúc con lắc đạt đến biên độ lớn nhất lần thứ hai
và rơi xuống. Để tìm điểm này ta chỉ cần đi tìm t sao cho θ1 (t) đổi dấu từ âm sang dương:
> for i from 336 to 2000 while eval(diff(a(t),t),u(i/100))<0 do
od: i;
1007
Quan sát hình 10.4 biểu diễn tốc độ dao động của 6 điều kiện đầu, ta thấy đường nét đậm
cắt trục hoành lần thứ nhất ở tọa độ xấp xỉ 3.4 và lần thứ hai ở tọa độ xấp xỉ 10. Điều này đúng
với kết quả vừa tính được là 336 và 1007 (phải chia cho 100) như đã làm trong vòng lặp for.
Và sau cùng, để vẽ hình tĩnh - Hình 10.3(c) ta làm:
> npas:=10:
> fd:=i¡disk([cos(-Pi/2+eval(a(t),u(i/npas))),
sin(-Pi/2+eval(a(t),u(i/npas)))],.05):
> ld:=i¡plot([r,-Pi/2+eval(a(t),u(i/npas)),
r=0..1],coords=polar):
> sd:=seq(display([ld(i),fd(i)]),i=34..101):
> display(sd,insequence=false,scaling=constrained);
Còn riêng về hình động thì ta cần phải xác định giá trị t khi con lắc đi qua khởi điểm
(θ(t) = 0) lần thứ hai nghĩa là khi vận tốc cực đại lần thứ hai. Trên hình (10.4) giá trị này xấp
xỉ 13.5. Để kiểm chứng:
> for i from 1346 do print(i,eval(diff(a(t),t),u(i/100))) od;
1341, 1.97973316191072302
1342, 1.97996068705870898
1343, 1.97999024276781444
1344, 1.97982181399630108
1345, 1.97945548237287984
1346, 1.97889142619671188
Chính xác là ở t = 1343, a1 (t) cực đại.
Và để có hình động:
> sd := seq(display([ld(i), fd(i)]), i = 0 .. 134):
> display(sd, insequence = true, scaling = constrained);
> for i to 4 do
cond ini:=a(0)=0,D(a)(0)=v[i]:
u:=dsolve({eq3,cond ini},{a(t)},numeric):
if i=4 then tk:=2:fi:
p:=p,odeplot(u,[t,a(t)],0..15,numpoints=200,thickness=tk);
q:=q,odeplot(u,[t,diff(a(t),t)],0..15,numpoints=200,thickness=tk);
od:
display([p]);
display([q]);
Bảng 10.2: Các lệnh để tạo hình tĩnh chuyển động con lắc đơn với ma sát.
Hình 10.4: Con lắc đơn với góc quay lớn và lực ma sát
.m1
.u2 .l2
.m2
.x
"
x1 := l1 cos(u1 (t))
y1 := l1 sin(u1 (t)) (10.2.1)
> x2 := l1*cos(u1(t))+l2*cos(u2(t));
> y2 := l1*sin(u1(t))+l2*sin(u2(t));
x2 := l1 cos(u1 (t)) + l2 cos(u2 (t))
"
Lagrange là một biểu thức xác định bởi công thức L = T V:
> L := T[1]+T[2]-V[1]-V[2]:
Và phương trình Lagrange của hệ là:
(
$
' d BL ) BL = 0
dt ( B u11 (t) ) B u11 (t)
'
&
' d BL BL = 0
dt B u12 (t) Bu12(t)
'
%
(10.2.5)
1
Với một hệ phức tạp
( như trên,) ta lấy đạo hàm theo ui (t), ui (t) của từng phần rồi cọng chung
d BL , trên nguyên tắc ta làm:
dt B u11 (t)
vào. Trước tiên với
> diff(L,diff(u1(t),t));
Error, wrong number (or type) of parameters in function diff
Maple xuất ra một thông báo sai, vì diff(u1(t),t) không được hiểu là một biến để lấy
đạo hàm. Để giải quyết, ta sẽ đặt tên cho các biến ui (t) và u1i (t) thành những ký tự đơn giản, rồi
sau khi lấy đạo hàm theo các ký tự nà, ta sẽ đổi lại:
> L := subs({u1(t)=t 1,u2(t)=t 2,diff(u1(t), t)=t1p, diff(u2(t),
t)=t2p}, L):[4 ]
Đặt:
(
d BL ) = dL dt1p, BL = dL dt1, d ( BL ) = dL dt2p, BL = dL dt2
dt B u11 (t) Bu11(t) dt B u12 (t) Bu12(t)
Và như thế, các đại lượng trong hệ (10.6) lần lượt là:
> dL dt1p:=diff(L, t1p): dL dt1:=diff(L, t 1);
> dL dt2p:=diff(L, t2p): dL dt2:=diff(L, t 2):
Sau khi lấy đạo hàm, đổi trở lại các biến ban đầu:
> rp:={t 1=u1(t),t 2=u2(t),
t1p=diff(u1(t), t),t2p=diff(u2(t),t)}:
> dL dt1p:=subs(rp, dL dt1p): dL dt1:=subs(rp, dL dt1):
> dL dt2p:=subs(rp, dL dt2p): dL dt2:=subs(rp, dL dt2):
Để đơn giản, chọn m1 m2 = m và l1 = l2 = l. Hệ Lagrange (10.6) trở nên:
> m1:=m2: m2:=m: l1:=l2: l2:=l:
> ode[1] := combine(diff(dL dt1p, t)-dL dt1, trig);
> ode[2] := combine(diff(dL dt2p, t)-dL dt2, trig);
$ ( )2
d2
u2 (t) sin(u1 (t)) u2 (t))+
'
' 2 2 d
' ode := 2ml u1 (t) + ml
' 1
'
'
'
dt2 dt
'
d2
ml2 2 u2 (t) cos(u2 (t)) u2 (t)) + 2mgl sin(u1 (t))
'
'
&
( dt )2
' ode := ml u1 (t) sin(u1 (t) u2 (t))+
'
' 2 d
'
'
2 (10.2.6)
'
'
dt
'
d2 d2
ml2 2 u1 (t) cos(u1 (t) u2 (t)) + ml2 2 u2 (t) + mgl sin(u2 ))
'
'
%
dt dt
cos(u1(t)-u2(t))=1,sin(u2(t))=u2(t),ode2);
$
'
& eq1 := 2ml 2
d2 2
2 d u (t) + 2mglu (t)
2
u 1 (t) + ml 2 2 1
dt
2
dt
2
' d d
%
eq2 := ml2 2 u1 (t) + ml2 2 u2 (t) + mglu2 (t) (10.2.7)
dt dt
?
> K = expand(rationalize(solve(subs(w=gu[2], eq1), K)));
K=H 2
?
H và K cùng dấu, vậy hai con lắc dao động cùng chiều.
Tương tự, khi w = gu[2], ta có K = H 2. Hai con lắc dao động trái chiều.
Để thấy cụ thể chuyển đọng của chúng ta cần vẽ các đường biểu diễn cũng như thực hiện
các hình động. Trước tiên ta nhập các số liệu thích ứng:
> l := 1: g := 9.8: H := 1/2: K := H*sqrt(2):
Sau đó khai báo hai hàm tương ứng với hai dao động. Với w = gu[2]:
> r1 := t¡H*cos(gu*[2]*t); r2:=t¡K*cos(gu*[2]*t);
[ ]
r1 := t ÞÑ H cos(gu[2]t)
r2 := t ÞÑ K cos(gu[2]t)
Để thực hiện các hình động ta cần khai báo hoành và tung độ của hai con lắc. Trước tiên nên
lưu ý rằng cho đến lúc này để tiện lợi, chúng ta đã tính toán dựa theo tọa độ như trong Hình 10.6
(trục Oy nằm ngang và Ox nằm dọc với chiều dương hướng xuống dưới). Để hiển thị trong một
tọa độ "bình thường", ta cần phải làm một phép quay với góc quay bằng , nghĩa là sin(a) sẽ
π
2
trở thành cos(a) và cos(a) thành sin(a):
xi , yi và tọa độ bi là hình vẽ hai con lắc. Lệnh display dùng để vẽ 20 chuyển dộng ban
đầu. Tuy nhiên lý tưởng là xem trên màn hình với insequence=true. Hình 10.7 (a) cho thấy
biểu diễn cùng chiều của hai biên độ.
b ? b ?
lg(2
6 1 1
Trước khi biến đổi có dạng lg(2 + 2), 2)
l l
Bảng 10.3:
Tương tự, với w = gu[1]. Các biến xi , yi , bi đều là các hàm nên chúng tự động thay đổi. Ta
chỉ cần làm lại các lệnh từ 7 đến 13:
> K:=-2*H/sqrt(2):
> r1:=t¡H*cos(gu[1]*t); r2:=t¡K*cos(gu[1]*t);
Hình 10.6: Chuyển động cùng chiều với góc quay nhỏ
> x1:=t¡sin(s1(t)):
> y1:=t¡-cos(s1(t)):
> x2:=t¡sin(s1(t))+sin(s2(t)):
> y2:=t¡-cos(s1(t))-cos(s2(t)):
> b1:=t¡disk([x1(t),y1(t)],.05,color=black):
> b2:=t¡disk([x2(t),y2(t)],.05,color=black):
> for i from 0 to 10 by 1/10 do
plot([[0,0],[x1(i),y1(i)],[x2(i),y2(i)]]):
P[i]:=display(%,b1(i),b2(i));
od:
> sq:=seq(P[i/10],i=0..20):
> display(sq,insequence=false,scaling=constrained,view=[-2..2,-
2.1..0]); [Hình 10.9 (b)]
Quan sát Hình 10.9 (b) thì ta thấy chuyển động của hai khối gần như đồng bộ với nhau. Bây
π
giờ ta cho khởi động với một góc quay lớn hơn u1 (0) = , u2 (0) = 1.
2
> F:=dsolve({ode1,ode2,u1(0)=Pi/2,u2(0)=1,D(u1)(0)=0,D(u2)(0)=0},
{u1(t),u2(t)},type=numeric):
> plot([s1,s2],0..11,color=black,linestyle=[1,4]);
Các hàm s1 , s2 được khai báo bằng hàm mũi tên nên các gia trị của nó được đổi tự đọng sau
lệnh dsolve.
> for i from 0 to 20 by 1/10 do
plot([[0,0],[x1(i),y1(i)],[x2(i),y2(i)]]):
P[i]:=display(%,b1(i),b2(i));
od:
Hình 10.7: Chuyển động ngược chiều với góc quay nhỏ
> q:=seq(P[i/10],i=0..140):
> display(sq[95..125],scaling=constrained,view=[-2..2,-2.1..0.2]);
[Hình 10.10 (b)]
(Hình 10.10 (b) diễn tả chuyển động trong khoảng thời gian [95..125]). Cả hai hình 10.10
đều chứng tỏ một điều: khi điều kện đầu vượt quá một giới hạn nào đó, chuyển động không còn
tuần hoàn nữa. Sau một thời gian chuyển động sẽ trở lên bất kỳ, nếu không muốn nói là "rối
tung lên". Với hình động ta sẽ thấy được hiện tượng khá vui mắt này:
> display(sq[95..125],scaling=constrained,view=[-2..2,-2..0.2],
insequence=true);
Kiểm chứng
Xem Hình 10.10 (b), ta thấy sau một thời gian, hai khối m chạy lung tung cả lên. Hơn
π
nữa, cho dù cả hai khói được thả tự do từ hai góc nhỏ hơn nhưng có những lúc khối m2 chạy
2
vượt lên khỏi trục Ox, điều này khiến chúng ta không khỏi đặt vấn đề "chuyển động có thực sự
như thế hay không? hay chỉ những con số cho bởi Maple (dsolve) chỉ là những kết quả vô
nghĩa?". Mặt khác, nếu có cả hai khối m những góc lớn u1 u2 = 1, 5radian( 86o ) và quan
sát thì chuyển động sẽ còn "lộn tùng phèo" đến mức đáng ngờ.
Khi ta hỏi liệu "chuyển động trên màn hình có đúng hay không?", có nghĩa là đúng so với
cái gì? Đúng so với thử nghiệm thực trong phong thí nghiệm? Nhưng làm thế nào ta tạo ra
được một hệ thông hoàn toàn không ma sát? Và chẳng lẽ mỗi lần thay i , thay li lại phải làm thử
nghiệm?
Cách hay nhất, khoa học nhất (và khả thi nhất) là kiểm chứng rằng cơ năng (động năng +
thế năng) của hệ là một hằng số. Dùng lại các công thức lý thuyết về con lắc kép (các phương
trình (10.2.1), (10.2.2), (10.2.3) trang ...) rồi kiểm chứng lại bằng các con số vừa tính được và
còn đang chứa trong hai biến s1 , s2 .
d
Viết lại các công thức và thay ui (t) bằng si (t) và thay
ui bằng vi (t) với vi (t) là vận tốc
dt
tính được từ dsolve đồng thời cho m1 = m2 = l1 = l2 = 1:
> v1:=i¡subs(F(i),diff(u1(t),t)):
> v2:=i¡subs(F(i),diff(u2(t),t)):
Ta có động năng của hệ T = T1 + T2 và thế năng của hệ V = V1 + V2 .
$
1
'
'
&
T1 := v1 (t)2
2
T2 := ( sin(u1 (t))v1 (t) sin(u2 (t))v2 (t))2 +
1
'
' 2
%
cos(u1 (t))v1 (t) + cos(u2 (t))v2 (t))2
V1 := g(1 cos(u1 (t)))
"
π
Hình 10.9: Chuyển động với u1 (0) = , u2 (0) = 1radian
2
> r1:=seq([i,T(i)],i=0..50):g1:=plot([r1],t=0..50,linestyle=3):
> r2:=seq([i,V(i)],i=0..50):g2:=plot([r2],t=0..50,color=red):
> r3:=seq([i,T(i)+V(i)],i=0..50):
> g3:=plot([r3],t=0..50,color=blue):
> display(g1,g2,g3,labels=[t,Energy],
labeldirections=[HORIZONTAL,VERTICAL]);
Hình 10.10: Đồ thị của động năng, thế năng và cơ năng của con lắc kép
Hình 10.11 (a) cho ta thấy rõ g1 và g2 đối xứng qua đường thẳng y 12, và g3 là đường
y 24. Vậy các phương trình đều đúng và lệnh dsolve cho kết quả đúng.
Mặt khác, các khoảng cách trên Hình 10.11 (a) quá khít nhau, để thấy rõ hơn ta có thể phóng
đại bằng view. Chọn khoảng thời gian t P [17, 36] là khoảng tương đối "gồ ghề, phức tạp" hơn
cả.
> display(g1,g2,g3,view=[17..36,0..25],labels=[t,Energy],
labeldirections=[HORIZONTAL,VERTICAL],tickmarks[3,5]);
Kết quả là [Hình 10.11 (b)]. Và nếu ai "chưa vừa lòng" xin hãy xem dãy r3 :
> r3[21..32];
Kết quả chính xác đến năm số lẻ! Quá tốt. Vậy thì ta có thể khẳng định các chương trình
lý thuyết đều đúng, ({dsolve,numeric}) theo Runge-Kutta đúng, và chuyển động "lôn tùng
phèo" đáng nghi ngờ kia đã đúng nốt.
Vẽ hình
Khác với chương 9, bây giờ lò xo chuyển động trong không gian hai chiều, và ta sẽ giống
như Hình 10.12. Để làm điều này, trước tiên ta dùng lại hàm RS đã được khai báo trang ??
Chương 9. Xin nhắc lại, một lò xo có 5 vòng xoắn và hai đầu dây di chuyển trên trục hoành ở
hai tọa độ a, b là:
( ( ( )) )
plot
1
2
sin 10
πx
ba
πa
ba
, x = a..b
Trong trường hợp này lò xo có một đầu cố định và có thể quay trong mặt phẳng quanh gốc
tọa độ nên phải khai báo khác đi một chút. Ta sẽ làm các giai đoạn:
a) Trên trục hoành vẽ một lò xo mọt đầu cố định, có chiều dài r, 8 vòng xoắn và bán kính mỗi
vòng khoảng 0.3.
> restart:with(plots):with(plottools):
> setoptions(color=red): alias(SC='scaling=constrained'):
> RS:=r¡plot(sin(5*(3*Pi*x/r)-2*Pi)/8,x=0..r,SC);
Một lò xo có chiều dài π được khai báo như sau [Hình10.13 (b)]:
> display(RS(Pi));
b) Ở hai đầu lò xo vẽ hai đoạn thẳng biểu tượng biểu tượng cho hai đầu lò xo.
> RS0:=plot(0,x=0..0.1):
> RS2:=a¡plot(0,x=a+0.1..a+0.2):
Tham số a có thể coi như chiều dài lò xo.
c) Cho lò xo tịnh tién đi mọt đoạn để "gắn" hai đầu đoạn thẳng này vào. Tiếp theo gắp khối m
vào đầu tự do.
> RT:=a¡display(RS0,translate(RS(a),0.1,0),
RS2(a),disk([a+.3,0],0.1));
d) Cho cả hệ thống quay mọt góc tùy theo tọa đọ của m khi chuyển động. Giả sử khối(m di )
x
chuyển đến tọa độ là (x, y) xem Hình 10.12), cả hệ thống sẽ phải quay một góc α = arctan
y
quanh góc tọa độ:
> RR:=(y,x)¡rotate(RS(sqrt(xˆ2+yˆ2)),arctan(x,y),[0,0]);
RR :=ÞÑ rotate(RT ( x2 + y 2 ), arctan(x, y), [0, 0]);[7 ]
a
Tính toán
Khác với con lắc kép, hai ẩn số trong trường hợp con lắc đơn đàn hồi là tọa độ (xm , ym )
của khối m.
Với k, l0 là độ cứng và chiều dài ban đầu của con lắc lò xo (khi chưa treo khối m), g là gia
tóc trọng trường. Thế năng V và động năng T của hệ [Hình 10.13 (a)] là:
$ ( )2
V = mgx(t) + k (x(t)) + (y(t)) l0
'
'
1 a 2 2
&
(( 2) ( )2 )
2
'
' 1 d d
% T = m x(t) + y(t)
2 dt dt
Bài toán có hai ẩn số là x(t), y(t); nghĩa là vị trí của khối m.
> l:=sqrt(x(t)ˆ2+y(t)ˆ2):
> V:=-m*g*x(t)+1/2*k*(l-10)ˆ2:
> x1:=diff(x(t),t): y1:=diff(y(t),t):
7
Xin xem cách sử dụng hàm arctan
Hình 10.12: Khai báo con lắc đàn hồi và vài chuyển động
> T:=m/2*(x1ˆ2+y1ˆ2):
Lagrange của hệ là L = T V , chúng ta khai báo lại các mệnh lệnh như trang ?? để đưa
về hệ phương trình vi phân:
> L:=T-V:
> L:=subs(x(t)=t 1,y(t)=t 2,diff(x(t),t)=t1p,diff(y(t),t)=t2p,L):
> dL dt1p:=diff(L,t1p): dL dt1:=diff(L,t 1):
> dL dt2p:=diff(L,t2p): dL dt2:=diff(L,t 2):
> rp:=t 1=x(t),t 2=y(t),t1p=diff(x(t),t),t2p=diff(y(t),t):
> dL dt1p:=subs(rp,dL dt1p): dL dt1:=subs(rp,dL dt1):
> dL dt2p:=subs(rp,dL dt2p): dL dt2:=subs(rp,dL dt2):
> ode1:=expand(combine(diff(dL dt1p,t)-dL dt1,trig));
> ode2:=expand(combine(diff(dL dt2p,t)-dL dt2,trig));
Hình 10.13: (a) Quỹ đạo con lắc và (b) đồ thị năng lượng
Kiểm chứng
Hình 10.14 (a) cho thấy chuyển dọng con lắc rất phức tạp. Câu hỏi đặt ra là liệu chuyển
động này có đúng? Và cũng giống như trường hợp con lắc kép, cách đơn giản và chính xác nhất
để kiểm chứng tính xác thực của chuyển động là vẽ đường biểu diễn năng lượng của nó.
Ta khai báo lại biểu thức động năng và cơ năng với các kết quả từ ({dsolve,numeric})
và còn đang lưu trong biến F :
> V:=t¡-m*g*x(t)+1/2*k*(sqrt(s1(t)ˆ2+s2()ˆ2)-l0)ˆ2;
> T:=t¡m/2*(v1(t)ˆ2+v2(t)ˆ2);
> r1:=seq([i,T(i)],i=0..40):
> g1:=plot([r1],t=0..40,linestyle=3):
> r2:=seq([i,V(i)],i=0..40):
> g2:=plot([r2],t=0..40,color=red):
> r3:=seq([i,T(i)+V(i)],i=0..40):
> g3:=plot([r3],t=0..40,color=blue):
> display(g1,g2,g3); [Hình 10.14 (b)]
Quan sát Hình 10.14 (b) ta thấy rõ thế năng và động năng của con lắc đối xứng qua đường
thẳng y 2 và cơ năng là đường y 4. Vậy kết quả này đúng.
Trường hợp a)
Trong a), tác giả đã gọi l2 là chiều dài ban đầu của lò xo (nghĩa là khi chưa treo khối m2 ), e
g
là độ giãn của lò xo khi đứng yên. Người ta gọi đây là độ giãn tĩnh. Ta có e = m2 .
k
202 Phạm Minh Hoàng
10.3. Con lắc đơn đàn hồi
$ (( )2 ( )2 ) ( )2
'
'
1 d d 1 d
'
'
T = m2 x(t) + y(t) + m1 l 1 u(t)
' 2 dt dt 2 dt
V = m1 gl1 cos(u) m2 gy(t)
&
Tương tự, l1 là chiều dài ban đầu của lò xo (nghĩa là khi chưa treo khối m1 , l2 , m2 ), e là độ
g
giãn tĩnh. Ta có e = (m1 + m2 ).
k
$ (( )2 ( )2 ) ( )2
'
'
1 d d 1 d
'
'
T = (m1 + m2 ) x(t) + y(t) + m2 l 2 u(t)
'
'
2 ( dt
)(( ) dt ( 2 ) dt )
'
u(t) cos(u)
& d d d
+m2 l2 u(t) y(t) sin(u)
'
dt dt dt
'
V = (m1 + m2 )gy(t) mgl2 cos(u) + k((x(t))2 + (l1 + e + y(y))2 )
'
'
1
'
'
' 2
kl1 x(t) + (l1 + e + y(y))2
% a
Một khi đã giải xong bài toán con lắc kép đàn hồi, các bạn có thể tự "phát minh" ra những
trường hợp phức tạp hơn, với nhiều nối kết khác nhau.
.A
.O .
.B
Hình 10.15:
Bây giờ ta xét hình tròn bán kính r = 1 nội và ngoại tiếp hai ngũ giác đều. Rõ ràng là:
AM AM 1 A1 M 1
ñ sin(AOB)
z AM 1 tan(AOB)
z
ñ sin( π5 ) π5 tan( π5 )
ñ 5 sin( π5 ) π 5 tan( π5 )
.A .A1
.O .
.M .M 1
Hình 10.16:
n sin( ) π n tan( πn )
π
(10.4.1)
n
Bảng sau tóm tắt những giá trị của phương trình (10.4.1)
> f:=n¡evalf([n*sin(Pi/n),n*tan(Pi/n),
.5*(n*sin(Pi/n)+n*tan(Pi/n))]);
> f(10),f(100),f(1000),f(10000);
π π
n n sin( ) n sin( ) Trung Bình
n n
10 3.090169944 3.249196963 3.169683454
100 3.141075908 3.142626605 3.141851256
1.000 3.141587486 3.141602989 3.141595237
10.000 3.141592602 3.141592757 3.141592679
Ý tưởng của Archimede đơn giản mà chính xác. Tuy nhiên nếu chúng ta biết rằng vào thời
của ông, hoàn toàn chưa có khái niêm lượng giác và nhưng tính toán không phải được thực hiện
trong hệ thập phân như ngày hôm nay, thì chúng ta lại phải ngả mũ thán phục công sức của nhà
toán học Hy Lạp Cổ đại này. Có lẽ cũng vì lý do đó, vào năm 1660, nhà toán học W.Oughtred
đã dùng ký tự π để biểu tượng cho số này. Trong tiếng Hy Lạp, π là chữ đầu tiên của chữ
περιµετ ρϕν (perimetron) có nghĩa là chu vi.
Số π có ảnh hưởng mật thiết đến đời sống con người nên khắp nơi đều
có cách tính độc đáo. Tại Á châu, vào năm 380 người Siddantas tại Ấn
177
Độ đã đưa ra công thức 3 + = 3.1416 được tính toán trên cơ số...
1250
60. Riêng tại Trung Quốc, vào thời nhà Tấn (thế kỷ thứ III), nhà toán
học Liu Hui cũng đã dựa trên nguyên lý đa giác nội tiếp trong hình tròn.
Liu Hui đã dung một đa giác 192 cạnh để xấp xỉ số π. Hai thế kỷ sau, họ
tăng lên 3072 cạnh và xấp xỉ 3.1415926 π 3.1415927 (tất cả được
tính trong cơ số thập phân), một độ chính xác mà mãi tới đến thế kỷ XII
Âu châu mới đạt đến.
Hình 10.17: Tukey
Tại Âu châu, sau Archimede là một sự trống vắng vĩ đại và giai đoạn tối tăm này kéo dài
suốt 1500 năm. Một trong nhưng nguyên nhân làm cản trở bước tiến toán học là cách biểu diễn
bằng số La Mã (thí dụ: 58 96 = 5568) được viết thành LV III XCV I = V DLXV III[8 ],
và phải đợi đến thời đại của Fibonacci, một nhà toán học Ý đã du nhập số Ả Rập vào Âu châu
thì tất cả mới bùng phát mạnh mẽ. Các đa giác của Archimede được tăng lên đến cực lớn. Nhà
toán học Đức Van Ceulen đã tính toán một đa giác 60 233 = 480 tỷ cạnh để tìm ra 32 số lẻ
của π và dành trọn đời mình cho bài toán này. Đến nỗi khi qua đời ông ta đã yêu cầu khắc lên
mộ bia 35 số của π. Lúc ấy là năm 1621.
Thế hệ chuỗi số Đi trước Âu châu cả trăm năm, một nhà toán học Ấn Độ là Nilakantha So-
mayaji (1444-1545) đã tìm ra công thức đầu tiên về chuỗi:
? 8̧ (1)n
π= 12
n=0
(2n + 1)3n
Hơn 200 ( năm) sau A. Sharp đã dùng một trường hợp đặc biệt của công thức trên tìm ra
= arctan ?
π 1
với 71 số lẻ.
6 3
Kể từ thời điểm này Âu châu "vùng lên" với những kỹ thuật tính toán mới dựa trên đạo hàm,
nguyên hàm, chuỗi... Người ta phải nhắc đến các công trình của: [9 ]
8
Trong số La Mã, L = 50, C = 100, D = 500, M = 1000. Một số có gạch ngang trên đầu thì nhân lên với
1000
9
Trong bảng này, các năm không đóng ngoặc là năm phát minh.
(1540 1603) π = 2? a
2 2 2
Viete
2 2+ 2
? b
a ? ...
2+ 2+ 2
π=2 8
2
± 4n
4n2 1
Wallis 1665 n=1 16 số lẻ
π = arctan( 4 arctan(
1 1
Machin 1706 100 số lẻ
5 239
±8
(1646 1716)
1
Leibniiz π = 8 n=1
(4n + 1)(4n + 3)
±8
(1707 1783) 2 1
Euler π = 6 n=1 2 20 số lẻ trong 1
n
giờ
Thế hệ của máy tính Vào nữa đầu thế kỷ 19, ưu tiên của các hướng nghiên cứu dành cho các
lý thuyết mới của Cantor, Kolmogorov, Hilbert... Số π được quăng vào một xó hoặc nhường
cho những kẻ "vô danh", là một trong những kẻ "vô danh" đó là Ramanujan, một nhà toán học
Ấn Độ không bằng cấp. Nhưng với lòng đam mê và sự kiên trì ông đã dành suốt 25 năm để tìm
tòi, nghiên cứu. Ramanujan sau này đã viết một cuốn sách với 6165 định lý toán học mà không
có cái nào được chứng mình! Ông cũng tự nhận là có nhiều thứ "không biết từ đâu ra", và một
trong những thứ đó là công thức tính π cực kỳ khó hiểu, gồm toàn những số "không biết từ đâu
ra":
(
8̧ (4n)!(1103 + 26390n) )1
π= ?
9801
8 n=0
(n!)4 3964n
Công thức này được công bố vào năm 1914 (sáu năm sau thì ông mất) và mãi tới năm 1980
người ta mới chứng mình được. Sau đó vào năm 1985, máy tính đã tìm ra 10 triệu số lẻ từ công
thức của Ramanujan!.
Với sự tiến bộ vượt bậc của máy tính và các phần mềm, nhiều ê-kíp đã đưa ra những kết
quả dáng kinh ngạc. Năm 1948 Wrench và Smith đã tính được 1000 số lẻ, năm 1958, 10000 số;
năm 1961, 100 ngàn; năm 1973, 1 triệu số[10 ]. Năm 1982, Myioshi và Kanada đã tính được 16
triệu số. Cuộc chạy đua này diễn ra liên tục giữa nhiều nhóm khác nhau và đến năm 2000, con
số này là 1200 tỷ và được tính từ một máy tính siêu mạnh Hitachi. Thiết nghĩ đến khi cuốn sách
này đến tay bạn đọc thì có lẽ chúng ta phải dùng đến chữ peta = 1015 hoặc exa = 1018 !.
Đến đây chắc chắn sẽ có nhiều người tự hỏi: "Ích lợi gì mà cứ sôi sùng sục đi tìm các số lẻ
của π, vì thực ra chỉ cần 3 hoặc 4 số lẻ là đã quá chính xác?".Quả đúng như vậy, trên ghế nhà
trường chúng ta chỉ cần 3 số là quá đủ. Đến khi ra làm việc thì yêu cầu cong thấp hơn. Ví dụ để
vẽ một căn nhà, một cây cầu, người kỹ sư chỉ cần 2 số lẻ. Tuy nhiên, trong các viện nghiên cứu
thì khác. Các lý do để con người "sôi sùng sục" sau các số lẻ là vì:
Để có được nhiều số lẻ, người ta phải phát minh ra nhiều thuật toán mới, những công thức
mới. Thí dụ trong Maple, để tính công thức (10.4.2), ta mất 0.1 giây với 10 số lẻ, nhưng
phải mất hơn 70 lần hơn nếu muốn có độ chính xác 100 (Digits:=100:). Nếu tính 200
số lẻ phải mất trên 1 phút. Càng chính xác càng tốn thời gian vì nó đòi hỏi những thuật
toán phức tạp hơn. Và việc tìm tòi những thuật toán, những công thức này dẫn đến những
phát minh mới về công nghệ.
10
Để kỷ niệm, các tác giả người Pháp đã cho xuất bản một cuốn sách dầy 415 trang ghi lại toàn bộ 1 triệu con số
này. Cuốn sách được mệnh danh là "cuốn sách chán nhất của mọi thời đại".
Việc tính các số lẻ cho phép các kỹ sư kiểm soát lại dộ chính xác của máy tính. Chính vì
lý do đó công ty IBM đã tìm ra những lỗi trong các siêu máy tính IBM-590 và R-8000.
***
Trong suốt bài nói về số π này, chúng ta đã không ít lần nghe đến những con người "vô danh"
như Liu Hui, Somayaji, Ramanujan, Wrench, Smith... và để kết thúc chúng ta sẽ nói đến một
cái tên khác "không kém phần vô danh" là Akira Haraguchi, một y tá người Nhật. Vào ngày
3/10/2006, ở độ tuổi 60, ông đã đọc vanh vách và cực kỳ chính xác 100.000 số lẻ của π trong
suốt 16 tiếng liên tục! Khi được phỏng vấn về kỷ lục ngoại hạng này, Haraguchi đã khiêm tốn
trả lời "Tôi chẳng thấy có gì là ấn tượng cả, tôi chỉ đơn thuần xả hết những gì có trong đầu ra..."
Toán học quả đã đạt được những bước tiến vĩ đại vì nó đã tạo ra sự hấp dẫn đối với những
con người vô danh.
Số học là môn học về các số nguyên dương khác không (N ) và dĩ nhiên nó đã có từ thuở
hồng hoang của Toán học. Người ta ước tính rằng tổ tiên của loài người đã biết các thao tác về
số học cách đây 5000 năm và sử dụng nó trong các giao dịch thường nhật liên tục trong nhiều
thế kỷ. Nhưng đến thời hoàng kim của Toán học, số học đã phải nhường chỗ cho những phép
tính phức tạp như nguyên hàm, vi phân và vô số những bài toán cực kỳ khó khăn khác.
Nhưng cũng chính từ máy tính vốn là một tinh hoa của văn minh nhân loại vào thế kỷ 20
đã làm "tái sinh" môn học cổ xưa này. Máy tính không những đã phát huy hết cái đẹp truyền
thông của số học mà còn khai triển ra những ứng dụng đang và sẽ còn hữu dụng cho chúng ta
trên thềm của thế kỷ 21.
Số học mô-đun
Số nguyên tố
Số nguyên tố là số chỉ chia chẵn cho 1 và cho chính nó. Thí dụ (7, 13, 61, 137...).
Maple đã có sẵn nhiều lệnh liên quan đến số nguyên tố: isprime(n): n có phải là số
nguyên tố?, ithprime(n): số nguyên tố thứ n, prevprime(n): số nguyên tố trước
số n, nextprime(n): số nguyên tố kế tiếp sau số n.
Thí dụ:
> isprime(61), ithprime(33);
true, 137
> nextprime(137), prevprime(137);
139, 131
Ước số chung lớn nhất (có nhiều cách viết theo tiếng Anh là gcd[1 ]). Và đó cũng là lệnh
Maple:
1
greatest common divisor
Chương 11. Số học và ứng dụng
Thuật toán Eculide: Dùng để tìm ước chung lớn nhất của hai số.
a b r Thí dụ: để tính gcd(19, 7). Ta có ở hàng thứ nhất
19 7 2 5 19 = (7 2) + 5. Đem 7 xuống cột a và 5 xuống cột
7 5 1 2 b ở hàng thứ 2, ta có 7 = (5 1) + 2 và cứ tiếp tục
5 2 2 1 như thế cho đến khi r = 0. Khi đó ước số chung lớn
2 ⃝
1 2 0 nhất là kết quả ở cột b
Ký hiệu: nếu ước số chung lớn nhất của a và b là f , ta viết (a, b) = f . Lưu ý: (19, 7) = 1.
Vậy 19 và 7 là hai số nguyên tố cùng nhau.
Định lý 11.1.1 Định lý Bezout: Ước số chung lớn nhất của (a, b) là số f nhỏ nhất có thể
biểu diễn được dưới dạng tổ hợp tuyến tính của a và b.
1 = 5 2 2 = 5 2(7 5) = 3 5 2 7 = 3(19 2 7) 2 7
=⃝ 3 19 ⃝8 7 (11.1.1)
r được gọi là số dư. Nếu r = 0, a = mq, a chia chẵn cho m và ký hiệu là m|a. Ánh
xạ tương ứng với biểu thức 11.1.2 là ánh xạ từ vành các số nguyên Z sang tập hợp các
mô-đun m và được ký hiệu là Z /mZ . Thí dụ:
Z /5Z = t0, 1, 2, 3, 4u
Mặt khác người ta còn có một cách viết khác cho biểu thức 11.1.2:
và đọc là a đồng dư với r trong m hay a dồng dư với r mô-đun m đồng dư có nghĩa là a và
r có cùng số dư trong phép chia cho m. Tóm lại ta có định nghĩa của đồng dư ánh xạ:
Z Ñ Z /mZ : a r[m]
Thí dụ: 47 5[7], 212 5[3]
b1[m] ùñ b1 + b2[m]
" "
a1 a1 + a2
a2 b2[m] a1 a2 b1b2[m] (11.1.3)
14 + 8 = 22 8 + 2 = 10[6]
$
14 8[6]
$
'
14 8 = 112 8 2 = 16[6]
& &
14 8[6] ùñ = 7 = 4[6]
14 8
Nhưng : (11.1.5)
2 2
Phần tử đảo
Quan sát biểu thức 11.1.4 ta thấy (20, 7) = 1 nhưng ở 11.1.5 thì (14, 6) = 2. Nghĩa là
phép chia (như trong Z ) chỉ có nghĩa khi đó là hai số nguyên tố cùng nhau). Nói khác đi,
không phải lúc nào phần tử trong Z /mZ cũng hiện hưu như trong Z .
Định nghĩa 11.1.1 ā được gọi là phần tử đảo của a[m] khi và chỉ khi aā 1[m]
Để tính phần tử đảo của một số a trong Z /mZ ta dùng thuật toán Eculide mở rộng. Lấy
lại ví dụ cách tính gcd(19, 7), ta có (theo 11.1.1 và 11.1.3):
3 19 8 = 1 ñ 3 19 1 = 8 7 ñ 319 1[7]
Vậy phần tử đảo của 19[7] là 3
Vậy số dư là 4.
Thí dụ 3: Tính số dư của phép chia 19871987 trong Z /5Z .
19871987 [5] 21987 21986 2[5] (22)993 2[5]
4993 2[5] (1)993 2[5] 2[5] 3[5]
Số dư là 3.
Nói chung khi tính số dư mô-đun m, ta cần dàn xếp để tìm bội của m trừ 1. Thí dụ trong
Z /5Z ta cần tìm ra 4, 9, 14, 19, 24 . . .
> with(linalg):
[3, 4]
Để làm được điều này họ đã dựa trên những tính toán suy luận ra từ hàng trăm năm quan
sát bầu trời. Và vô tình vào thế kỷ thứ 3, họ đã tìm ra một định lý về hệ đồng dư mà đến bây
giờ các giao dịch hiện đại của thế kỷ 21 như máy tính điện tử, thẻ tín dụng, mật mã... vẫn hoạt
động dựa theo phát minh này.
Gọi (mi , mj ) = dij . Hệ phương trình trên có nghiệm khi và chỉ khi
và nghiệm có dạng:
x a1 M1 e1 + a2 M2 e2 + . . . an Mn en [m1 m2 . . . mn ] (11.1.6)
[ ]
i=n
¸ i=n
¹
ai Mi ei mi
i=1 i=1
±
mi
với Mi = và ei là số đảo của Mi [mi ]
mi
x 3[13]
$
&
2 [13], 5 [8], 2
1 1 1
[9]
72 117 104
x (3 72 2) + (7 117 5) + (2 104 2)
4943[13 8 9] = 263[936]
Vậy lời giải là x P t263 + 936k u, (k P Z )
Maple có sẵn lệnh chrem để hỗ trợ cho định lý này. Lệnh chrem gồm 2 dãy(dãy các hệ số
ai và dãy các mô-đun mi ):
> chrem([3, 7, 2], [13, 8, 9]);
> 263
x 3[17]
$
&
Khác với thí dụ 1 (trong đó (mi , mj ) = 1, D(i, j)), ở đây (12, 8) = 4 nhưng vì 4|(7 3)
nên hệ trên sẽ có lời giải.
Để giải một hệ trong đó các mô-đun không nguyên tố cùng nhau, phương pháp chung là
phân tích các mô-đun ấy thành nhiều mô-đun nhỏ hơn rồi loại bỏ các phương trình tương đương
với nhau cho đến khi chỉ còn lại các mô-đun nguyên tố với nhau từng đôi một.
x 3[7]
,
' x 3[17]
$
/
x 7[12] ùñ x 7[3]
'
. &
x 3[8] ùñ x 3[2]
/ '
%
x 3[2]
/
-
(Các phương trình có dấu bị loại: x 7[4] bị loại vì nó tương đương với x 3[4] còn
x 3[2] bị loại vì x 3[4] ñ x 3[2])
Bằng thuật toán Eculide mở rộng ta có:
7 121 [17], 1 681 [3], 1 511 [4]
ùñ x (3 12 7) (7 68) (3 51) 881[204] 139[204]
Vậy là lời giải là 139.
x 5[6]
"
x 2[9]
Thí dụ 3: Tìm lời giải của hệ
Hệ trên có nghiệm vì (6, 9)|5 2. Áp dụng phương pháp đã dùng trong thí dụ 2 là phân
tích các mi thành các mô-đun nhỏ hơn rồi loại trừ những gì giống nhau:
x 5[6] ñ x 1[2] và x 2[3]
Nhưng nếu phân tích x 2[9] ta lại rơi trúng x 2[3]. Phải dùng cách khác.
Ta lý luận rằng một số chia cho 9 dư 2 thì chắc chắn cũng sẽ dư 2 khi chia cho 3, vậy có thể
x 1[2]
"
Điều này có nghĩa là Maple khong chấp nhận một phần tử đảo không thuộc tập Z . Thiếu sót
này đến phiên bản V8 cũng chưa được sữa chữa. Tuy nhiên, ta có thể giải bằng lệnh isolve:
> isolve({x-5-k1*6, x-2-k2*9)})
{x=11+18 Z1, k1=1+3 Z1, k2=1+2 Z2}
Vậy x P {11+18k}(k P Z )
Ứng dụng vào máy tính Tất cả máy tính đều làm việc trong hệ nhị phân và bên trong máy
tính các dữ liệu được chuyển trên nhưng đường truyền gọi là bus. Nếu bus hoạt động trên 8
bits thì khả năng tính toán của máy (còn được gọi là cỡ từ) là 28 8 = 255. Câu hỏi đặt ra
là làm sao có thể tính toán với những con số lớn với cỡ từ nhỏ như thế? Để giải quyết ta phải
nhờ vào định lý Trung Quốc.
Giả sử muốn cộng và nhân hai số a, b trong một máy tính cỡ từ 100 (nghĩa là chỉ được
phép thao tác trên các số < 100), trước tiên ta chọn k số nguyên tố nhỏ hơn 100 và nguyên tố
cùng nhau từng cặp sao cho tích của chúng lớn hơn a b[2 ].
> a:=352:b:=394
> m:=[51,52,53];'m'=%,convert(m, '*');'a*b'=a*b[3 ]
m = [51, 52, 53], 140556, ab = 138688
Tính số dư của a và b trong mô-đun mi :
> p:=[seq(amodi,i=m)]: q:=[seq(bmodi, i=m)]:'p'=p,'q'=q;
p = [46, 40, 34], q = [37, 30, 23]
Theo định lý Trung Quốc: nếu x = (x1 , x2 , . . . , xr )vy = (y1 , y2 , . . . , yr ) là số dư trong
mô-đun (m1 , m2 , . . . , mr ) thì:
"
x + y = (x1 + y1 , x2 + y2 , . . . , xr + yr )
x y = (x1 y1 , x2 y2 , . . . , xr yr )
> chrem(p+q,m);
746
2
° ±
Theo định lý Trung Quốc, x = ai Mi ei [ mi ], nếu
±mi nhỏ, không đủ phương trình trong định lý
3
Ta cũng có thể chọn 13,19,22,27 vì tích của chúng lớn hơn 138688
Với phép nhân thì hơi phức tạp hơn, phải dùng lệnh seq để nhân trước:
> seq(p[i]*q[i], i=[seq(i,i=1..nops(m))]);
1702, 1200, 782
> chrem([%],m);
138688
Bây giờ ta chọn a, b lớn hơn:
> a:=1234;b:=3457:'a'=a,'b'=b,'a*b'=a*b;
a = 1234b = 3457, ab = 4288150
Nếu lấy m = [51, 52, 53] như trên, a + b đúng nhưng a b sai vì 51 52 53 a b. Ta
chọn mi nhiều hơn (các mô-đun phải nguyên tố cùng nhau từng cặp):
> m:=[23,45,47,89]:'m'=%,convert(m,'*');
m = [23, 45, 47, 89], 4329405
Thực hiện lại các thao tác trên, ta được:
> chrem(zip((x,y)¡x*y,p,q),m);
4288150
11.2 Mật mã
Đại cương
Từ ngàn xưa, bảo mật vốn là điều quan trọng, nhất là khi có xung đột giữa hai quốc gia.
Ngày nay, việc này lại trở nên vô cùng quan trọng trong các lãnh vực khác nhau như ngoại giao,
kinh tế, tài chính và dĩ nhiện là cả quân sự nữa. Trong phần này chúng ta sẽ khảo sát 3 mật mã
khác nhau có liên quan trực tiếp đến phép tính đồng dư là mã César, mã khối và mã RSA.
Trước tiên chúng ta cần thông nhất vài khái niệm. Phép tính đồng dư chỉ áp dụng cho số
nguyên (Z ÝÑ Z /nZ ) các công đoạn của cả 3 phương pháp mã sẽ như sau:
1. Biến văn bản gốc gồm những mẫu tự thành con sô,
2. Mã hóa những con số này bằng cách áp dụng một công thức nào đó,
3. Biến những con số mới này trở lại các mẫu tự trước khi chuyển đến nơi nhận.
Khi nhận được mật mã, người nhận chỉ lập lại tiến trình trên nhưng thay công đoạn 2 bằng
công thức giải mã. Vậy trước tiên chúng ta sẽ thực hiện công đoạn 1 và 3 là công đoạn chung
cho cả 3 phương pháp.
Biến mẫu tự thành số
Để đơn giản, ta chấp nhận chỉ có 26 mẫu tự không dấu cộng với dấu cách (khoảng trắng,
), và trong suốt phần sau đây, 27 tượng trưng cho tổng số mẫu tự:
> restart:
> char:=[" ",op([i$i="a".."z"]);
char := ["", "a", "b", "c", "d", "e", "f ", "g ", "h", "i", "j ", "k ", "l",
"m", "n", "o", "p", "q ", "r", "s", "t", "u", "v ", "w", "x", "y ", "z "]
> NB:=nops(char);
N B := 27
> numb:=[j$j=0..26];
numb := [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
> AN:={seq(char[i]=numb[i],i=1..BN};[4 ]
AN := t"" = 0, "a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5,
"f " = 6, "g " = 7, "h" = 8, "i" = 9, "j " = 10, "k " = 11, "l" = 12,
"m" = 13, "n" = 14, "o" = 15, "p" = 16, "q " = 17, "r" = 18, "s" = 19,
"t" = 20, "u" = 21, "v " = 22, "w" = 23, "x" = 24, "y " = 25, "z " = 26u
> NA:={neq(numb[i]=char[i],i=1..NB};}
N A := t"" = 0, "a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5,
"f " = 6, "g " = 7, "h" = 8, "i" = 9, "j " = 10, "k " = 11, "l" = 12,
"m" = 13, "n" = 14, "o" = 15, "p" = 16, "q " = 17, "r" = 18, "s" = 19,
"t" = 20, "u" = 21, "v " = 22, "w" = 23, "x" = 24, "y " = 25, "z " = 26u
Tất cả được tóm tắt trong bảng hoán chuyển dưới đây:
a b c d e f g h i j k l m
0 1 1 3 4 5 6 7 8 9 10 11 12 13
n o p q r s t u v w x y z
14 15 16 17 18 19 20 21 22 23 24 25 26
Mã César
César (Julius Ceasar (100-44) trước Công Nguyên) là một thiên tài quân sự của đế quốc La
Mã. Ngoài lãnh vực quân sự, ông còn là người đã biết rằng chu kỳ của trái đất quay quanh mặt
trời là 365.25 ngày và từ đó phát minh ra dương lich với năm nhuận như chúng ta đang dùng
ngày hôm nay[5 ]. Người ta cho rằng để phục vụ cho nhu cầu quân sự, ông ta là người đầu tiên
sử dụng mật mã.
Cách mã của César khá đơn giản, ông tịnh tiến các chữ đi một khoảng nhất định. Giả sử
khoảng đó là 3 thì chữ a sẽ thành chữ d, chữ b thành chữ e ... Tóm lại mã César được thành lập
theo phương trình đồng dư:
f : x ÞÝÑ y x + 3[7]
Trong đó x là mẫu tự trong văn bản gốc, y là mẫu tự tương ứng trong văn bản mật. Số 3 trong
hàm f (x) có thể gọi là kha của mã.
Bây giờ ta thực hiện việc mã hóa chữ "van hoa giao duc" với khóa là 3:
> vb:="van hoa giao duc":
> vb2:=seq(vb[i],i=1..length(vb))]; (11.2.1)
vb2 := ["v ", "a", "n", "", "h", "o", "a", "", "g ", "i", "a", "o", "",
"d", "u", "c"]
> X:=subs(AN,vb2);
4
Đừng quên hai dấu { }
5
Vì thế dương lich còn được goi là lịch julien
f : x ÝÑ y ax + b[27]
Cách mã và giải mã cũng tương tự, hàm ngược của f (x) được định bởi:
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
cesar:=proc(vb, k, u)
local f:f:=i¡(i+u*k) mod 27; cesar2:=proc(vb, a, b, u)
[seq(vb[i], i=1..length(vb))] local f, g, ya, h:
subs(AN, %); ya:=1/a mod 27:
map(f, %); f:=i¡(a*i+b) mod 27;
subs(NA, %); g:=i¡(i-b)*ya mod 27:
map(cat, op(%)); if u=1 then h:=f else h:=g: fi:
end: [seq(vb[i], i=1..length(vb))]
map(h, subs(AN, %));
map(cat, op(subs(NA, %))); end:
Mã Khối
Sự kiện hàm mã là phép biến đổi a-phin khiến việc bẻ khóa tương đối dễ dàng. Mã khối
được tạo ra trong mục đích chống lại việc này bằng cách không mã từng chữ mà từng cụm u
chữ. Nếu trong mã César chúng ta mã bằng một phương trình thì ở đây ta sẽ mã bằng u phương
trình.
y1 ax1 + bx2 [m]
"
Gọi xi , yi lần lượt là các phần tử trong văn bản gốc và văn bản mật. Ta mã văn bản gốc
bằng:
[ ] [ ] ( )
y1
y2
A x2 mod m với A = c d
x1 a b
Và giả mã bằng:
[ ] [ ]
x1
x2
A y2 mod m
1 y1
x1
x2
A 1 25
37 =
22
1
Việc mã và giải mã khối tương đối dễ dàng, nhưng cần lưu ý:
Nếu chiều dài văn bản gốc là n và nếu làm việc với khối bằng u, ta phải có u|n. Nếu
không phải thêm vào một số lượng khoảng trắng để điều kiện này thỏa. Số khoảng trắng
phải thêm là [u irem(n, u)] mod u,
Sau khi mã bằng cách nhân ma trân khóa với các khối số (ở đây ta chọn u = 2), kết quả
cho ra là một bảng (array) không thể áp dụng tiếp theo đó các làm map (vốn chỉ dành
cho dãy list) nên cần thiết phải biến chúng thành những dãy trước khi đi tiếp,
Ma trận khóa A phải được chọn sao cho detA và n là hai số nguyên tố cùng nhau nghĩa
là (det A, n)=1. Nếu không thỏa ta vẫn thu được kết quả nhưng sau khi giải mã sẽ
không tìm lại được văn bản gốc.
Bây giờ ta mã và giải câu "van hoa giao duc" đã dùng trong mã César và còn lưu trong
biến vb2(11.8 Trang ...)
> with(linalg):u:=2
u := 2
> vb3:=[op(vb2)," "$ i=1..(u-irem(n,u))mod u];
vb3 := ["v ", "a", "n", "", "h", "o", "a", "", "g ", "i", "a", "o", "",
"d", "u", "c"]
> X:=subs(AN,vb3);n:=nops(X);
X := [22, 1, 14, 0, 8, 15, 1, 0, 7, 9, 1, 15, 0, 4, 21, 3]
n := 16
> A:=matrix([[1,3],[-2,7]]);
> seq(convert(evalm(A&*X[u*i+1..u*i+u]),list),i=0..n/u-1);
[25, 37], [14, 28], [53, 89], [1, 2], [34, 49], [46, 103], [12, 28],
[30, 21]
> Y:=map(op,[%]);
Y := [25, 37, 14, 28, 53, 89, 1, 2, 34, 49, 46, 103, 12, 28, 30, 21]
> Z:=map(i¡(imod27),Y);
Z := [25, 17, 14, 26, 26, 8, 1, 25, 7, 22, 19, 22, 12, 1, 3, 6]
> Z:=subs(NA,%);
Z := ["y ", "q ", "n", "z ", "z ", "h", "a", "y ", "g ", "v ", "s", "v ", "l", "a",
"c", "f "]
> msg:=map(cat,op(%));
msg := "yqnzzhaygvsvlacf "
Để dễ nhìn ta đặt kết quả vào một bảng:
[here]
Theo Bảng 11.3 ta thấy trong văn bản gốc có ba chữ a, được biến lần lượt thành q, a, s;
trong văn bản mã có hai chữ z được biến từ khoảng trắng và chữ h. Lý do là vì kết quả của việc
mã một mẫu tự còn tùy thuộc vào chữ đi kèm. Đó mới chỉ là khối 2. Ta dẽ tưởng tượng ra sự
phức tạp khi dùng các khối có gia trị lớn. Và dĩ nhiên việc "bẻ khóa" là điều không đơn giản
chút nào.
Để giải mã, ta chỉ cần lặp lại các công đoạn trên, nhưng thay a bằng A1 :
> vb2:=[seq(msg[i],i=1..length(msg))];
> vb3:=[op(vb2)," "$i=1..(u-irem(n,u))modu]
> X:=subs(AN,vb3);
X := [25, 17, 14, 26, 26, 8, 1, 25, 7, 22, 19, 22, 12, 1, 3, 6]
> seq(convert(evalm(inverse(M)&*X[u*i+1..u*i+u]),list),
i=0..n/u-1);
> Y:=map(op,[%]);
cube:=proc(vb, M, u)
local p,u,n,V,XM,X;
u:=linalg[rowdim](M):
[seq(vb[i], i=1..length(vb))]
V:=[%," "$i=1..(u-irem(length(n,u),u))modu]
X:=subs(AN,V);n:=nops(X);
if u=1 then XM:=M else XM:=linalg[inverse](M): fi:
seq(convert(evalm(XM&*X[u*i+1..u*i+u]),list),i=0..n/u-1);
map(i¡(imod27), map(op, [%]));
map(cat, op(subs(NA, %)));
end:
Những phương pháp này có một nhược điểm vô cùng to lớn là khi có sự trao đổi thông tin
hai chiều giữa nhiều người thì tất cả mọi thành viên trong cộng đồng đó phải tuyệt đối giữ kín
"chìa khóa chung". Việc này quả thực rất khó khăn. Phải tìm ra một phương pháp nào làm cho
sự bảo mật không tùy thuộc vào chiếc chìa khóa bí mật, và đó là phương pháp với mã mới, mã
RSA.
Mã RSA
Cơ sở lý thuyết
Một phương pháp mới là mã theo khóa công khai. Ý tưởng này do Diffie và Hellman
công bố vào năm 1976. Đến năm 1977, ba nhà toán học là Rivest (Mỹ), Shamir (Do Thái) và
Adlemann (Mỹ) của Massachusetts Institute of Technology (M.I.T) mới cụ thể ra phát minh mã
RSA . RSA chính là viết tắt tên của ba người này.
Sau nhiều năm cải tiến, kết hợp với nhiều phương pháp khác nhau cộng với sự xuất hiện
các máy tính gia đình, con người ta đã hoàn thiện những phần mềm với độ bảo mật cực tốt.
RSA ngày nay được dùng rộng rãi trong xã hội trong đó phải nhắc đến phần mềm bảo mật PGP
(Pretty Goods Privacy).
Nguyên tắc:
,
Cho hai số nguyên tố p, q /
Cho e P N , (m, e) = 1. /
ùñ @(x, y) P Z 2, y = xe[n] ô x = yd[n]
Tính d P Z , e.d 1[m]
/
-
Cụ thể, sau khi chọn p, q là hai số nguyên tố, tính n, m. Sau đó chọn e nguyên tố cùng nhau
với m và tính phần tử đảo d của e trong mô-đun m.
Cách sử dụng:
Để mã một mẫu tự (sau khi đổi thành số) ta làm: y = xe [n] (11.2.2)
Để giải mã một mẫu tự (sau khi đổi thành số): x = y d [n] (11.2.3)
(n, e) được gọ là khóa công khai. Khóa này được gửi cho mọi người. Hễ ai muốn gửi văn
bản cho ta, họ chỉ cần mã bằng công thức 11.2.2 trước khi gửi.
d được gọi là khóa bí mật, được dùng để giải mã theo công thức 11.2.3
Trước khi đi vào thí dụ, cần lưu ý vài điều sau:
1. Văn bản gốc sau khi chuyển thành số (bằng dãy AN và N A) cần phải chuyển sang cơ số
n = pq để mã. Để làm được điều này ta phải cộng chúng lại trong cơ số 27 (tổng số ký
tự) rồi dùng lệnh convert để chuyển sang cơ số n
2. n = pq là một số tương đối lớn (1000 chẳng hạn). Sau khi mã bằng y = xe [n] ta sẽ thu
được các con số nhỏ hơn 1000 nhưng lớn hơn 27 là số ký tự mà chúng ta đã khai báo trong
hai dãy AN và N A. Vì thế sau khi mã ta phải biến chúng sang cơ số 27 (giống như trong
công đoạn 1) để có thể chuyển thành mẫu tự la-tinh.
Thí dụ:
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
RSA:=proc(mot, u, n)
local f,NB:NB:=27; expo:=proc(m,e,n)
f:=x¡xˆu mod n: local L,f,r,i:
[seq(mot[i],i=1..length(mot))] L:convert(e,base,2)
subs(AN, %); f:=m mod n:
sum(%i*NBˆ(i-1),i=1..nops(%)); if L[1]=1 then r:m
map(f, %); else r:1: fi:
sum(%i*nˆ(i-1),i=1..nops(%)); for i in subsop(1=NULL,L)
convert(%,base,NB); do f:=fˆ2 mod n:
subs(NA, %); if i=1
map(cat, op(%)); then r:=(r*f) mod n:
end: fi:od:
end:
Bảng 11.5: Chương trình mã RSA và phép bình phương liên tiếp
> RSA(mot,125,39433);
"iroaixnf qacrf ngsghccoivxqqgc"
> RSA(%,4009,39433);
"lythuyetmakhoacongkhai"
Nhận xét:
So sánh giữa văn bản gốc và văn bản mã thì ta thấy không có cách nào để "lần mò" ra
logic để giải mã.
Chẳng những thế chiều dài văn bản lại khác nhau nên mọi cố gắng đối chiếu đều vô ích.
(ở thí dụ trên length(mot)=27,length(RSA(mot,125,39433))=29)
Cách duy nhất để giải mã là dùng công thức 11.2.3, nghĩa là tìm ra d = 1e [m].e thì ta có
(khóa công khai), phải tìm m = (p 1)(q 1), nghĩa là phải tìm p, q từ n.
Nói tóm lại muốn bẻ khóa phải thừa số hóa n, và thừa số hóa một số lớn (khoảng vài chục
chữ số) là một vấn đề nát óc của con người từ ngàn năm nay (xem Bài đọc thêm cuối
chương)
Và đây chính là sự tuyệt vời đem đến thành công cho mã RSA: Mọi người có thể mã bằng
khóa công khai (n, e) nhưng chỉ có người có chìa khóa (d) mới có thể giải mã. Bất kỳ ai
chiếm đoạt được văn bản mã cũng vô ích, và vì ai cũng có thể có "chìa khóa chung" nên
hoàn toàn không có vấn đề chìa khóa bị tiết lộ.
Trước khi đi tiếp mời bạn đọc xem một cách giải thích vui nhưng rất cụ thể về mã RSA (trích từ
Internet): Một người (A chẳng hạn) gởi đến cho tất cả bạn bè mình mỗi người một ổ khóa giống
nhau trong tư thế mở và giữ lại chìa. Ai muốn gởi thư cho A thì bỏ lá thư vào cái hộp kín rồi
bấm khóa ấy lại trước khi gởi bưu điện. Cho dù trên đường gởi có bị đánh cắp hoặc thất lạc
cũng không ai đọc được lá thư trên. Và chỉ có mình A mới có thể mở hộp bằng cái chìa khóa
của mình.
Cái ổ khóa đó chính là n, e và chìa khóa là d.
nào tương ứng với số 1 trong biểu diễn 13 trong có số 2. Ta có 13 = (1011)2 , vậy ta nhân kết
quả của lũy thừa 1, 4, 8.
> convert(13,base,2);
[1, 0, 1, 1]
Thí dụ trong ?? ta cần tính y 4009
> seq(yˆ(2ˆ(i-1)),i=1..12);
y, y 2 , y 4 , y 8 , y 16 , y 32 , y 64 , y 128 , y 256 , y 512 , y 1024 , y 2048
> convert(4009,base,2):%,nops(%);
[1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1], 12
Thay vì thực hiện 4009 phép nhân, ta chỉ bình phương liên tục 12 lần và chỉ nhân với nhau
ở các lũy thừa 1, 4, 6, 8, 9, 10, 11, 12, tổng cộng chỉ là 20 phép nhân, và như thế tiết kiệm được
một khoảng thời gian đáng kể.
Thuật toán đơn giản nhưng hữu hiệu này được thực hiện trong chương trình expo (Bảng
11.5, trang...). Và để cải tiến chương trình RSA, ta chỉ cần thay thế đúng một dòng
f := x¡ xpu mod n trở thành f := x¡ expo(x, u, n)
Ta gọi chương trinh mới này là RSA2:
Để kiểm chứng, ta dùng các số tương đối lớn:
> p:=nextprime(953):q:=nextprime(735):n:=p*q:m:=(p-1)(q-1):
> 'p'=p,'q'=q,'n'=n,'m'=m;
p = 967, q = 739, n = 714613, m = 712908
Chọn e = 9491. Tìm phần đảo của e trong mô-đun m:
> e:=9491:igcdex(e,m,'d'),d;
1, 36205
> word:="the period is always independent of the amplitude";
> u:=RSA(word,e,n);
u := "if lvhagwkbpbzrsvrmygtbrwborvlkstmxef ykpeadf ss"
Kết quả giải mã và thời gian thực hiện bằng chương trình RSA (Chưa cải tiến):
> t:=time():RSA(u,d,n);time()-t;
"theperiodisalwaysindependentof theamplitude"
14.963
Và với RSA2, chương trình sử dụng phép bình phương liên tiếp[8 ]
> t:=time():RSA(u,m-d,n);time()-t;
0.015
Khi dùng với phép bình phương tối thiểu để giải mã, chương trình chạy nhanh gấp 1000
lần!.[9 ] Và sự cách biệt này còn lớn hơn nữa khi văn bản dài và d lớn.
Chữ ký RSA
Vấn đề của chúng ta như sau: giả sử một thành viên nhận được một văn bản, làm thế nào
người ấy biết ai là người gởi vì ai cũng có khóa công khai của mình? và không biết có ai giả
mạo một thành viên để liên hệ với mình hay không?
Chữ ký RSA được áp dụng để:
Biết chính xác người gởi (tránh tình trạng thư nặc danh)
Trưng ra một bằng chứng của người gởi (không thể chối mình không gởi)
Không ai có thể sửa văn bản gởi cho một thành viên khác
Nguyên tắc: A và B là hai thành viên trong cộng đồng. Cả hai đều có khóa công khai của
(những) người khác:
+ Khóa công khai của A là (na , ea ), khóa bí mật là da
+ Khóa công khai của B là (nb , eb ), khóa bí mật là db
Giả sử A gởi cho B. Các công đoạn của chữ ký điện tử như sau:
A mã văn bản lần thứ nhất bằng khóa bí mật của mình (da )
A mã thêm lần nữa bằng mã công khai của B (nb , eb ) rồi gởi
B giải mã lần thứ nhất bằng khóa bí mật của mình (db )
Như thế B biết chắc chắn người gởi chỉ có thể là A (vì có "ký" da ) và A biết chắc chắn chỉ có B
đọc được văn bản mã bằng khóa của B.
Thí dụ:
+ Với p = 17, q = 137, (na , ea ) = (2329, 31), da = 351
+ Với p = 23, q = 191, (nb , eb ) = (4393, 43), db = 1847
Trước tiên, khai báo 4 hàm. Hai bên phía A, hai bên phía B:
> f a := x¡ xp31 mod 2329 : ga := x¡ xp351 mod 2329
> f b := x¡ xp43 mod 4393 : gb := x¡ xp1847 mod 4393
f a := x ÞÑ x31 mod 2329 f b := x ÞÑ x43 mod 4393
" "
ga := x ÞÑ x mod 2329
351
gb := x ÞÑ x1847 mod 4393
8
Chương trình expo không chấp nhận d 0 nên phải lấy modulo theo m
9
Con số này có thể thay đổi theo só lần thực hiện
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼ RSA3:=proc(mot,n,d,nb,eb)
local f,g:
f:=x¡expo(x,eb,nb):g:=x¡expo(x,d,n):
[seq(mot[i], i=1..length(mot))]
subs({AN},%); sum(%[i]*NBˆ(i-1),i=1..nops(%));
convert(%,base,n): map(g,%);map(f,%):
sum(%[i]*nbˆ(i-1),i=1..nops(%));
convert(%,base,NB); map(cat,op(subs(NA,%)));
end:
Bảng 11.6: Chương trình mã RSA có ký tên và liên kết với phép bình phương liên tiếp.
> RSA3(%,2329,351,4393,43);
woapboteeqkwmubswdlxwublqbvhcjcvjf ptaxade
gctxgauowhjtlwbnqoitbtnlxiiteaqihvojpkbd
Và B sẽ tìm lại đươc câu nói bất hủ trên bằng lệnh:
> RSA3(4393,43,2329,31);
Mặc dù có tính bảo mật cao, nhưng cần quan tâm chi tiết khi sử dụng RSA.
Hai thuật toán được dùng để "mò" ra p, q là Pollard và Fermat. Pollard khởi đầu bằng các
?
số nguyên tố nhỏ 3, 5, 7 . . ., nếu n chia chẵn cho chúng là khóa đã bị bẻ. Ngược lại Fermat
khởi đầu bằng n và "bung" ra hai bên, nếu n chia chẵn cho một trong những số ấy là kể
như xong.
Vậy: tránh chọn p (hoặc q) nhỏ, lân cận
?n và phải tương đối cách biệt nhau.
Giả sử A gởi cho 3 bạn với 3 khóa công khai (ni , ei ) khác nhau, nhưng vì "làm biếng" họ
chọn cùng giá trị e, chẳng hạn (85, 3), (143, 3), (133, 3). Nếu A gởi x = 62 thì 3 người
kia sẽ nhận được 73, 90, 125(73 623 [85] . . .). Nhưng ai đó có được ba kết quả này cùng
với ba khóa công khai thì kể như "tiêu đời". Hắn ta chỉ dùng định lý Trung Quốc một phát
là tìm ra văn bản gốc:
> chrem([73,90,125],[85,143,133])ˆ(1/3):%=simplify(%);
?3
238328 = 62
Vậy: tránh "làm biếng" hoặc đã lỡ thì A phải cố gắng sửa cho 3 văn bản đừng giống nhau
hoàn toàn (thêm vào các khoảng trắng giữa các chữ...)
Tuy nhiên có những cách chỉ cần biết khái niệm về RSA và một chút "ma lanh" là có thể
bẻ khóa dễ dàng. Giả sử một ngày đẹp trời, bạn nhận được một email của người bạn đính
kèm một văn bản rồi yêu cầu bạn mã và ký tên bằng khóa bí mật của bạn. Nếu bạn làm
điều này thì kể như ... xong. Vì lúc ấy với văn bản gôc và văn bản mã cộng với khóa công
khai của bạn, hắn sẽ tìm ra khóa bí mật, và dĩ nhiên bạn sẽ lãnh hậu quả.
Vậy: không bao giờ "làm ơn" mã và ký tên vào một văn bản nếu có khả nghi. Bạn có thể
làm việc đó nhưng nhớ thêm vào văn bản gốc một vài dấu trắng.
11.3 Bài đọc thêm Bẻ khóa RSA: Con đường chông gai
Trong suốt chương nói về mật mã RSA chúng ta đã thấy tạo ra một khóa là chuyện rất dễ
dàng, nhưng bẻ khóa (tìm ra d) là một việc cực kỳ khó khăn. Lý do là từ hồi con người biết làm
tính cộng bằng những thanh tre, cục đá cho đến ngày nay, khi chỉ một cái clic chuột là một tỷ
phép tính được hoàn tất, con người vẫn chưa tìm ra thuật toán để thừa số hóa một cách thật hữu
hiệu và nhanh chóng.
Ta thử vài phép toán sơ đẳng. Cho n = 33 34 35 . . . 72 73 ta sẽ có một số 71 chữ
số.
> seq(k,k=33..73);
> n:=convert([%],'*'):length(%);
71
Chỉ cần 4/1000 giây Maple có thể thừa số hóa n thành tích của 21 số nguyên tố.
Nhưng phải mất 400 giây để phân tích n + 1 thành 4 số nguyên tố.
Chỉ cộng thêm 1 mà phải mất 100.000 lần thời gian nhiều hơn. Đơn giản là vì càng ít thừa
số thời gian tìm càng lâu. Vậy nếu n + 1 là tích của 2 số nguyên tố thì thời gian tìm sẽ rất lâu.
Và tích của hai số nguyên tố chính là khóa RSA mà chugns ta vừa khảo sát.
Bẻ khóa RSA hay thừa số hóa nói chung là một trong những cuộc chạy đua kỳ thú nhất của
các nhà khoa học. Phương pháp đầu tiên và dĩ nhiên sơ khai nhất do Eratosthène, một mà Toán
học Hy Lạp cổ đại phát minh ra từ năm 250 trước Công Nguyên[12 ].?Theo phương pháp này, để
thừa số hóa n, người ta đem chia nó cho các số nguyên tố nhỏ hơn n. Dĩ nhiên phương pháp
này chỉ có thể áp dụng khi n nhỏ mà thôi, vì theo Tchebicheff, nếu n ¡ 10 thì số nguyên tố nhỏ
hơn n (được gọi là π(x)) được tính bằng công thức:
Theo công thức này, để thừa số hóa một khóa RSA 100 chữ số nghĩa là tích của hai số nguyên
tố 50 chữ số phải cần đến 1050 / ln(1050 ) 0.92 ≈ 0.8 1048 phép chia. Nếu đem thực hiện
trên một máy tính lượng tử(!) có khả năng tính 1000 phép chia mỗi nano-second, ta cần khoảng
2 1028 năm. Một khoảng thời gian vượt ngoài trí tưởng tượng khi chúng ta biết rằng vũ trụ chỉ
"mới" được hình thành vào khoảng 13 109 năm... (theo những dữ kiện thu thập từ kính thiên
văn Hubble ngày 26/4/2005)
Một chi tiết cũng cần được quan tâm là vì chúng ta làm việc trong hệ nhị phân. Nếu dùng
k bits để mã thì số khóa là 2k , và khi tăng thêm một bit là tăng lên gấp đôi số khóa và dĩ nhiên
cũng tăng lên gấp... nhiều lần thời gian tính toán. Sự tương ứng giữa k và chiều dài khóa (số
các chữ số) được tính bằng:
> seq([2ˆk,length(2ˆ(2ˆk))],k=5..11);
[32, 10], [64, 20], [128, 39], [256, 78], [512, 155], [1024, 309],
[2048, 617]
Cụ thể là khi mã trên 64 bits, chiều dài khóa là 20, và khi cùng 128 bits chiều dài khóa là
39 và cứ thêm 1 bits là số khóa tăng gấp đôi (2k+1 = 2.2k ). Một khóa mã với 128 bits sẽ khó
thừa số hơn gấp 2128 /264 = 18 tỷ tỷ lầm một khóa 64 bits.
Dĩ nhiên con người đã tìm ra nhiều phương pháp khác để thừa số hóa một khóa RSA, có thể
12
Xem bài đọc thêm trang ...
kể đến là các phương pháp Fermat, Pollard, đương cong ellips, sàng toàn phương (tạm dịch từ
tiếng Pháp là crible quadratique).
Vào ngày 22/8/1999, con người đã phá kỷ lục khi thành công "bẻ" khóa RSA-155 (512) bits.
Kết quả này không những thành công về mặt tính toán thuần túy (thuật toán Pollard) mà đó còn
là một điểm son cho kỹ thuật máy tính hiện đại: 300 máy tính của 11 phòng thí nghiệm được nối
kết liên lục địa qua 6 quốc gia đứng hàng đầu trong cả hai lãnh vực này là Hà Lan, Mỹ, Canada,
Úc, Anh và Pháp. Các thành viên tham dự đều là những chuyên gia hàng đầu về tính toán hình
thức, lý thuyết số và mật mã.
Công việc khổng lồ này được chia làm hai gia đoạn. Giai đoạn đầu do 300 máy tính cá
nhân thực hiện với kết quả là một ma trân kích thước khoảng 7.000.000. Giai đoạn thứ hai "đơn
thuần" chỉ là giải hệ phương trình tuyến tính tương ứng vơi ma trận khổng lồ trên. Việc này đã
kéo dài 224 giờ trên Cray-C916 với 2 giga-byte, một máy tính véc-tơ cực mạnh của trung tâm
SARA ở Amsterdam, là nơi điều hành mọi công việc. Tổng cộng người ta đã mất khoảng 3 tháng
rưỡi với một ngân quỹ khoảng 2 triệu USD để thừa số một số 155 chữ số thành hai số nguyên
tố có chiều dài 78:
RSA155=1094173864157052742180970732204035761200373294544920
5990913842131476349984288934784717997257891267332497
625752899781833797076537244027146743531593354333897
=102639592829741105772054196573991675900
716567808038066803341933521790711307779
106603488380168454820927220360012878679
207958575989291522270608237193062808643
Sau này nhiều phần thưởng đã được hứa hẹn cho ai có thể thừa số những khóa RSA dài hơn.
Giải thưởng cho khóa RSA-576 (147 chữ số) là ... 10.000 USD (đã có người ẵm vào năm 2003),
cho RSA-640 (193 chữ số) là 20.000 USD (chưa ai ẵm), cho RSA-2048 là 200.000 USD. Các
bạn muốn thử thời vận có thể xem chi tiết tại:
http://www.rsasecurity.com/rsalabs/challenges/factoring/numbers.html
Một lời khuyên: cứ xem những gì người ta đã làm năm 1999, nếu bạn thực sự cần tiền chỉ
nên thử thời vận khi bạn có đủ aspirine và đủ thời giờ. Vì theo luật Moore[13 ], con người sẽ thừa
số được RSA-2048 và năm 2079...
13
Theo luật này khả năng máy tính tăng lên 8 lần sau 3 năm
Không những Maple có thể giải quyết được những bài toán cực kỳ phức tạp, mà nó còn
có khả năng tạo ra các hình động (animation). Những hình động này rất hữu ích khi chúng ta
muốn thấy được sự thay đổi của những gì vừa tính toán-mà con người thường không thể thực
hiện được. Việc này sẽ giúp cho công việc giảng dạy trở nên hấp dẫn và tạo sự chú ý cho học
viên, giúp họ hiểu nhanh hơn bài toán.
Nói "Maple có khả năng tạo ra các hình động" thật ra cũng không đúng, vì Maple chỉ tạo
nên những hình tĩnh (fixed), và chính chúng ta phải tìm cách biến đổi và "ghép" chúng thành
một hình động. Nguyên tắc chỉ có thế nhưng đôi khi bài toán đòi hỏi nhiều cải tiến, để làm được
chuyện này, chỉ có cách "mày mò" để giải quyết những yêu cầu trên, đồng thời tự tìm ra những
phương thức mới.
Nguyên tắc cơ bản của hình động có lẽ tất cả mọi người đều biết: nguyên tắc chiếu phim.
Đó là một dãy những hình tĩnh được xếp theo thứ tự, hình sau khác hình trước một chi tiết nhỏ.
Và khi lần lượt hiển thị với một vận tốc nào đó, những hình tĩnh này sẽ tạo ra chuyển động.
Trình bày nguyên tắc cơ bản và các ứng dụng cụ thể là mục đích của chương này
Thí dụ
Đầu tiên chúng ta nhập các thư viện tiên ích và khai báo một số chữ viết tắt trong suốt
chương:
> with(plots):with(plottools):
> alias(IT='insequence=true',SC='scaling=constrained'):
Cho hàm f (x) = sin(x), đồ thị là hình 12.1 (a):
> plot(sin(x),x=0..5*Pi,tickmarks=[3,3];
Tạo hình động cho đồ thị trên. Giả sử chúng ta muốn đồ thị chuyển động theo phương x
(giống như trong các oscilloscope), chúng ta chỉ cần cho biến x di chuyển một khoảng cách là
các đồ thị sẽ tịnh tiến một khoảng cách đó. Để làm điều này, cần khai báo một dãy với chỉ số i.
Ở đây ta khai báo i chuyển dịch từ 0 đến 3. Sau đó, dùng hàm display để hiển thị 4 chuyển
động tĩnh.
Chương 12. Xử lý hình động
Hình 12.1: Hình tĩnh của hàm sin(x) và 4 chuyển động khác nhau
> p:=seq(plot(sin(x-i),x=0..5*Pi).i=0..3):
> display(p,tickmarks=[3,3];
Và kết quả là Hình 12.1 (b)
Để tạo hình động, ta cần hiển thị hình thứ n sau khi tắt hình thứ n 1, ta đặt option inse-
quence=true (viết tắt bởi alias) là IT)
> display(p,IT);
Dùng nút chuột trái bấm vào hình rồi dùng các nút trên thanh công cụ [Hình 12.1 (c)] để
xem hình chuyển động. Ta thấy có chuyển động nhưng quá nhanh. Để kéo dài thời gian, ta cho
i chạy từ 1 đến 10:
> seq(plot(sin(x-i),x=0..5*Pi).i=0..10): display(%,IT);
Tuy nhiên chuyển động vẫn còn quá nhanh. Lý do là vì i chạy từ 1 đến 10 với bước nhảy
là 1. Để giảm vận tốc ta chia nhỏ bước của i. Thí dụ giảm 4 lần ta chia i cho 4, và để đảm bảo
thời gian như cũ, ta phải cho i chạy từ 1 đến 40 thay vì 10:
> seq(plot(sin(x-i/4),x=0..5*Pi).i=0..4*10): display(%,IT);
Như vậy "đoạn phim" sẽ gồm 40 hình, thời gian tính sẽ lâu hơn, nhưng kết quả dễ qua sát
hơn. Kỹ thuật giảm vận tốc bằng cách chia nhỏ các bước trong dãy seq sẽ được chúng ta áp
dụng cho suốt chương này.
Thí dụ 2
Cho hàm f (x) = sin(x) trong khoảng [0, 10]. Hình tĩnh này là (không hiển thị):
> plot(x,x=0..10):
Bây giờ, giả sử chúng ta muốn tạo hình động, trước tiên đồ thị trên được vẽ từ 0 tới 1, sau
đó từ 1 tới 2 và tiếp tục như thế tới 10. Như thế hình động sẽ gồm các hình tĩnh có x từ 0 tới i, i
chạy từ 1 đến 10. Dãy (seq) sẽ có 10 hình tĩnh:
> seq(plot(x,x=0..i),i=1..10): display(%,IT);
Nếu chúng ta muốn chuyển động chậm hơn, ta chia độ tăng của i cho 5 lần chẳng hạn, khi
x = 10, i phải chạy từ 1 đến 50:
> seq(plot(x,x=0..i/5),i=1..50): display(%,IT);
Bây giờ ta muốn tạo hình động cho một đoạn thẳng có chiều dài 1 (cố định) chạy theo đường
f (x) = x. Cũng giống trường hợp trên, ở đây x đi từ i đến i + 1 và i chạy từ 0 đến 45. Muốn
i i
hình vẽ mịn ta giảm bước nhảy, x đi từ đến + 1:
5 5
> seq(plot(x,x=i/5)..(i/5)+1,i=0..45): display(%,IT);
Thí dụ 3
Trong thí dụ này chúng ta sẽ cho quay một chong chóng có ba cánh. Cách đơn giản nhất để
vẽ là dùng tọa độ cực [Hình 12.2 (a)]:
> p:=polarplot(cos(3*t),t=0..Pi,SC): display(p)
Để tạo hình quay, ta dùng lệnh rotate [Hình 12.2 (b)]:
> rotate(p,Pi/6);
Hình 12.2: (a) Chong chóng ở vị trí đầu, (b) sau khi quay 30o và (c) 4 chuyển động 5o
2π
Vì chong chóng có 3 cánh nên góc giữa hai cánh là , hay nói cách khác, khi chong chóng
3
Phạm Minh Hoàng 233
Chương 12. Xử lý hình động
2π
quay, một cánh vẽ đến vị trí của cánh đi trước sau khi quay một góc = 120o . Như thế ta chỉ
3
π
cần chia góc này ra làm nhiều phần. Giả sử giữa hai hình tĩnh, chong chóng quay một góc 5o 36 .
Để đơn giản ta sẽ khai báo một hàm mũi tên theo i, và để 4 hình tĩnh liên tục ta làm [Hình 12.1
(c)]:
> f:=i¡rotate(p,i*Pi/36): display(seq(f(i),i=0..3),SC);
π
Và để tạo hnình động ta chọn bước quay là 10o 18 , nhe thế phải mất 12 bước mới đi hết một
o
góc 120 . Như thế trong dãy, i sẽ thay đổi từ 0 đến 11 là xong một chu kỳ:
> f:=i¡rotate(p,i*Pi/18):
> display(seq(f(i),i=0..11),IT,SC);
Ta cũng có thể dùng hàm số hợp để làm hình động. Cứ mỗi hàm f (i), chong chóng sẽ quay
10o , vậy khi áp dụng k lần ta có:
> g:=k¡(f@@k)(p);
g := k ÞÑ(f (k))(p)
Cùng một lý luận như trên, phải quay 12 lần mới xong một chu kỳ:
> display(seq(g(i),i=1..12),IT,SC);
.y
.t
.x
.
Hình 12.3:
Thí dụ 1
Cho một bánh xe bán kính r lăn không trượt trên Ox. Trên vành bánh xe có gắn một van.
Tạo hình động của hệ thống.
Ta giả sử r = 4. Năm chuyển động đầu tiên của bánh xe: [Hình 12.4 (a)]
> r:=4: display([q(4)],SC);
Riêng đối với van xe, ta dùng hàm disk để khai báo. Ở đây ta tô xám để phân biệt với vành
xe. Năm chuyển động đầu tiên của van xe (bán kính van: 0.5) là:
> p1:=k¡seq(disk([sin(t),cos(t)],.5,color=wheat),t=1..k):
> display(p1(5),SC);
Ở đây ta khai báo tọa độ của van là [sin(t),cos(t)] thì bánh xe lăn theo chiều kim đồng
hồ, tương ứng với chiều lăn về phía x ¡ 0 [Hình 12.4 (b)]. Nếu khai báo [cos(t),sin(t)]
thì bánh xe lăn theo chiều lượng giác, tương ứng với chiều lăn về phía x 0.
Hình 12.4: (a) Chuyển động tịnh tiến của bánh xe và (b) chuyển động quay của van
xM = ON = OP N P = rt r sin(t)
"
yM = N M = P C AC = r r cos(t)
.y
.C
.r
.t
.M .A
.x
.
.O .N .P
Hình 12.5:
Đây là phương trình của đường cycloid mà ta có thể vẽ dễ dàng bằng hàm tham số. Tuy
nhiên, ta cũng có thể vẽ bằng tọa độ Descartes:
> eqx:=x=r*t-r*sin(t): eqy:=y=r-r*cos(t):
Để loại t ta bắt buộc phải giải t theo y (biểu thức của eqy) rồi thế vào eqx[1 ]. Để tìm lại
đường cycloid ta phải lấy hình đối xứng qua đường phân giác thứ nhất (lấy r = 1):
> solve(eqy,t): eq:=subs(t=%,eqx): eq;
yr (y r)2
c
x = r(π arccos( )) r 1
r r2
> plottools[reflect](plot(subs(r=1,rhs(eq)),y=0..5),
[[0,0],[1,1]]);
Và chuyển động (dĩ nhiên chỉ thấy trên màn hình) là:
> display([p(19*r)], insequence=true,SC);
Ta có thể làm cách khác - bằng cách dùng các lệnh display ngay khi khai báo các hàm
q(i), s(i) và kể từ bây giờ ta viết tắt lệnh color=wheat):
> alias(CW='color=wheat'):
> q:=k¡display(seq(cr(i),i=0..k),IT,SC):
> s:=i¡display(seq(
disk([r*t/r-r*sin(t/r),r-r*cos(t/r),.05],color=black),t=0..i),IT,SC);
Và cách tạo hình động bây giờ đơn giản hơn. Lưu ý: với cách này và không cần khai báo
IT, SC trong lệnh tạo chuyển động sau:
> display([s(19*r),q(19*r)]);
Chuyển động của van xe có hình cycloid. Chúng ta sẽ trở lại thí dụ này ở mục (12.5.3)
với nhiều tính toán phức tạp và lý thú.
Thí dụ 2
Cho hai chiếc xe A và B khởi hành cùng lúc với hai vận tốc khác nhau và chạy theo phương
Ox. Tạo hình động của chuyển động.
Hình 12.7: 4 chuyển động với khoảng cách thời gian (a) đều và (b) không đều
Và để tạo hình động, chúng ta sẽ chia nhỏ thời gian 5 lần để dễ quan sát:
> g1:=seq(f1(i/5),i=1..50): display(g1,SC,IT);
Đối với chiếc xe thứ 2 (xe B), các khai báo cũng tương tự, chỉ khác chiếc xe A ở tung độ
của xe. Mặt khác chúng ta còn thêm đồ thị của con đường của xe B:
> v2:=i¡polygon([[i,3],[i+1.5,3],[i+1.5,2.5],[i+2,2.5],
[i+2,2],[i,2]]):
> r2:=i¡disk([i+.5,2],.2,CW): s2:=i¡disk([i+1.5,2],.2,CW):
> n2:=i¡(textplot([i+.9,2.6,"B"],font=[COURIER,BOLD,14])):
> f2:=i¡display(v2(i),r2(i),s2(i),n2(i)):
> p2:=plot(1.98,x=0..12):
> g2:=seq(f2(i/5),i=1..50):
Hình 12.8: (a) Cả hai xe ngừng cùng lúc và (b) lần lượt ngừng
hình tĩnh đó. Ở đây ta muốn là hình cuối cùng, có nghĩa là hình i = 8 hoặc i = 10 [2 ].
> display([f1(8),f2(10)],SC,view=[0..12,0..3]);
> display([f1(10),f2(10)],SC,view=[0..12,0..3]);
Lệnh thứ nhất tạo ra [Hình 12.8 (a)]. Một lưu ý khác là ở đây ta dùng view để xác định
khoảng chia trên các trục tọa độ. Điều này bắt buộc vì nếu không sẽ mặc định từ 10 (hoặc 8)
đến 12.
2
Ta có thể dùng hard copy bằng cách nhấn Alt-PrtSc rồi dán vào Corel Draw để xử lý.
Khi quan sát kết quả trên màn hình ta thấy chuyển động không "nhuyễn" như trước. Đây
là điều không tránh khỏi khi tăng vận tốc. Mặt khác khi dùng nút chạy từng bước, ta thấy khi
i = 5 cánh quạt đã hoàn tất chu kỳ đúng như đã khai báo i = 0.. 11
2
(Maple chỉ lấy số nguyên
trong lệnh seq).
Một cách tổng quát hơn khi muốn thay đổi vận tốc n lần (n P Q ). Ta khai báo một hàm fp
với biến là n:
> fp:=n¡display([seq(f(n*i),i=0..11/n)],SC,IT);
Chẳng hạn:
Hình 12.9: (a) Chuyển động với thay đổi đều và (b) thay đổi không đều
Quan sát [Hình 12.9 (a)] ta thấy biên độ của đồ thị giảm dần khi i tăng, nhưng sự giảm này
rõ ràng là không đều. Ở những bước đầu i 3 thì ta còn phân biệt được sự giảm này nhưng khi
i ¡ 7 thì các đường cong sát lại với nhau và biên độ giảm một lượng rất nhỏ. Nếu tiếp tục cho
i tăng lên thì chỉ thấy một nét đen đậm và đương cong tiến về trục hoành vô cùng chậm. Khi
muốn tạo hình động với i lớn, thì chuyển động không được phân bố đều, ta thấy chuyển động
sẽ vô cùng chậm:
> seq(plot(sin(x)/i,x=0..5*Pi),i=1..20): display(%);
Để giải quyết trở ngại này, nghĩa là làm sao cho chuyển động thật đều, không còn lúc nhanh
lúc chậm, ta phải làm sao cho chỉ số i không thay đổi mỗi lần với bước nhảy 1, mà i càng lớn
thì khoảng [i, i + 1] càng lớn. Lý tưởng nhất là ta dùng dãy Fibonacci vì hai lý do: thứ nhất dãy
này đã có khai báo sẵn trong Maple, thứ hai độ tăng của dãy vô cùng lớn, thỏa mãn yêu cầu của
chúng ta là "chia đều" chuyển động. Để dùng dãy Fibonacci, phải nhập thư viện combinat
> with(combinat):
> s:=fibonacci(i)$i=1..19;
s := 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,
1597, 2584, 4181
Ở đây ta chỉ cần lấy 10 số hạng đầu để hiển thị:
> seq(plot(sin(x)/i,x=0..5*Pi),i=s[1..10]): display(%);
Xem [Hình 12.9 (b)] ta thấy 10 đường cong tương ứng với 10 giá trị của i có vẻ được dàn
trải ra đều hơn và tiến sát tới trục hoành hơn trường hợp thay đổi đều.
Và để tạo hình động:
> seq(plot(sin(x)/i,x=0..5*Pi),i=s[1..10]): display(%,IT);
Ta cũng có thể khai báo thêm một chuyển động đối xứng với chuyển động trên qua trục
hoành, và khi cho chạy cả hai hình ta sẽ có một chuyển động thường thấy trong lãnh vực điện,
điện từ:
> p1:=seq(plot(sin(x)/i,x=0..5*Pi),i=s[1..10]):
> p2:=seq(plot(-sin(x)/i,x=0..5*Pi),i=s[1..10]):
> display([p1,p2],IT);
Trong trường hợp độ tăng của dãy Fibonacci quá lớn không phù hợp với chuyển động thật,
ta có thể chia đôi các phần tử của dãy này:
> s:=fibonacci(i)/2$i=1..20:
Nếu cũng chưa thích hợp, ta bắt buộc phải tự tạo ra các dãy theo ý muốn. Chẳng hạn dãy
với độ tăng là số thứ tự của lần tăng, có nghĩa là số thứ hai bằng số thứ nhất +1, số thứ ba bằng
số thứ hai +2, số thứ tư bằng số thứ ba +3 ... Maple không có sẵn các dãy này, nhưng lập trình
rất dễ dàng:
> k:='k': i:='i': j:='j': k:=1: j:=0: P:=NULL:
> for i to 20 do k:=k+j: j:=j+1: P:=P, k; od: P;
1, 2, 4, 7, 11, 16, 22, 29, 37, 46, 56, 67, 79, 92, 106, 121, 137, 154, 172, 191
Một điều cần lưu ý ở đây là khi lập trình chúng ta nên cẩn thận nhập các giá trị đầu cho các
biến. Chẳng hạn với lệnh for như trên, nếu k, j không có giá trị đầu, lệnh này sẽ sai.
> k:='k': i:='i': j:='j':
> j:=0: P:=NULL: for i to 20 do k:=k+j: j:=j+1: P:=P, k; od:
Error, recursive assignment
Mặt khác, sau khi thực hiện lệnh for, ta lại giải phóng các biến trên để tránh nhầm lẫn.
.m2
.4
.m4
.(a) .(b)
Teo Newton thì một vật khối lượng m được "hút" bởi một vật bên cạnh khối lượng M
băng một lực f = G Mr2m --trong đó r là khoảng cách giữa hai vật và G là hằng số vũ trụ
(G = 6.67 1011 ) trong hệ MKS. Và chính lực hướng tâm này đã tạo ra quỹ đạo ellipse và
chuyển động mà Képler đã kiểm chứng ở trên. Dưới đây ta sẽ tạo hình động để lấy được chuyển
động phức tạp này.
Trước tiên ta tạo ra quỹ đạo ellipse. Trong hệ tọa độ trực chuẩn Oxy, phương trình của
ellipse có bán kính theo (x, y) là (5, 4) là:
> eq:=xˆ2/25+yˆ2/16=1;
x2 y2
eq := + =1
25 16
Đường biểu diễn được gán vào biến tj [Hình 12.11 (a)]:
> tj:=implicitplot(eq,x=-5..5,y=-4..4): display(%);
Từ phương trình ellipse, ta khai báo một hàm y = f (x). Hàm này dùng để tính tung độ của
một điểm sao cho điểm ấy nằm trên ellipse.
?
> f:=unapply(sqrt(rhs(isolate(eq,yˆ2))),x);
f:= x ÞÑ 45 25 x2
Bây giờ ta bước vào phần phức tạp của vấn đề là tính hoành độ của mặt trăng (điểm m). Để
chuyển động phản ảnh chính xác định luật Képler, ta phải đi từ gốc của nó là định luật Newton:
trọng lực là một lực tỷ lệ với khoảng cách bình phương. Giả sử ban đầu mặt trăng ở A [Hình
12.11 (a),(b)], hoành độ là 5. Ta thiết lập một dãy các hoành độ tỷ lệ với k 2 , trong đó k sẽ thay
đổi từ 0 đến một giá trị kmax nào đó sao cho hoành độ ở kmax này tương ứng với B(5, 0). Sau
khi "lần mò" chúng ta được một dãy có công thức tổng quát là:
một dãy s2 với các phần tử giống như s1 nhưng thứ tự ngược (vì hoành độ của mặt trăng bây
giờ đi từ +5 đến 5 ), mặt khác tung độ tương ứng sẽ đối xứng với chuyển động nửa ellipse trên
qua trục hoành, nghĩa là f (i) sẽ trở thành f (i):
> s2:=seq(-5+kˆ2*.0493,k=-14..0);
s2 := 4.66, 3.33, 2.10, .97, .07, 1.01, 1.84, 2.58, 3.23, 3.77,
4.21, 4.56, 4.80, 4.95, 5.
[Hình 12.11 (b)] biểu diễn chuyển động từ B đến A (nửa ellipse dưới), còn [Hình 12.11 (c)]
biểu diễn toàn chuyển động:
> g2:=seq(display(tj,disk([k,-f(k)],.2)),k=s2): display(%);
> display(%): display(g1,g2);
Hình 12.11: Chuyển động của mặt trăng quanh trái đất theo định luật Képler
Quan sát [Hình 12.11] ta thấy rõ ràng là một chuyển động thay đổi không đều. Các hình
tròn nhỏ tượng trưng cho vị trí mặt trăng sát nhau khi ở gần A[5, 0] và càng tiến đến B[5, 0]
thì các vị trí càng rời xa nhau. Nói cách khác, càng gần A, mặt trăng di chuyển càng chậm và
nhanh nhất khi đến B, Trái đất sẽ ở đâu đó gần vị trí [2, 0] [Hình 12.11 (c).]
Và để tạo hình động, may mắn cho chúng ta là trường hợp này đơn giản hơn nhiều so với
trường hợp hai chiếc xe của thí dụ trước. Ở đây chỉ có hai chuyển động g1 nằm trên trục Ox, g2
nằm dưới Ox và g2 chỉ được khởi động sau khi g1 chấm dứt. Ta có:
> display([g1,g2],insequence=true);
Trên màn hình ta thấy trở về A thì có vẻ như "giật lại" (nếu dùng nút autoreplay, [xem Hình
12.1 (c)], trang...). Lý do là vì dãy s2 được kết thúc ở hoành độ 5 và dãy g1 cũng lại bắt đầu
bằng 5. Khi kết hợp hai dãy này thì tạo ra hiệu ứng trên. Để giải quyết, ta chỉ cần loại phần tử
sau cùng này trong dãy s2 :
> s2:=seq(-5+kˆ2*.0493,k=-14..-1;
Nhưng với những khai báo trên, chuyển động còn quá nhanh. Ta cần phải chia nhỏ hơn,
sau vài lần thử nghiệm ta sẽ tìm được công thức tổng quát của dãy là:
Thí dụ 1
Cho hàm f (x) = ex sin x2 . Tạo thành hình động của tiếp tuyến với đồ thị của f . Ta khai
2
gần đúng:
> u:=fsolve(diff(f(x),x),x);
u := .6927082534
> v:=fsolve(diff(f(x),x,x),x,x=0.5..2);[4 ]
v := 1.199815154
> seq(plot([f(x),tg(i)],x=-2..2,view=[-2..2,-.3..0.3],
thickness=[2,1],linestyle=[1,4]),i=[-3/2,u,v,2]):
> display(%); [Hình 12.12 (a)]
Để có hình động ta chia nhỏ thêm [Hình 12.12 (b)] và dĩ nhiên phải dùng insequence=true:
> seq(plot([f(x),tg(i/10)],x=-2..2,view=[-2..2,-.25..0.25],
thickness=[2,1],linestyle=[1,4]),i=-20..20):
> display(%,insequence=false);
Thí dụ 2
8
°
1
Cho un = n
cosn (x) cos(nx). Tính un và biểu diễn sự hội tụ dưới dạng hình động.
n=1
> u:=cos(x)ˆn*cos(n*x)/n;
Phép tính trực tiếp không cho ra kết quả:
> sum(u,n=1..infinity);
8 (cos(x))n cos(nx)
°
n=1 n
Đặt hàm lượng giác dưới dạng hàm mũ: cos x = ℜ(eIx ), cos nx = ℜ(eInx )
> sum(exp(I*x)ˆn*exp(I*n*x)/n,n=1..infinity);
4
bắt buộc phải xác định khoảng muốn tìm, nếu không Maple sẽ chỉ tìm ra x = 0
(e
Ix )2 ln(1 e2Ix)
e2Ix
Lấy phần thực của kết quả trên. Biểu thức này cực kỳ phức tạp không thể in ra đây, nhưng
khi đơn giản xong thì thật ngắn gọn, đó chính là kết quả muốn tìm:
> evalc(Re(%)):
> S:=simplify(expand(%),symbolic);
S := ln(2) ln(1 cos(2x))
1 1
2 2
k
°
Để tạo hình động, trước tiên ta khai báo hàm tổng từng phần Sk = un và cho k tiến đến
n=1
giá trị lớn. Nếu đúng, Sk sẽ hội tụ về S. Dưới đây ta lấy 12 giá trị đầu tiên của Sk :
> Sk:=k¡sum(cos(x)ˆn*cos(n*x)/n,n=1..k);
8 (cos(x))n cos(nx)
Sk = k ÞÑ
°
n=1 n
> g1:=seq(plot([S,Sk(i)],x=0..Pi-.01,view=[0..3,-.8..2],
thickness=[3,1]),i=[k/2$k=0..12]):
> display(g1,SC); [Hình 12.13 (a)]
°k 1
Hình 12.13: Sự hội tụ của n=1 [ cos(x)n cos(nx)]
n
Quan sát [Hình 12.13 (a)] thì thấy "có vấn đề". Ở k = 12 rõ ràng Sk không hội tụ về S. Lý
do là khi lấy phần thực của un (x), chúng ta đã làm ℜ(eInx )ℜ(eIx ). Nhưng:
> algsubs(cos(2*x)=1-2*sin(x)ˆ2,rhs(%)):
?
%=simplify(%,radical,symbolic);
ln( 12 4 sin(x)2 ) = ln(sin(x))
a
Để tạo hình động ta làm giống như [Hình 12.13 (b)] là hình tĩnh tương đương:
> g2:=seq(plot([-ln(sin(x)),Sk(i)],x=0..Pi-.01,view=[0..3,0..2],
thickness=[3,1]),i=[k/2$k=0..12]):
> display(g2,IT,SC);
Để tạo chuyển động của riêng viên bi và của đường thẳng - giả sử từ hoành độ 0 đến 3:
> s(30); p(30);
5
insequence=true
.4 .4
.2 .2
. .
.0 .2 .x .4 .0 .2 .x .4
.4 .4
.2 .2
. .
.0 .2 .x .4 .0 .2 .x .4
Khi gom hai chuyển động sẽ thấy viên bi vừa chạy vừa vạch ra đường của nó:
> display(p(30),s(30));
Quan sát trên màn hình thì thấy có một vấn đề nhỏ: khi viên bi chạy một mình thì tròn
nhưng khi vạch ra đoạn thẳng thì nó bị khuyết mất một nửa, trông rất khó chịu. Lý do là vì
khi gom hai chuyển động (một được tạo bởi disk, một bởi plot), thì trong plot có khai báo
khoảng hiển thị (x = 0.. 10t ) nên Maple sẽ dành "ưu tiên" cho khoảng này. Phiền một nỗi khi vẽ
từ 0 đến 10t thì cũng mới hiển thị được nửa viên bi bên trái (vì tâm viên bi ở 10t ), còn bên phải
thì.. mất tiêu.
Để giải quyết, chúng ta phải "lừa" Maple bằng cách khai báo một chuyển động plot dài
hơn hàm p(i) ở trên một tý, và khi cho chạy thì ta sẽ "giấu" nó đi:
> q:=i¡display(seq(plot(-1,x=0..t/9),t=0..i),IT,SC):
Hàm q(i) vẽ đường thẳng y = 1, nhưng với độ chia cho 9 thay vì chia cho 10 như s(i) và
p(i) vì thế q(i) sẽ luôn luôn dài hơn p(i) một đoạn ngắn. Và khi i = 30, q(30) = 30
9
= 3.33.
Nhưng khi display, ta giới hạn tầm hiển thị nên mọi việc xảy ra giống như không có hàm q(i).
> display(p(30),s(30),q(30),view=[0..3,0..3]);
Một điều khác cần lưu ý ở đây: hàm s(i) của chúng ta đã được khai báo với display(s(30));
ta sẽ có trên màn Hình 31 hình tĩnh của viên bi.
sin x x
Hình 12.15: Đồ thị của hàm (a), , (b)f (x) và (c)f ( ) nhân lên 30 lần
x 3
Cách khai báo thì cũng tương tự như thí dụ trên. Trước tiên là viên bi. Ở lệnh sau, vận tốc
được giữ nguyên bình thường và giữ hình tĩnh (không có IT):
> s:=i¡display(seq(disk([t,30*f(t)],.4),t=evalf(3*Pi)..i),SC):
> s(evalf(4*Pi));
Hình 12.16: Chuyển động của viên bi (a) trước và (b) sau khi chỉnh vận tốc
Quan sát [Hình 12.16 (a)], t thay đổi từ 3π đến 4π hay t = 9, 10, 11, 12. Ta thấy rõ ràng là
không thể giữ vận tốc này, phải chia nhỏ ra. Một lưu ý: khi dùng seq thì các chỉ số (ở đây là t)
có thể là một phân số. Nhưng khi dùng với π thì phải dùng evalf để lấy giá trị bằng số. Bây
giờ ta giảm vận tốc 3 lần. Nếu chia t cho 3 thì ta phải nhân giá trị tận cùng của t với 3:
> s:=i¡display(seq(disk([t/3,30*f(t/3)],.4,CW),
t=evalf(3*Pi)..3*i),SC):
> s(evalf(4*Pi));
Quan sát [Hình 12.16 (b)] thì ta thấy khoảng cách giữa các viên bi còn quá lớn. Bây giờ ta
chia nhỏ hơn 5 lần và khai báo với IT.
> s:=i¡display(seq(disk([t/5,30*f(t/5)],.4,CW),
t=evalf(3*Pi)..5*i),IT,SC):
Bước sang phần khai báo quỹ đạo ta cũng làm giống (12.3): chia khoảng cách thể hiện ra 5
3π t
lần (x = .. ) và nhân giá trị tận cùng của t với 5:
5 5
> p:=i¡display(seq(plot(30*f(x),x=evalf(3*Pi/5)..t/5),
t=evalf(3*Pi)..5*i),IT,SC):
Và chuyển động của viên bi cùng con đường - từ 3π đến 6π là:
> display(s(evalf(6*Pi)), p(evalf(6*Pi)));
Ở đây viên bi cũng bị mất một nửa, và chúng ta cũng tiếp tục làm như trên:
> q:=i¡display(seq(plot(-2,x=evalf(3*Pi/5)..t/4),
t=evalf(3*Pi)..4*i),IT):
> display(s(evalf(6*Pi)), p(evalf(6*Pi)),q(evalf(7*Pi)),
view=[evalf(3*Pi/5)..18,0..14]);
Cycloid
Trong phần (12.2.1) chúng ta thấy cách tạo hình động của một van gắn trên một vành xe
lăn không trượt trên đường thẳng. Bây giờ, trong phần này, ta sẽ tạo quỹ đạo của nó.
Để vẽ quỹ đạo ta phải đi từ tọa độ vủa van xe. Ở mục (12.2.1) ta đã có tọa độ này là:
rt r sin t
"
r r cos t
Hình 12.17:
Trước tiên ta vẽ hình tĩnh của chuyển động. [Hình 12.17] được tạo bởi 3 hình: g1 và g2 là
viên bi ở thời điển t = 2π và t = 10(2π 10 4π), hình g3 là quỹ đạo được vẽ từ 0 đến 10 (ở
đây chọn r = 4):
> g1:=disk([r*2*Pi-r*sin(2*Pi),r-r*cos(2*Pi),.05],CW):[6 ]
> g2:=disk([r*10-r*sin(10),r-r*cos(10),.05],CW):
> g3:=plot([r*t-r*sin(t),r-r*cos(t),t=0..10],SC):
6
Nhắc lại các chữ viết tắt: SC=scaling=constrained, IT=insequence=true, CW=color=wheat
> display(g1,g2,g3);
Để tạo hình động cho van và vành bánh xe, ta làm giống như mục 12.2.1:
> cr:=t¡circle([t,r],r):
> q:=k¡display(seq(cr(i),i=0..k),IT,SC):
> s:=i¡display(seq(disk([r*t/r-r*sin(t/r),
r-r*cos(t/r),.05],CW),t=0..i),IT):
Riêng quỹ đạo ta khia báo một dãy đồ thị, môic đồ thị được vẽ từ phương trình thông số và
đi từ gốc tọa độ đến một điểm mà ta khai báo là biến. Bởi vì tốc độ viên bi giảm đi r lần ( rt , theo
biểu thức trên), nên ta cũng phải chia các biến là r lần và nhân giá trị sau cùng với r:
> p:=k¡display(seq(plot([r*t-r*sin(t),
r-r*cos(t),t=0..(i+0.1)/r],SC,color=red),i=0..k*r),IT):
Trong lệnh trên ta bắt buộc công i với 0.1 vì Maple không chấp nhận vẽ đồ thị (plot) trên
khoảng không (t = 0..0 khi k = 0)
Và sau cùng để có hình động ta phải xác định quảng đường đi. Trong [Hình 12.17] ta thấy
viên bi có chu kỳ 2π, vậy muốn lăn 3 vòng ta phải cho trị tối đa là 3 2π ≈ 19:
> display(p(19),q(r*19),s(19*r));
Quỹ đạo của van xe trong trường hợp này gọi là đường cycloid.
vt := [t ÞÑ r r cos(t), t ÞÑ sin(t)]
gt := [t ÞÑ r sin(t), t ÞÑ r cos(t)]
%
Tiếp theo, ta dùng hàm arrow để khai báo các mũi tên biểu tượng cho các vector vận tốc
và gia tốc và vẽ bánh xe. Để vẽ quỹ đạo cycloid cách ngắn gọn nhất là dùng đường cong tham
số:
> pvt:=t¡arrow(OM(t),(vt(t)),.05,.1,.1,color=black):
> pgt:=t¡arrow(OM(t),(gt(t)),.05,.1,.1,color=white):
Để vẽ vòng tròn và quỹ đạo của chuyển động, ta làm thư mục 12.5.3:
> cr:=t¡circle([t,1],1):
> qd:=i¡plot([OM(t)[1],OM(t)[2],t=0..i],color=red,SC):
Gom các lệnh trên vào một rồi xác định giá trị r trước khi vẽ hình tĩnh:
> sys:=i¡(pvt(i),pgt(i),cr(i),qd(i),SC):
> r:=1:display(sys(1.2),sys(3),sys(4.3));
Hình 12.18:
Quan sát [Hình 12.18] ta thấy vận tốc luôn luôn tiếp tuyến với đường cycloid và gia tốc
luôn luôn hướng về tâm bánh xe. Mặt khác độ lớn của vận toóc cũng được thể hiện qua các độ
dài của vector này trong khi di chuyển trên quỹ đạo.
Tạo hình động: với độ giảm tốc bằng 5 và chuyển động 2 chu kỳ (2 2π 5):
> display(seq(display(sys(i/5)),i=1..evalf(4*Pi)*5),IT,SC);
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼ cine:=proc(OM,n,s)
local i,p,vt,gt,pvt,pgt,movie,sys,u: u:=NULL:
if nargs=3 then u:IT: fi:
p:=i¡plot([OM(t)[1],OM(t)[2],t=0..i,SC):
vt:=map(D,OM): gt:=map(D,vt):
pvt:=t¡arrow(OM(t),(vt(t)),.05,.1,.1,color=wheat):
pgt:=t¡arrow(OM(t),(gt(t)),.05,.1,.1):
sys:=t¡display(p(t),pvt(t),pgt(t)):
movie:=NULL:
for i from 0 to n do movie:=movie, sys(i/5):od:
display([movie],SC,u):
end:
Thí dụ 1: để tạo hình tĩnh và hình động của hình cardiod [Hình 12.19 (a)]:
> OM:=vector([t¡(1+cos(t/2))*cos(t/2),
t¡(1+cos(t/2))*sin(t/2)]);
OM := [t ÞÑ (1 + cos( 2t )) cos( 2t , t ÞÑ (1 + cos( 2t )) sin( 2t ]
> cine(OM,evalf(20*Pi)); cine(OM,evalf(20*Pi),1); [7 ]
Thí dụ 2: để tạo hình tĩnh của hình "ốc sên" [Hình 12.19 (b)]:
> OM:=vector([t¡t*sin(t/2)/6,t¡t*cos(t/2)/6]);
OM := vector([t ÞÑ t
6 sin( 2t ), t ÞÑ t
6 cos( 2t )])
> cine(OM,77); [8 ]
7
Đây là một đường cong kín nên ta có thể dùng nút "auto-replay" để cho chạy không ngừng.
8
Ở đây bán kính vector r = 1, khi r ¡ 1 vận tố của hai vector vận tố và gia tốc phải được điều chỉnh.
Hình 12.19: Biểu diễn của vận tốc và gia tốc ở hình (a) cardiod và (b) hình ốc sên
-1950 (∼) Dân thành Babylone phát minh bản tính nhân.
-575 Thales biết cách tính chiều cao kim tự tháp với định lý mang
tên mình.
-440 (∼) Hippocrates viết cuốn Elements, được xem như sách hình
học đầu tiên của nhân loại.
-300 (∼) Euclide hệ thống hóa các khái niệm về Hình học trong
Elements.
-290 (∼) Aristote dùng Hình học để tính khoảng cách từ Mặt
Trăng đến Mặt Trời. Ông là người đầu tiên cho
-250 (∼) Archimede khám phá ra nguyên lý Thủy tĩnh, tính xấp
xỉ số π, tính thể tích hình cầu và hình trụ.
-235 (∼) Eratosthene tính được chu vi Trái Đất chỉ bằng phương
pháp Hình học và thuật toán tìm số nguyên tố.
-225 (∼) Apollonius viết Conics trong đó lần đầu tiên xuất hiện
các từ "parabola", "ellipse", "hyperbola".
150 (∼) Ptoleme đưa ra thuyêtd chuyển động địa tâm (Trái Đất
là trung tâm Thái Dương hệ), thuyết này đã là một chân lý trong
suốt hơn ngàn năm.
250 (∼) Liu Hui (Trung Quốc) biết dùng phân số hữu tỷ. Sau đó
ông đã xấp xỉ được số π với 5 số lẻ bằng các đa thức đều.
594 Hệ thập phân được dùng tại Ấn Độ. Đây là cơ số gần gũi với
cách dùng của chúng ta ngày hôm nay.
Hình 12.32: Hệ
Thập Phân
810 (∼) Al-Khwarizmi viết nhiều nghiên cứu về Số học, Đại số,
Địa, và Thiên văn. Ông là người lần đầu tiên đã sử dụng từ al-fabr
được phiên âm thành Algebra (Đại số). Chính tên của ông cũng
là nguồn gốc của từ algorith (thuật toán).
1150 Số Ả-Rập (số mà chúng ta dùng ngày hôm nay) được thu
thập vào Âu Châu bởi Fibonacci. Ông là người Âu Châu đầu tiên
có những nghiên cứu sâu về Số học kể từ thời Diophant. Ngoài ra
Fibonacci cũng công bố dãy số mang tên ông.
1591 Viète viết Art analytique, là người đầu tiên dùng các ký tự
để biểu diễn cho các đại lượng (từ trước tới giờ chỉ dùng số).
1609 Kepler công bố các định luật về quỹ đạo ellipse của các thiên
thể trong vũ trụ.
1635 Cavalieri công bố các nghiên cứu về lý thuyết cực nhỏ in-
finitesimal.
1637 Descartes viết La Géométrie nói về các ứng dụng Đại số vào
Hình học.
1639 Desargues bắt đầu những nghiên cứu về Hình học quy chiếu
projective geometry.
1642 Pascal chế tạo thành công một máy tính. Máy chỉ biết làm
tính cộng.
1675 Leibniz lần đầu tiên sử dụng ký hiệu tích phân và sau đó
khám phá ra vi phân của các hàm cơ bản.
1690 Jacques Bernoulli lần đầu tiên dùng từ tích phân (integral)
và chứng tỏ ý nghĩa hình học của tích phân. Một năm sau ông
phát minh ra tọa độ cực, một cách mới để biểu diễn một điểm
trong không gian. Đến năm 1718 (sau khi ông mất) người ta công
bố nghiên cứu của ông về phép biến phân (calculus of variations).
1690 Rolle công bố các lý thuyết sau đó trở nên Định lý Rolle.
1694 Jean Bernoulli và quy tắc "L'Hôpital". Sau đó ông đặt ra bài
toán brachis-tochrone: đi tìm con đường nhanh nhất trong mặt
phẳng dưới ảnh hưởng trọng trường.
1707 De Moivre dùng lượng giác đêt biểu diễn số phức (ez =
cos z + i sin z).
Hình 12.53: De
Moivre
1724 Jacapo Riccati nghiên cứu về một dạng phương trình vi phân.
1727 Euler lần đầu tiên dùng ký tự e cho cơ số logarith và giải bài
toán về Lý thuyết đồ thị: Những cây cầu Kronigsberg. Sau đó đã
viết Mechanica được xem như cuốn sách đầu tiên dùng phương
trình vi phân để giải các bài toán Cơ. Công trình của ông thật đồ
sộ và liên quan đến nhiều lãnh vực của Toán học và Cơ học.
1737 Simpson dùng chuỗi để tìm một tích phân xác định.
1754 Lagrange thực hiện nhiều phép toán quan trọng về phép tính
biến phân. Công trình của Lagrange cũng nhiều vô kể: nó liên
quan đến Đại số (Giải phương trình có bậc > 4 Số học (Lý thuyết
nhóm), Thiên văn (sự hỗn độn của các qũy đạo sao chổi), Giải tích
(hàm ellipse, nguyên hàm elliptic), Cơ học (với cuốn Mécanique
analytique) trong đó ông biến cơ học thành một ngành của giải
tích).
Hình 12.58: Lagrange
1763 Monge bắt đầu đưa ra các khái niệm về Hình học giải tích.
1784 Legendre công bố một đa thức mang tên ông và các công
trình về Thiên văn.
1807 Fourier biểu diễn một hàm số liên tục bằng một chuỗi các
hàm lượng giác.
1812 Laplace công bố các công trình về xác suất trong Théorie An-
alytique des probabbilités. Ngoài ra ông còn nghiên cứu phương
trình vi phân và Thiên văn học.
1828 Green và định lý về diện tích và thể tích mang tên ông.
1829 Galois công bố các công trình về Đại số trước Hàn Lâm
Viện Khoa Họa Pháp. Ông chẳng may mất sớm trong một cuộc
đọ súng.
1831 Cauchy và chuỗi số nguyên cùng với hàm phức. Năm 1845,
ông công bố Định lý cơ bản về Lý thuyết nhóm.
1837 Dirichlet đưa ra một khái niệm tổng quát về hàm số.
1881 Venn đưa ra giản đồ Venn dùng trong lý thuyết tập hợp.
1921 Borel công bố lần đầu tiên về Lý thuyết trò chơi (game the-
ory).
1922 Richardson lần đầu tiên sử dụng phương pháp sai phân hữu
hạn (finite differences mathod) để dự báo thời tiết.
1936 Turing phát minh Turing machine. Đây là những khái niệm
đầu tiên dành cho khoa học máy tính.
1847 George Dantzig đưa ra phương pháp simplex giải các bài
toán tối ưu tuyến tính.
1948 Shannon trình bày các phát minh về Lý thuyết dữ kiện (in-
formation theory) và những ứng dụng Toán vào việc chuyển tải
dữ kiện.
1961 Edward Lorenz khám phá ra định luật ứng xử của các hệ hỗn
độn (chaotic behaviour). Ông được xem như người đi tiên phong
trong lĩnh vực này.
1965 Tukey and Cooley công bố công trình về Fast Fourier Trans-
form có ứng dụng rộng rãi trong các ngành Điện, Tin học và Cơ
học.
1977 Adleman, Rivest, and Shamir công bố một ứng dụng của số
học: Mã RSA dùng để mã hóa thông tin một các hiệu quả.
1997 Wiles thành công trong việc chứng minh định lý Fermat lớn.
cho chúng ta những phát minh, những khám phá cực kỳ vĩ đại:
Trước tiên phải nói đến Newton và quả táo lịch sử năm 1666. Giả sử hôm ấy Newton
không đọc sách dưới gốc táo (mà dưới gốc liễu hay gốc sầu riêng),thì chẳng biết đến bao
giờ con người mới tìm ra định luật vạn vật hấp dẫn và khoa học có lẽ sẽ không phát triển
như ngày nay [9 ].
Một trong những khám phá vĩ đại khác là điện. Và chúng ta không thể nào quên Benjamin
Franklin và con diều giấy của ông ta. Vào một đêm mưa bão tháng 7/1752, ông đã bị sét
đánh tái tê (nếu không muốn nói là suýt chết) trước khi đi vào lịch sử của khoa học.
Alexander Fleming, vị cứu tinh của hàng triệu con người với phát minh về thuốc kháng
sinh (pénicilline). Ông ăn ở bẩn thỉu, cẩu thả, ăn đâu liệng đấy khiến thức ăn mọc nấm
nhưng cũng từ đó đã tìm ra bài thuốc quí báu này (1927).
Cũng trong lãnh vực y khoa, và cũng thói quen vô trật tự của các nhà bác học Wilhelm
Roengen đã vô tình nhận thấy tấm hình phát quang bàn tay của vợ mình và từ đó tìm ra
tia X (1895).
Một hình thức khác của sự tình cờ: nhà toán học nổi tiếng Poisson của Pháp hồi còn trẻ
được gia đình hướng dẫn theo học Y khoa. Một hôm vì đãng trí Poisson vào nhầm giảng
đường, khi ôn muốn quay ra thì thầy không cho phép, ông đành ngồi lại và nghe giảng.
Thế rồi cuộc đời của cậu bé Poisson đã thay đổi từ buổi học ấy, cậu ta bỏ hẳn ngành y để
say mê toán và sau này đã để lại cho nhân loại nhiều phát minh giá trị. Đó cũng là trường
hợp của anh em nhà Bernoulli, của Leibniz, Fermat...
9
Theo nhiều tài liệu thì đây là hư cấu...80%. Lúc ấy Newton đang ở trong nhà và nhìn thấy táo rơi ngoài vườn
[10] VINCENT BOURGES - Physique avec Maple - Edition Ellipses, Paris 1998
[11] JANE MARC FERRAND - Maths et Maple - Edition Dunod, Paris 1998
[14] JULLIEN BOK, PIERRE MOREL - Cours de Physique - Mécanique des Ondes
Collection Methodes - Hermann, Paris
Tài liệu tham khảo
[16] JEAN MARC MONIER - Giáo trình toán - Nhà Xuất Bản Giáo Dục
[27] Nguyễn Đình Trí - Toán học cao cấp, T.3 - Nhà Xuất Bản Giáo Dục
[29] Phạm Huy Điển - Tính toán, lập trình và giảng dạy Toán trên Maple
Nhà Xuất Bản Khoa Học & Kỹ Thuật
280
Chỉ mục