Download Maple Va Cac Bai Toan Ung Dung...
Phạm Minh Hoàng
Maple và các bài toán ứng dụng
Nhà xuất bản Khoa Học và Kỹ Thuật
Lời nói đầu 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 2
ii
Tiếng Anh là formal computation tiếng Pháp là calcul formel. và đã tìm thấy chỉ một chỗ sai trong 2000 trang của Delaunay! Phạm Minh Hoàng
dùng Maple xác định được đường cao, đường trung tuyến, sau đó xác định được trực tâm, trọng tâm rồi viết phương trình đường thẳng Euler. Tất cả các công đoạn ấy làm bằng máy tính đâu có làm ''nhụt'' tư duy toán học của các em đâu, trái lại nó làm cho các em có cơ hội sử dụng một vũ khí sắc bén của trí tuệ là trí tưởng tượng3 . Rồi ở bậc đại học, chúng ta đã dạy cho sinh viên điều kiện để chéo hóa một ma trận M và áp dụng nó để tính M n . Nếu làm bằng tay sẽ rất ''oải'', dễ chán, thậm chí mới chỉ là ma trận bậc 3; nhưng với Maple, sinh viên có thể ''vui chơi'' và tự tạo cho mình những trường hợp cực kỳ phức tạp và như thế các bạn sẽ hiểu rõ vấn đề. Các thí dụ như thế còn rất nhiều và trong mọi lãnh vực như lý, hóa, sinh, kỹ thuật, kiến trúc... Rõ ràng là nó giúp chúng ta học hiệu quả hơn. Tôi thực sự chưa bao giờ nghĩ rằng Maple có thể thay thế người thầy vì để đánh một lệnh Maple để tính diện tích hình tròn thì ai cũng có thể làm được, thậm chí là một học sinh cấp II! nhưng nếu hiểu được ý nghĩa hình học của nguyên hàm (và các vấn đề sau sa hơn) thì không thể thiếu thầy được. Maple chỉ cung cấp cho chúng ta một công cụ để hiểu rõ vấn đề và khơi nguồn sáng tạo mà thôi. Nhưng đó lại là yếu tố rất cần trong cuộc đời sinh viên kể cả khi đã ra trường. Với tất cả những tâm tình đó, tôi đã viết cuốn Maple và các bài toán ứng dụng này. Sau lần xuất bản thứ nhất tác giả bỏ đi những chủ đề phức tạp đồng thời thêm một số chương ích lợi hơn cho việc học Maple, trong đó có một chương nói về cú pháp dành cho các độc giả chưa có kinh nghiệm với phần mềm này. Tác giả cũng chân thành xin lỗi bạn đọc về những sơ sót đã mắc phải trong lần phát hành đầu tiên. Mọi ý kiến đóng góp xin chuyển về địa chỉ: Nhà xuất bản Khoa Học và Kỹ Thuật, 28 Đồng Khởi, phường Bến Nghé, quận I, TPHCM. ĐT: 822.50.62-829.66.28 Ước mong của tác giả là cuốn sách nhỏ bé này sẽ giúp bạn đọc có một cái nhìn mới về vũ trụ vô tận của Toán học. Sài Gòn Xuân Mậu Tí 2008 Phạm Minh Hoàng email:
[email protected]
Vài dòng về tác giả: Sinh năm 1955 tại Sài Gòn, đậu tú tài và đi du học Pháp năm 1973, tốt nghiệp Cao học Cơ Học Ứng Dụng tại Đại học Pierre & Marie Curie(Paris VI) và đã đi làm nhiều năm về tịn học quản lý và tin học kỹ nghệ tại Paris. Năm 2000 trở về Việt Nam và hiện công tác tại Bộ Môn Toán Ứng Dụng, Khoa Khoa Học Ứng Dụng, Trường Đại học Bách Khoa TPHCM.
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) Phạm Minh Hoàng
iii
Mục lục Trang Lời nói đầu Chương 1. Cú pháp Maple 1.1 Tổng quan . . . . . . . . . . . . . 1.2 Các thao tác trên một biểu thức . . 1.2.1 Lệnh simplify: đơn giản . 1.2.2 Lệnh expand: khai triển . 1.2.3 Lệnh factor: thừa số . . . 1.2.4 Lệnh combine: gom . . . 1.2.5 Lệnh convert: biến đổi . . 1.3 Mệnh đề và hàm mũi tên . . . . . 1.4 Các thao tác trên một dãy . . . . . 1.5 Giải tích . . . . . . . . . . . . . . 1.6 Đồ thị hai chiều . . . . . . . . . . 1.7 Giải phương trình . . . . . . . . . 1.7.1 Phương trình đại số . . . . 1.7.2 Phương trình quy nạp . . . 1.8 Phương trình vi phân . . . . . . . 1.8.1 Cách giải giải tích . . . . 1.8.2 Cách giải số . . . . . . . . 1.9 Đại số tuyến tính . . . . . . . . . 1.10 Lập trình trong Maple . . . . . . . 1.10.1 Khai thác sau khi biên dịch 1.11 Nguyên hàm . . . . . . . . . . . . 1.12 Bài tập . . . . . . . . . . . . . . . 1.12.1 Các lệnh cơ bản . . . . . . 1.12.2 Đại số . . . . . . . . . . . 1.12.3 Phương trình vi phân . . . 1.12.4 Nguyên hàm . . . . . . . 1.12.5 Lập trình . . . . . . . . . 1.13 Bài đọc thêm: Thalès . . . . . . .
i
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . iv
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 1 3 3 5 5 6 7 8 8 10 11 13 13 14 14 14 16 18 20 21 23 26 26 26 27 27 27 32
Mục lục
Chương 2. Bài toán cực trị 2.1 Tiết kiệm nhôm . . . . . . . . . . . . 2.2 Đoạn đường gần nhất . . . . . . . . . 2.3 Góc nhìn của phi hành gia . . . . . . 2.4 Hình nón và hình cầu . . . . . . . . . 2.4.1 Tính bằng thể tích . . . . . . 2.4.2 Tính bằng diện tích . . . . . . 2.5 Khúc cua gắt . . . . . . . . . . . . . 2.5.1 Vấn đề 1 . . . . . . . . . . . 2.5.2 Vấn đề 2 . . . . . . . . . . . 2.6 Ellipsoid . . . . . . . . . . . . . . . . 2.6.1 Hình vẽ cho bài toán Ellipsoid 2.7 Cực trị của hàm hai biến: Thí dụ 2 . . 2.8 Cực trị của hàm ba biến . . . . . . . . 2.9 Bài đọc thêm: Pythagore . . . . . . .
. . . . . . . . . . . . . .
33 33 34 36 37 37 40 42 43 44 47 48 48 50 53
. . . . .
54 54 57 60 63 67
. . . . . . . . . . . .
69 69 71 73 74 77 77 81 81 81 84 85 88
Chương 5. Bài toán mô phỏng 5.1 Cạnh tranh tay đôi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 Giải bằng hàm tổ hợp . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.2 Gải bằng ma trận . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89 89 90 90
Chương 3. Đồ thị ba chiều 3.1 Thí dụ 1 . . . . . . . . 3.2 Thí dụ 2 . . . . . . . . 3.3 Thí dụ 3 . . . . . . . . 3.4 Thí dụ 4 . . . . . . . . 3.5 Bài đọc thêm: Euclide
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . . . .
. . . . .
Chương 4. Hình học giải tích 4.1 Tìm và vẽ tiếp tuyến chung của hai vòng tròn 4.2 Diện tích phần giao của hai vòng tròn . . . . 4.3 Quỹ tích 1 . . . . . . . . . . . . . . . . . . . 4.4 Quỹ tích 2 . . . . . . . . . . . . . . . . . . . 4.5 Quỹ tích 3 . . . . . . . . . . . . . . . . . . . 4.5.1 Cách giải thứ nhất . . . . . . . . . . 4.5.2 Cách giải thứ hai . . . . . . . . . . . 4.6 Giới hạn của Maple . . . . . . . . . . . . . . 4.6.1 Một thí dụ thuần hình thức . . . . . . 4.6.2 Một khúc mắc... . . . . . . . . . . . 4.6.3 Một thí dụ điển hình . . . . . . . . . 4.7 Bài đọc thêm: Archimède . . . . . . . . . . .
Phạm Minh Hoàng
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . .
v
Mục lục
5.2 5.3
5.4 5.5 5.6 5.7
5.8
5.1.3 Giải bằng hàm quy nạp rsolve 5.1.4 Biểu diễn trong không gian 3-D Kinh tế ASEAN . . . . . . . . . . . . . Lãi suất ngân hàng . . . . . . . . . . . 5.3.1 Lập trình . . . . . . . . . . . . 5.3.2 Hàm số hợp . . . . . . . . . . . 5.3.3 Dãy truy hồi (quy nạp) . . . . . 5.3.4 Phương trình vi phân . . . . . . Nuôi tằm . . . . . . . . . . . . . . . . Bồn khuấy nước đều . . . . . . . . . . Bài toán cân bằng môi sinh . . . . . . . S.A.R.S . . . . . . . . . . . . . . . . . 5.7.1 Giải với các đại lượng rời rạc . 5.7.2 Giải với các đại lượng liên tục . Bài đọc thêm: Eratosthene . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
Chương 6. Bài toán kích thước hình xoay 6.1 Diện tích, thể tích ellipse và ellipsoid . . . . . . . . . . . . . . 6.1.1 Diện tích một ellipse . . . . . . . . . . . . . . . . . . 6.1.2 Thể tích một ellipsoid . . . . . . . . . . . . . . . . . 6.1.3 Diện tích một ellipsoid . . . . . . . . . . . . . . . . . 6.2 Thể tích sinh ra bởi phép quay quanh trục Ox của một hàm . . 6.3 Thể tích sinh ra bởi phép quay quanh trục Oy của một hàm . . 6.4 Trường hợp một hàm nội suy . . . . . . . . . . . . . . . . . . 6.5 Tìm thể tích sinh ra bởi phép quay của phần giao của hai hàm . 6.5.1 Xoay quanh Ox . . . . . . . . . . . . . . . . . . . . . 6.5.2 Xoay quanh Oy . . . . . . . . . . . . . . . . . . . . . 6.6 Một trường hợp phức tạp . . . . . . . . . . . . . . . . . . . . 6.6.1 Xoay quanh Ox . . . . . . . . . . . . . . . . . . . . . 6.6.2 Xoay quanh Oy . . . . . . . . . . . . . . . . . . . . . 6.7 Bài đọc thêm: Galilée . . . . . . . . . . . . . . . . . . . . . . Chương 7. Bài toán sức bền vật liệu 7.1 Tải trọng đều . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.1 Hai đầu gối đơn . . . . . . . . . . . . . . . . . . . . . 7.1.2 Ngàm một đầu, đầu kia tự do . . . . . . . . . . . . . . 7.1.3 Ngàm hai đầu . . . . . . . . . . . . . . . . . . . . . . 7.1.4 Ngàm một đầu, đầu kia gối đơn (hệ siêu tĩnh) . . . . . 7.1.5 Ngàm một đầu, đầu kia gối đơn ở một điểm bất kỳ u . 7.2 Tải trọng tập trung . . . . . . . . . . . . . . . . . . . . . . . 7.2.1 Ngàm một đầu, lực tập trung ở đầu kia. [Hình 7.14 (a)] vi
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . .
91 91 92 93 93 94 94 95 97 102 103 105 105 108 112
. . . . . . . . . . . . . .
115 115 115 116 117 118 118 119 120 120 121 122 122 122 125
. . . . . . . .
127 127 128 129 129 131 131 137 137
Phạm Minh Hoàng
Mục lục
7.3
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 Bài đọc thêm: Képler - Thái Dương hệ . . . . . . . . . . . . . . . . . . . . . . 142
Chương 8. Bài toán đạn đạo 8.1 Môi trường không có ma sát không khí . . . . . 8.2 Môi trường có ma sát không khí . . . . . . . . 8.2.1 Thí dụ 1: nghiệm giải tích . . . . . . . 8.2.2 Thí dụ 2 : nghiệm bằng phương pháp số 8.2.3 Tìm góc bắn xa nhất . . . . . . . . . . 8.2.4 Nối dài tầm bắn . . . . . . . . . . . . . 8.2.5 Sức cản trong trường hợp phức tạp . . . 8.2.6 Dưỡng Do Cơ thế kỷ XXI! . . . . . . . 8.3 Bài đọc thêm: Shwerer Gustav . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
Chương 9. Bài toán dao động 1: Lò xo 9.1 Lò xo nằm ngang . . . . . . . . . . . . . . . . . . . . 9.1.1 Trường hợp 1 : Không có lực giảm xóc, λ = 0 9.1.2 Trường hợp 2 : Lực giảm xóc, λ ¡ 0 . . . . . 9.1.3 Khảo sát hiện tượng cộng hưởng . . . . . . . . 9.2 Hệ ba lò xo nằm ngang . . . . . . . . . . . . . . . . . 9.3 Bài đọc thêm: Cầu Tacoma . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . .
Chương 10.Bài toán dao động 2: Con lắc toán học 10.1 Con lắc đơn . . . . . . . . . . . . . . . . . . . . . . . . 10.1.1 Trường hợp 1: góc quay nhỏ . . . . . . . . . . . 10.1.2 Trường hợp 2: góc quay lớn không ma sát . . . . 10.1.3 Trương hợp 3: góc quay lớn với ma sát . . . . . 10.2 Con lắc kép . . . . . . . . . . . . . . . . . . . . . . . . 10.2.1 Trường hợp 1: góc quay nhỏ, tính toán hình thức 10.2.2 Trường hợp 2: góc quay lớn - Tính toán số . . . 10.2.3 Kiểm chứng . . . . . . . . . . . . . . . . . . . . 10.3 Con lắc đơn đàn hồi . . . . . . . . . . . . . . . . . . . . 10.3.1 Vẽ hình . . . . . . . . . . . . . . . . . . . . . . 10.3.2 Tính toán . . . . . . . . . . . . . . . . . . . . . 10.4 Bài đọc thêm: Lịch sử số π . . . . . . . . . . . . . . . . Chương 11.Số học và ứng dụng 11.1 Tóm tắt lý thuyết . . . . . . . . . . . . . 11.1.1 Số học mô-đun . . . . . . . . . . 11.1.2 Phép chia Eculide trong Z /mZ . 11.1.3 Ứng dụng của phép tính đồng dư . Phạm Minh Hoàng
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
. . . . . .
. . . . . . . . . . . .
. . . .
. . . . . . . . .
145 145 148 149 149 151 154 156 157 165
. . . . . .
168 168 170 171 174 177 180
. . . . . . . . . . . .
183 183 184 185 188 189 191 193 195 198 198 199 204
. . . .
209 209 209 210 212 vii
Mục lục
11.1.4 Định lý Trung Quốc . . . . . . . . . . . . 11.2 Mật mã . . . . . . . . . . . . . . . . . . . . . . . 11.2.1 Mã César . . . . . . . . . . . . . . . . . . 11.2.2 Mã Khối . . . . . . . . . . . . . . . . . . 11.2.3 Mã RSA . . . . . . . . . . . . . . . . . . . 11.3 Bài đọc thêm Bẻ khóa RSA: Con đường chông gai Chương 12.Xử lý hình động 12.1 Chuyển động đơn giản . . . . . . . . . . 12.1.1 Thí dụ . . . . . . . . . . . . . . . 12.1.2 Thí dụ 2 . . . . . . . . . . . . . . 12.1.3 Thí dụ 3 . . . . . . . . . . . . . . 12.2 Chuyển động phức tạp . . . . . . . . . . 12.2.1 Thí dụ 1 . . . . . . . . . . . . . . 12.2.2 Thí dụ 2 . . . . . . . . . . . . . . 12.3 Chuyển động có sự thay đổi vận tốc . . . 12.3.1 Thay đổi đều . . . . . . . . . . . 12.3.2 Thay đổi không đều - Thí dụ 1 . . 12.3.3 Thay đổi không đều - Thí dụ 2 . . 12.4 Chuyển động với một hay nhiều hình tĩnh 12.4.1 Thí dụ 1 . . . . . . . . . . . . . . 12.4.2 Thí dụ 2 . . . . . . . . . . . . . . 12.5 Đường lập lên bởi hình động . . . . . . . 12.5.1 Viên bi lăn theo đường thẳng . . . 12.5.2 Viên bi lăn theo một đường bất kỳ 12.5.3 Cycloid . . . . . . . . . . . . . . 12.5.4 Điểm động học . . . . . . . . . . 12.6 Bài đọc thêm . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . .
213 216 217 219 222 229
. . . . . . . . . . . . . . . . . . . .
231 231 231 232 233 234 234 238 240 240 241 242 245 245 246 248 248 250 252 253 256
Tài liệu tham khảo
278
Chỉ mục
280
viii
Phạm Minh Hoàng
Danh mục hình minh họa Hình
Trang
1.1 1.2 1.3 1.4
(a) Ba lời giải và (b) khi vẽ chung với tập hợp các lời giải Lời giải phương trình vi phân phương pháp giải tích . . . Lời giải phương trình vi phân và phương pháp số . . . . Sơ đồ tạo và sử dụng tập tin thực thi . . . . . . . . . . .
. . . .
. . . .
. . . .
15 16 18 22
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (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. . . (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. . Đồ 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 Hình nón nội tiếp và ngoại tiếp hình tròn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hình hộp nội tiếp trong một ellipsoid . . . . . . . . . . . . . . . . . . . . . Hình khối cực đại trong một ellipsoid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
34 35 36 38 39 41 43 44 45 47 49 49 50
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Đường đồng mức của hàm f (x, y) . . . . . . . . . . . . . . . . . . . Cực trị hàm nhiều biến và hình chiếu của nó . . . . . . . . . . . . . . Các điểm dừng của f (x, y) . . . . . . . . . . . . . . . . . . . . . . . Điểm cực đại và cực tiểu của f (x, y) . . . . . . . . . . . . . . . . . . Điểm yên ngựa của hàm f (x, y) . . . . . . . . . . . . . . . . . . . . Đồ thị gradient, đường đồng mức và chuyển động của Pk . . . . . . . Chuyển động Pk trong không gian . . . . . . . . . . . . . . . . . . . Biểu diễn tham số của hàm ràng buộc g(x, y) trên f (x, y) . . . . . . . (a) Đường đồng mức và ellips 2D, (b) Véc-tơ gradient tại điểm cực trị
. . . . . . . . . .
. . . . . . . . . .
55 56 58 59 60 61 62 63 65 67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70 71
4.1 4.2
ix
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . . . . . . . .
Danh mục hình minh họa
4.3 . . . . . . . . . . . . . . . . . . . . . . . . 4.4 . . . . . . . . . . . . . . . . . . . . . . . . 4.5 . . . . . . . . . . . . . . . . . . . . . . . . 4.6 . . . . . . . . . . . . . . . . . . . . . . . . 4.7 (a), (b) Vị trí tương đối của H; (c) Quỹ tích H 4.8 Quỹ tích của H với các vị trí M . . . . . . . . 4.9 Vòng tròn trực giao . . . . . . . . . . . . . . 4.10 . . . . . . . . . . . . . . . . . . . . . . . . 4.11 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
74 75 77 78 79 80 83 84 87
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Thương vụ với đồ thị 3-D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sai biệt giữa phép giải rời rạc và liên tục . . . . . . . . . . . . . . . . . . (a), (b) Phát triển ổn định sau 30 tháng và (c) phát triển không ổn định . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 và (b) trường hợp ⃝ 2 Đường biểu diễn của lượng muốn (a) trường hợp ⃝ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lây lan của bệnh dịch khi không có và khi có thuốc chữa . . . . . . . . . 1 1 5.11 Lây lan của bệnh dịch với b = và b = . . . . . . . . . . . . . . . . 10 2 5.12 Lây lan của bệnh dịch trường hợp c) và d) . . . . . . . . . . . . . . . . . 5.13 Thuật toán "Sàng Eratosthene" và cách đo chu vi trái đất. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
91 92 95 96 98 101 102 104 105 107
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8
7.1 7.2 7.3 7.4 7.5 7.6 7.7 x
. . . 109 . . . 110 . . . 114
ellipse và ellipsoid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Đồ thị y = f (x) = x3 và hình xoay quanh Ox . . . . . . . . . . . . . . . . . 2 1 Đồ thị x = f (y) và hình xoay quanh Oy . . . . . . . . . . . . . . . . . . . . Đồ thị một hàm nội suy và hình xoay quanh Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Phần giao của hai hàm và hình xoay quanh Ox, Oy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
116
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chuyển vị, góc quay và moment trường hợp hai gối đơn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chuyển vị, góc quay và moment trường hợp ngàm một đầu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chuyển vị, góc quay và moment trường hợp ngàm hai đầu
127 128 130 131 132 133 134
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
119 120 121 122 123 124 125
Phạm Minh Hoàng
Danh mục hình minh họa
7.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.9 Chuyển vị, góc quay và moment trường hợp ngàm một đầu, đầu kia gối đơn . . 7.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.14 Các trường hợp tải trọng tập trung với ngàm . . . . . . . . . . . . . . . . . . . 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) . . . . . . . . . . . . 7.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.17 Lực tập trung, hai nối đơn qua hai cách giải . . . . . . . . . . . . . . . . . . . 7.18 Thái Dương Hệ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
135 136 137
8.1 8.2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quỹ đạo trong trường hợp không ma sát với: (a) v0 = 300 và (b) v0 = 900m/s 1 Đạn đạo với hệ số ma sát bằng : (a) k = 1 (tối đa) và (b) k = . . . . . . . . 10 [ ] π 7π Đạn đạo 5 góc bắn α P , với ma sát . . . . . . . . . . . . . . . . . . . 10 30 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nối dài tầm bắn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . π (a), (b): Các hàm sức cản p(h) và (c) tầm bắn tương ứng với α = . . . . . . 4 π Đạn đọa của 6 góc bắn với độ gia tăng . . . . . . . . . . . . . . . . . . . . 50 Các hàm nội suy ftd(d), fdt(d) và fad(t) . . . . . . . . . . . . . . . . . . . . . . Các hàm nội suy ftd(t), fad(a) và fda(x) . . . . . . . . . . . . . . . . . . . . . π Đạn đạo của 6 góc bắn với độ gia tăng . . . . . . . . . . . . . . . . . . . . 60 Các hàm nội suy spline của fdt(t), fad(a), fda(x) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hình 8.14: Đại bác Schwerer Gustav (hình mẫu trưng bày) . . . . . . . . . . .
145 147
Lò xo và khối m trên trục hoành . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Chuyển động với giảm xóc λ = df rac120 và . . . . . . . . . . . . . . . . . 11 Chuyển động với độ giảm xóc lớn ∆ ¡ 0 và (b) giảm xóc tớn hạn (∆ = 0) . . Chuyển động với ảnh hưởng ngoại lực . . . . . . . . . . . . . . . . . . . . . . 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 Hệ ba lò xo trước và sau khi chuyển động . . . . . . . . . . . . . . . . . . . . Chuyển động của hệ thống . . . . . . . . . . . . . . . . . . . . . . . . . . . .
169 170
8.3 8.4 8.5 8.6 8.7 8.8 8.9 8.10 8.11 8.12 8.13 8.14 8.15 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8
Phạm Minh Hoàng
137 138 138 139 139 140 141 143
151 153 154 155 157 158 160 161 162 163 164 165 166
172 173 174 176 177 179 xi
Danh mục hình minh họa
9.9 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8
Cầu Tacoma lúc sụp đổ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Con lắc đơn với góc quay nhỏ . . . . . . . . . . . . . . . Con lắc đơn với góc quay lớn . . . . . . . . . . . . . . . . Con lắc đơn với góc quay lớn và lực ma sát . . . . . . . . Con lắc kép . . . . . . . . . . . . . . . . . . . . . . . . . Chuyển động cùng chiều với góc quay nhỏ . . . . . . . . . Chuyển động ngược chiều với góc quay nhỏ . . . . . . . . Chuyển động với u1 (0) = u2 (0) = 1 radian . . . . . . . . π 10.9 Chuyển động với u1 (0) = , u2 (0) = 1radian . . . . . . 2 10.10Đồ thị của động năng, thế năng và cơ năng của con lắc kép 10.11Con lắc đơn đàn hồi . . . . . . . . . . . . . . . . . . . . . 10.12Khai báo con lắc đàn hồi và vài chuyển động . . . . . . . 10.13(a) Quỹ đạo con lắc và (b) đồ thị năng lượng . . . . . . . . 10.14Con lắc kép đàn hồi . . . . . . . . . . . . . . . . . . . . . 10.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.17Tukey . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
183 185 187 189 190 194 195 196
. . . . . . . . . . . 197 . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
197 198 200 201 203 204 205 206
12.1 Hình tĩnh của hàm sin(x) và 4 chuyển động khác nhau . . . . . . . . . . 12.2 (a) Chong chóng ở vị trí đầu, (b) sau khi quay 30o và (c) 4 chuyển động 5o 12.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4 (a) Chuyển động tịnh tiến của bánh xe và (b) chuyển động quay của van . 12.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6 Chuyển động của van xe trong 3 vòng quay . . . . . . . . . . . . . . . . 12.7 4 chuyển động với khoảng cách thời gian (a) đều và (b) không đều . . . . 12.8 (a) Cả hai xe ngừng cùng lúc và (b) lần lượt ngừng . . . . . . . . . . . . 12.9 (a) Chuyển động với thay đổi đều và (b) thay đổi không đều . . . . . . . 12.10Chuyển động theo định luật Képler . . . . . . . . . . . . . . . . . . . . . 12.11Chuyển động của mặt trăng quanh trái đất theo định luật Képler . . . . . x 2 12.12Tiếp tuyến của hàm f (x) = ex sin( ) . . . . . . . . . . . . . . . . . . 2 °k 1 12.13Sự hội tụ của n=1 [ cos(x)n cos(nx)] . . . . . . . . . . . . . . . . . . n 12.14Chuyển động thẳng của viên bi . . . . . . . . . . . . . . . . . . . . . . . x sin x , (b)f (x) và (c)f ( ) nhân lên 30 lần . . . . . . 12.15Đồ thị của hàm (a), x 3 12.16Chuyển động của viên bi (a) trước và (b) sau khi chỉnh vận tốc . . . . . . 12.17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
232 233 234 235 236 237 238 240 241 243 244
xii
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . 246 . . . 247 . . . 249 . . . 250 . . . .
. . . .
. . . .
251 252 254 256
Phạm Minh Hoàng
Danh mục hình minh họa
12.20Babylone . . . . . . . . . . 12.21Pythagore . . . . . . . . . . 12.22Thales . . . . . . . . . . . . 12.23Hippocrates . . . . . . . . . 12.24Euclide . . . . . . . . . . . 12.25Aristote . . . . . . . . . . . 12.26Archimede . . . . . . . . . . 12.27Eratosthene . . . . . . . . . 12.28Apollonius . . . . . . . . . . 12.29Ptoleme . . . . . . . . . . . 12.30Liu Hui . . . . . . . . . . . 12.31Diophante . . . . . . . . . . 12.32Hệ Thập Phân . . . . . . . . 12.33Abu-bin-Musa-al-Khwarizmi 12.34Fibonacci . . . . . . . . . . 12.35Qin Jinshao . . . . . . . . . 12.36Nicolas . . . . . . . . . . . 12.37Copernic . . . . . . . . . . . 12.38Viète . . . . . . . . . . . . . 12.39Kepler . . . . . . . . . . . . 12.40Neper . . . . . . . . . . . . 12.41Cavalieri . . . . . . . . . . . 12.42Descartes . . . . . . . . . . 12.43Desargues . . . . . . . . . . 12.44Pascal . . . . . . . . . . . . 12.45Fermat . . . . . . . . . . . . 12.46Huygens . . . . . . . . . . . 12.47Leibniz . . . . . . . . . . . 12.48Seki Kowa . . . . . . . . . . 12.49Isaac Newton . . . . . . . . 12.50Jacques Bernoulli . . . . . . 12.51Rolle . . . . . . . . . . . . . 12.52Jean Bernoulli . . . . . . . . 12.53De Moivre . . . . . . . . . . 12.54Jacapo Riccati . . . . . . . . 12.55Euler . . . . . . . . . . . . . 12.56Simpson . . . . . . . . . . . 12.57D'Alembert . . . . . . . . . 12.58Lagrange . . . . . . . . . . 12.59Monge . . . . . . . . . . . . Phạm Minh Hoàng
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
256 257 257 257 257 258 258 258 258 259 259 259 259 260 260 260 261 261 261 261 262 262 262 262 263 263 263 263 264 264 264 265 265 265 265 266 266 266 266 267 xiii
Danh mục hình minh họa
12.60Legendre . . . . . . . . . . 12.61Gauss . . . . . . . . . . . . 12.62Fourier . . . . . . . . . . . . 12.63Poisson . . . . . . . . . . . 12.64Laplace . . . . . . . . . . . 12.65Bolzano . . . . . . . . . . . 12.66Navier . . . . . . . . . . . . 12.67Green . . . . . . . . . . . . 12.68Galois . . . . . . . . . . . . 12.69Lobachevsky . . . . . . . . 12.70Cauchy . . . . . . . . . . . 12.71Dirichlet . . . . . . . . . . . 12.72Jacobi . . . . . . . . . . . . 12.73Cayley . . . . . . . . . . . . 12.74Boole . . . . . . . . . . . . 12.75Chebyshev . . . . . . . . . . 12.76Sylvester . . . . . . . . . . 12.77Venn . . . . . . . . . . . . . 12.78Poincaré . . . . . . . . . . . 12.79Frobenius . . . . . . . . . . 12.80Lyapunov . . . . . . . . . . 12.81RungeKutta . . . . . . . . . 12.82Carmichael . . . . . . . . . 12.83Borel . . . . . . . . . . . . 12.84Richardson . . . . . . . . . 12.85Turing . . . . . . . . . . . . 12.86George Dantzig . . . . . . . 12.87Shannon . . . . . . . . . . . 12.88Schwartz . . . . . . . . . . 12.89Hall . . . . . . . . . . . . . 12.90Edward Lorenz . . . . . . . 12.91Tukey . . . . . . . . . . . . 12.92Mandelbrot . . . . . . . . . 12.93Adleman, Rivest, and Shamir 12.94Wiles . . . . . . . . . . . .
xiv
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
267 267 267 268 268 268 268 269 269 269 269 270 270 270 270 271 271 271 271 272 272 272 272 273 273 273 273 274 274 274 274 275 275 275 275
Phạm Minh Hoàng
Danh mục bảng biểu Bảng biểu
Trang
1.1 1.2 1.3
Sắp xếp một dãy số thực . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sử dụng worksheet với tập tin thực thi là pgm1.m . . . . . . . . . . . . . . . . Sử dụng worksheet với tập tin thực thi là pgm2.m . . . . . . . . . . . . . . . .
21 22 23
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 5.2 5.3 5.4 5.5 5.6
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
100 106 107 110 111 113
7.1
Thái Dương hệ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
8.1
Chương trình của 5 góc bắn với độ gia tăng
9.1
Các lệnh tạo hình động cho hệ ba lò xo có một đầu tự do . . . . . . . . . . . . 180
π . . . . . . . . . . . . . . . . . 152 30
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 11.1 11.2 11.3 11.4 11.5 11.6
Bảng hoán chuyển mẫu tự ÐÑ số . . . . . . . . . . . . . . . . . . . . . . Chương trình mã César . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kết quả mã khối. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chương trình mã khối . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chương trình mã RSA và phép bình phương liên tiếp . . . . . . . . . . . . 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.
. . . . . .
. . . . . .
217 218 220 221 224 228
12.1 Chương trình cine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 12.2 Lịch sử các ký hiệu Toán học . . . . . . . . . . . . . . . . . . . . . . . 277
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.
1.1 Tổng quan Khi khởi động maple chúng ta sẽ có một màn hình đơn giản: Ở trên cùng chúng ta có một menu với những chức năng quen thuộc của một phần mềm Windows: File,Edit,View,Insert... Cách sử dụng những chức năng này cũng khá dễ dàng. Phần lớn nhất của màn hình là một trang trắng, đó là nơi người sử dụng đánh các lệnh Maple và nhận kết quả. Một lệnh Maple được đánh sau dấu ">" và mặc định có nét chữ courier màu đỏ, một kết quả có màu xanh và nét chữ times. Thí dụ: > p:=x+3; p := x + 3
Trước khi vào từng câu lệnh Maple, một vài quy tắc chung cần nhớ: 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)
Hãy quan sát lệnh sau: > Int(3*sin(x),x):=value(%); »
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 %. 2
Phạm Minh Hoàng
1.2. Các thao tác trên một biểu thức »
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.2 Các thao tác trên một biểu thức Lệnh simplify: đơn giản Đơn giản một biểu thức (expression) đại số. Đây có thể là một đa thức, một biểu thức lượng giác, logarithm, hàm mũ, hàm hữu tỷ... > p:=1/(a*(a-b)*(a-c))+1/(b*(b-a)*(b-c))+1/(c*(c-a)*(c-b)): > %=simplify(%); 2
right hand side Hàm rhs được dùng với 2 dấu %, vì sau khi thực hiện lệnh lhs(%);,biến % đã trở thành.phải thêm một dấu % thứ hai để có được đúng giá trị bên phải dấu bằng. 3
Phạm Minh Hoàng
3
Chương 1. Cú pháp Maple 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(%) 3 ? (x2 2) = (x 2)2csgn(x 2) 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(%); 3 ? (x2 2) = (x 2)2 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 5
4
Trong Maple, phần thực của x ký hiệu là Re(x), phần phức là Im(x) Dấu nháy đơn để tránh Maple tự động đơn giản khi x>0 Phạm Minh Hoàng
1.2. Các thao tác trên một biểu thức
ln(x3 ) 2 ln(x) = ln(x)
Ta có thể đơn giản hơn bằng cách: > Sp(p,assume=positive;
Tuy nhiên, Maple có option symbolic cho phép đơn giản mà không cần assume nhưng vẫn bảo toàn các quy tắc toán học thông thường: > x:='x': (x-2)ˆ3/sqrt(xˆ2-4*x+4):%=Sp(%,Symbolic); 3 ? (x2 2) = (x 2)2 x 4x + 4 > ln(xˆ3)-2*ln(x):%=Sp(%,Symbolic); ln(x3 ) 2 ln(x) = ln(x)
Lệnh expand: khai triển Hàm expand có mục đích: 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 normal, 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)
Lệnh factor: thừa số Lệnh này được xem như ngược lại với lệnh expand > p:=xˆ4-3*xˆ2+2: p=factor(p);
x4 32 + 2 = (x 1)(x + 1)(x2 2)
> factor(rhs(%))=expand(lhs(%)); Phạm Minh Hoàng
5
Chương 1. Cú pháp Maple 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 , với lệnh sau: > factor(xˆ3+9,3ˆ(1/6),I); ? ? 1 (2x 32/3 3I 6 3)(2x 32/3 + 3I 6 3)(x + 32/3 ) 4
? 6
3). Chúng ta thử
?
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 trong quá trình thừa số hoá, ?6 Maple cũng tìm ra được?632/3. Một chi tiết quan trọng cần lưu ý là 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
Lệnh combine: gom "Gom" những hàm toán giống nhau (exp,ln, hàm lượng giác...) và biến đổi tích các hàm lượng giác thành tổng (ngược lại với expand). > exp(x)*exp(y):%=combine(%); ex ey = ex+y
> sqrt(x)*sqrt(y):%=combine(%,sqrt,symbolic);
?x?y = ?xy
> (xˆa)ˆb:%=combine(%, power, symbolic); xa )b = xab
6
Phạm Minh Hoàng
1.2. Các thao tác trên một biểu thức
> ln(x)+ln(y):%=combine(%, ln, symbolic);[6 ] ln(x) + ln(y) = ln(xy) > sin(x)*cos(y):%=combine(%);[7 ] 1 1 sin(x) cos(y) = sin(x + y) + sin(x y) 2 2 > Int(f,x)+Int(g,x):%=combine(%,Int);[8 ] »
»
»
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.
Lệnh convert: biến đổi Biến đổi một biểu thức toán học sang dạng khác. Đây là lệnh phức tạp nhất(gần 100 cách biến đổi khác nhau): > convert(12,binary); 1100
> exp(I*x):%=convert(%,trig); eIx = cos(x) + I sin(x)
?
> arcsinh(x):%=convert(%, ln); arcsinh(x) = ln(x +
x2 + 1)
> A:=matrix([[1,2],[3,4]]): convert(A,listlist); [[1, 2], [3, 4]]
Một trong những chức năng quan trọng của hàm convert là phân tích một phần số hửu tỷ thành tổng các phần tử đơn giản: > 1/(xˆ2-4):%=convert(%,parfrac,x); 1 1 1 = + 2 x 4 4(x + 2) 4(x 2)
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); I I ? 1 ? = ? ? (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 Giống factor, ngược với expand 8 Ngược với expand 7
Phạm Minh Hoàng
7
Chương 1. Cú pháp Maple
1.3 Mệnh đề và hàm mũi tên Cho biểu thức toán học: > p:=xˆ2-3*x+2; p := x2 3x + 2
Để biết giá trị tại điểm x = 2, dùng hàm subs. Trong Maple, p được gọi là một mệnh đề expression: > subs(x=2,p); 0
π π Cho hàm số f (x) = sin(x), giá trị tại x = được viết như một ký hiệu quen thuộc: f ( ). 3 3 Trong Maple, f được gọi là một hàm (function hay hàm mũi tên): > f:=x¡sin(x): f(Pi/3);
?
3 2
Để biến một mệnh đề sang một hàm mũi tên: > g:=unapply(p,x): g(2); 0
Đây là một lệnh quan trọng vì nó cho phép khai báo một hàm (mũi tên) từ một kết quả phức tạp.
1.4 Các thao tác trên một dãy Một dãy có thể được khai báo bằng cách khai báo từng phần tử hoặc bằng hàm seq. Nó có thể có hoặc không có dấu ngoặc vuông: > p:=seq(2*i+1,i=0..8); q:=[sin(-Pi/3),6,-2,Piˆ2]; p := 1, 3, 5, 7, 9, 11, 13, 15, 17 [ ? ] 3 2 2 , 6, 2, π
Các phần tử của dãy và số phần tử của dãy: > p[3],q[4]; 5, π 2
> nops([p]),nops([q]); 9, 4
Lưu ý cách sử dụng khi dãy khai báo với ngoặc vuông hoặc không ngoặc vuông. Khai báo dãy bất kỳ bằng hàm rand(random): > k:=rand(-15..15): > X:=seq(k(),i=1..20); Y:=[seq(k(),i=1..17)];
8
Phạm Minh Hoàng
1.4. Các thao tác trên một dãy 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]
Tìm các phần tử xi
4 và chia chẵn cho 3, các số nguyên tố trong Y :
> select(i ¡i>4 and i mod 3 = 0, [X]); select(i ¡isprime(i),Y); [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
Khi dãy có số vô tỷ phải dùng lệnh is (dùng lại dãy q ở trên): > select(i>0,q); Error,selecting function must return true or false
> 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]); [169, 49, 225, 36]
> map(i¡i-3*I,[s]); [13 3I, 7 3I, 15 3I, 6 3I]
> u:=[seq(sin(i*x),i=1..3)]; u := [sin(x), sin(2x), sin(3x)]
> map(diff,u,x); [cos(x), 2 cos(2x), 3 cos(3x)]
option has: > p:=x=sin(t),y=cos(t)ˆ2,z=1+cos(u); p := x = sin(t), y = cos(t)2 , z = 1 + cos(u)
Tìm những phần tử trong p không có cos(t): > remove(has,[p],cos(t)); [x = sin(t), z = 1 + cos(u)] Phạm Minh Hoàng
9
Chương 1. Cú pháp Maple
1.5 Giải tích Hàm một biến
Các lệnh để tính giới hạn, đạo hàm, nguyên hàm...: > p:=exp(-xˆ2): Limit(p,x=infinity):%=value(%); lim ex = 0
x
2
Ñ8
> Diff(p,x):%=diff(%); d x 2 2 e = 2xex 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 2 Lệnh dưới đây tính 2 p (dấu nháy được dùng để hiển thị chứ p thay vì ex ) dx > 'Diff('p;,x,x)':%=value(%); d2 2 2 p = 2xex + 4x2 ex 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(%); »
ex dx = 2
1? π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(%); »
10
sin(nx)dx =
cos(nx) n Phạm Minh Hoàng
1.6. Đồ thị hai chiều
Hàm nhiều biến > p:=xˆ3+x*yˆ2+yˆ3; p := x3 + xy 2 + y 3
> 'Diff('p,y,y')':%=value(%); d2 p = 2x + 6y dy 2 > f:=unapply(p,x,y);
Theo trên, f là một hàm theo (x, y). Các công thức tính đạo hàm:
Bf là D[1](f), B2f là (D@@2)[2](f), B2f là D[1,2](f) Bx B2x B xB y > D[1](f),(D[2]@@2)(f),D[2,1](f); (x, y) ÞÑ 3x2 + y 2 , (x, y) ÞÑ 2x + 6y, (x, y) ÞÑ 2y
Và để thấy được sức mạnh của Maple, hãy quan sát bài toán Pavelle sau đây: > p:=sin(n*z*sqrt(xˆ2+yˆ2+zˆ2)/sqrt(yˆ2+zˆ2))sqrt(xˆ2+yˆ2+zˆ2); ( a ) nz x2 + y 2 + z 2 a sin y2 + z2 a p= x2 + y 2 + z 2 > 'Diff('p,x')':%=value(%); ( a ) ( a ) nz x2 + y 2 + z 2 nz x2 + y 2 + z 2 a a cos nzx sin x y2 + z2 y2 + z2 d a p= (x2 + y2 + z2)3/2 dx (x2 + y 2 + z 2 ) y 2 + z 2
Kết quả trên cực kỳ phức tạp, nhưng đây mới chỉ là đạo hàm bậc nhất. Trong trường hợp bạn thực sự rảnh rỗi, hãy chứng minh (bằng tay) rằng: [
B2 ( B2 + B2 + B2 ) + n2 ( B2 + B2 )] p(x, y, z) = 0 Bx2 Bx2 By2 Bz2 Bx2 By2
Còn nếu bạn không có thời giờ, câu lệnh tương ứng là: > Diff('Diff('p,x,x')+Diff('p,y,y')+Diff('p',z,z),x$2')+ nˆ2*('Diff('p,x$2')+Diff('p,y$2')'):%=simplify(value(%),symbolic);
1.6 Đồ thị hai chiều [9 ] 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.
Phạm Minh Hoàng
11
Chương 1. Cú pháp Maple
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àm nối điểm > k:=rand(-20..20); > p:=seq([i,k()],i=1..40); plot([p]);
Đồ thị các hàm khác nhau
Cách dễ nhất là gán các đồ thị vào một biến, rồi sau đó dùng display để vẽ chung. Khi gán nhớ chấm dứt bằng dấu (:). > a:=plot([sin(t),x-1],t=-Pi..Pi,color=tan): > b:=polarplot([sin(t),t]t=-Pi..Pi,color=navy): > c:=implicitplot(xˆ2+yˆ2-1,x=-3..3,y=-3..3,grid=[100,100]): > display(a,b,c,scaling=constrained);
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);
12
Phạm Minh Hoàng
1.7. Giải phương trình
1.7 Giải phương trình Phương trình đại số Phương trình đơn > p:=xˆ3+xˆ2-2; p := x3 + x2 2
> solve(p,x); 1, 1 + I, 1 I
Tuy nhiên không phải lúc nào kết quả cũng đơn giản. Phương trình sau nghiệm giải tích cực kỳ phức tạp, Maple chỉ xuất dưới dạng RootOf: > p:=xˆ4-4*xˆ3+1; p := x4 4x3 + 1
> s:=solve(p); s := RootOf ( Z 4 4 Z 3 + 1, index = 1), RootOf ( Z 4 4 Z 3 + 1, index = 2)
RootOf ( Z 4 4 Z 3 + 1, index = 3), RootOf ( Z 4 4 Z 3 + 1, index = 4)
Để thấy giá trị dạng đó lẻ (float), dùng evalf (ở đây hiển thị 5 số lẻ): > evalf(%,5); .66963, 3.9842, .32691 + .51764I, .32691 .51764I
Để có dạng tường minh giải thích, dùng hàm allvalues (không hiển thị vì dài) > allvalues([s]);
Nếu chỉ muốn lấy thực nghiệm dùng phương pháp giải gần đúng: > fsolve(p); 0.6696315467, 3.984188231[10 ]
Một lệnh khác là isolate có tác dụng giống solve, nhưng có thêm vế bên trái. Việc này rất tiện lợi khi tiếp sau đó là lệnh subs: > p:=x-x*ln(xˆ2); p := x x ln(x2 )
> isolate(p,x): subs(%,p); x=
?e, 0
Hệ phương trình (phải thêm ngoặc nhọn khi khai báo hoặc khi giải bằng solve). > p:=x-y=2), x*y=4; p := x y = 2, xy = 4
> solve({p}): (dạng RootOf, không hiển thị) > s:=allvalues(%); 10
Đôi khi lệnh fsolve không cho ra hết các nghiệm thực, lúc đó phải xác định thêm (bằng đồ thị) khoảng cách ly nghiệm. Thí dụ fsolve(f,x=a..b) sẽ cho 1 nghiệm của f trong khoảng [a,b] Phạm Minh Hoàng
13
Chương 1. Cú pháp Maple 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
Phương trình quy nạp Thí dụ 1. Dãy tuyến tính > eq:=u(n)=-3*u(n-1)-2*u(n-2); eq := u(n) = 3u(n 1) 2u(n 2)
> rsolve({eq,u(0)=1,u(1)=1},u); (1)n (2)n
> S:=unapply(%,n): seq(S(i),i=0..10); 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023
Thí dụ 2. Dãy Fibonacci > eq:=f(n)=f(n-1)+f(n-2); eq := f (n) = f (n 1) + f (n 2)
> rsolve({eq,f(1..2)=1},f); ? ( ? )n ? ( ? )n 5 1 5 + 55 12 25 5 2 2 > g:=unapply(%,n): seq(simplify(g(i)),i=1..15); 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610
Thí dụ 3. Dãy quy nạp chéo > s:=u(n+1)=u(n)-2*v(n), v(n+1)=u(n)+4*v(n); s := u(n + 1) = u(n) 2v(n), v(n + 1) = u(n) + 4v(n)
> p:=rsolve(s,u(0)=-1,v(0)=-1,u,v); p := u(n) = 33n 42n , v(n) = 33n + 22n
> su:=unapply(eval(u(n),p),n): seq(su(i),i=1..6); 1, 11, 49, 179, 601, 1931
1.8 Phương trình vi phân Cách giải giải tích Phương trình bậc nhất > p:=diff(y(x),x)=-k*y(x); d y(x) = ky(x) dx
14
Phạm Minh Hoàng
1.8. Phương trình vi phân
> 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) d y(x) y(x)2 + 3y(x) dx 3 y(x) = (1 + 3e3x C) eq :=
Ba đồ thị của lời giải tương ứng với C1 = -1,0,1: > f:=unapply(rhs(%), C1): > plot([seq(f(i),i=-1..1)],x=-2..2,y=-2..5,CB); (Hình 1.1(a))
Maple có thể vẽ tập hợp lời giải dưới dạng các mũi tên (không hiển thị): > with(DEtools): > gr1:=dfieldplot(eq,y(x),x=-3..2,y=-3..5,CB): display(%):
Đồ thị ba lời giải vẽ chung với tập hợp các lời giải: > gr2:=plot([f(-8),f(3),f(10)],x=-3..2,CB): > display(gr1,gr2); (Hình 1.1(b))
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
Phương trình bậc hai > eq:=y2+5*y1+6*y0; eq := Phạm Minh Hoàng
d2 d y(x) + 5 y(x) + 6y(x) 2 dx dx
15
Chương 1. Cú pháp Maple
Đ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ệ phương trình bậc nhất > eq:= diff(x(t),t)=-4*y(t)+5, diff(y(t),t)=x(t)-2; d d eq := x(t) = 4y(t) + 5 y(t) x(t) 2 dt dt dsolve trong trường hợp này bắt buộc phải có ngoặc nhọn: > s:=dsolve({eq,x(0)=1,y(0)=-1}) "
s := x(t) =
9 9 1 5 sin(2t) cos(2t) + 2, y(t) = cos(2t) sin(2t) + 2 4 2 4
*
Đường biểu diễn x(t) theo y(t): (Hình 1.2(a)) > plot([eval(x(t),s),subs(s,y(t))],t=0..2*Pi,linestyle=[1,4]);
Đường biểu diễn y(t) theo x(t): (Hình 1.2(b)) > plot([eval(x(t),s),subs(s,y(t)),t=0..2*Pi],color=black);
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. Phương trình bậc nhất > restart: with(plots): [11 ] > eq:=diff(y(x),x)-xˆ2*y(x)=1; 11
Thư mục plots cần thiết cho các lệnh display, odeplot được dùng dưới đây
16
Phạm Minh Hoàng
1.8. Phương trình vi phân d y(x) x2 y(x) = 1 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):
Phương trình bậc hai
Phương trình dao động của một lò xo độ cứng K, hệ số ma sát B: > eq:=diff(x(t),t,t)+B*diff(x(t),t)+K*sin(x(t)); eq :=
d2 d x(t) + B + K sin(x(t)) 2 dt dt
Phép giải giải tích không cho kết quả. Để giải bằng phương pháp số, điều quan trọng nhất là phải gán trị số cho tất cả các biến: > B:=1/4: K:=2: > s:=dsolve({eq,x(0)=1,D(x)(0)=0},numeric): s(.13); [t = 0.13, x(t) = 0.9859,
d x(t) = 0.2146] 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ố
Phạm Minh Hoàng
17
Chương 1. Cú pháp Maple
Hình 1.3: Lời giải phương trình vi phân và phương pháp số
1.9 Đại số tuyến tính Những điều cần nhớ là: Nhập thư viện: lệnhlinalg Để hiển thị ma trận: lệnh eval Để tính toán ma trận: lệnh evalm Nhập thư viện và khai báo ma trận bằng 2 cách: > with(linalg): > A:=matrix(3,3,[-2,2,3,3,7,8,10,-4,-3]): > B:=matrix([[2,4,-1],[3,6,-3],[2,3,9]]): A:=eval(A),B:=eval(B); [ [ ] 2 2 3 ] 2 4 1 7 8 , B = 3 6 3 A= 3 10 4 3 2 3 9 > A+B=evalm(A+B), AB=evalm(A&*B); ] ] [ [ 8 13 23 0 6 2 43 78 48 6 13 5 , AB = A+B = 2 7 25 12 1 6 > inverse(A):%=1/90*map(i¡i*90,eval(%)); (ma trận nghịch đảo) 11 1 1 90 ] [ 6 5 89 15 4 185 = 1 11 89 24 25 90 41 152 182 90 82 12 20 45 15 9 > diag(a,b,c), band([x,y,z],4); (ma trận đường chéo, ma trận băng) [a 0 0 ] y z 0 0 y z 0 0 b 0 , x 0 x y z 0 0 c 0 0 x y
18
Phạm Minh Hoàng
1.9. Đại số tuyến tính
Tích một ma trận và một vector > v:=vector([1,2,3]): evalm(A&*v); [11, 41, 7]
> evalm(A&*[a,b,c]); [2a + 2b + 3c, 3a + 7b + 8c, 10a 4b 3c]
Đa thức đặc trưng, trị riêng và định lý Cayley-Hamilton: > cp:=charpoly(A,x); s:=eigenvals(A); cp := x3 2x2 33x + 90 s := 3, 5, 6
> subs(x=A,cp):%=evalm(%); ] [ 0 0 0 3 2 A 2A 33A + 90 = 0 0 0 0 0 0
Véc-tơ riêng và ma trận chuyển cơ sở P : > v:=eigenvects(A); v := [5, 1, t[1, 13/2, 2]u], [3, 1, t[1, 49/4, 13, 2]u], [6, 1, t[1, 1, 2]u]
Kết quả là một dãy ba phần, mỗi phần gồm ba phần tử. Phần tử thứ nhất là trị riêng, thứ hai là số bội, thứ ba là véc-tơ riêng tương ứng. Từ ba véc-tơ này có thể xây dựng ma trận chuyển vị: > P:=concat(op(v[1,3]),op(v[2,3]),op(v[3,3])); 1 1 1 13 49 1 P := 2 4 13 2 2 2
(1.9.1)
Ta có P JP 1 = A với J là ma trận đường chéo: > evalm(P$*diag(5,3,-6)$inverse(P));
Tuy nhiên, ta có thể tính ma trận đường chéo J và ma trận chuyển cơ sở bằng lệnh jordan: > J:=jordan(A,'P'): J:=eval(J),P=eval(P); 71 4 8 99 [ 9 11 6 0 0] 71 49 52 0 3 1 , P := J := 4 11 0 0 5 99 26 16 142 99 9 11
(1.9.2)
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. $ &
Cho ma trận M bậc n mà các phần tử là: mij =
%
0 1
(i = j) (i j) 1 (j i)
> B:=matrix(4,4),(i,j)¡if i=j then 0 elif i>j then -1 else 1 fi); Phạm Minh Hoàng
19
Chương 1. Cú pháp Maple
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);
Một thí dụ khác: > E:=n¡matrix(n,n,(i,j)¡(n-1)*(i-1)+j): C(4),E(4); 1 2 3 4 0 1 1 1 4 5 6 7 1 0 1 1 C(4) = 1 1 0 1 , E(4) = 7 8 9 10 10 11 12 13 1 1 1 0
1.10 Lập trình trong Maple Lập trình Maple rất đơn giản, chỉ cần biết cú pháp và nhớ vài chi tiết: 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
20
Phạm Minh Hoàng
1.10. Lập trình trong Maple
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
> auto:proc(m) local M,s,mp,lu,,lx,ly,f,i: M:=p¡matrix(4,4,[0,0,0,100,0.11,0,0,0,0,0.2,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 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); opselect(i¡is(Im(i)=0 and i0),[solve(f-1)])); end:
Bảng 1.1: Sắp xếp một dãy số thực
Khai thác sau khi biên dịch Mục đích của lập trình trước tiên là gom các dòng lệnh vào trong một thuật toán, nhưng còn một tiện ích khác là sau khi biên dịch (compiler), chúng ta có thể lưu lại trong một f ile để dùng về sau mà không cần biên dịch lại. F ile này có dnagj nhị phân, còn được gọi là tập tin thực thi (executable) f ile. Trong Maple, tập tin này có đuôi là m. Lệnh tạo ra tập tin này là: > save xxx,"C:/DIR/pgm.m":
Trong đó xxx là tên của thuật toán, pgm là tên của tập tin thực thi. Hai tên này không nhất thiết giống nhau. C:/DIR là đường dẫn thư mục chứa tập tin thực thi. Sau khi lưu lại, người ta có thể gọi ra để thi hành bằng lệnh: > read "C:/DIR/pgm.m":
Tất cả được tóm tắt trong sơ đồ sau: Trong đó: ms là tên của thuật toán (còn gọi là chương trình con) pgm.m là tên của tập tin thực thi của thuật toán ms work.mws là tên của worksheet tạo ra thuật toán ms test.mws là tên của worksheet gọi thuật toán ms
Thí dụ: Cho ma trận p: > p:=matrix(2,2,[1/2,2/3,3/4,4/5]); 1 2 p := 23 34 4 5 Phạm Minh Hoàng
21
Chương 1. Cú pháp Maple
. .> ms:=proc(n)
.> restart: .> read "C : /DIR/pgm.m" :
.end: .> save ms, "C : /DIR/pgm.m" :
.> ms(n); .test.mws
.work.mws
Hình 1.4: Sơ đồ tạo và sử dụng tập tin thực thi
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)
Sau khi tạo pgm1.m trong một worksheet mới ta làm: > restart: read "D:/My path/pgm1.m": > p:=matrix(2,2,[1/2,2/3,3/4,4/5]); > eval(p)=msimply(p); 1 2 1 [30 40] p := 23 34 = 60 45 48 4 5
Bây giờ chúng ta sẽ viết một thuật toán khác có tên mjor để lũy thừa một ma trận M bằng công thức M n = P Dn P 1 (D là ma trận đường chéo và P là ma trận chuyển cơ sở ).mjor có hai tham số: ma trận và bậc lũy thừa: Sau khi tạo pgm2.m trong một worksheet mới ta sẽ lần lượt khai báo một ma trận m, gọi hai thuật toán msimply và mjor để dùng một lúc tính và thu gọn m3 : > restart:
22
Phạm Minh Hoàng
1.11. Nguyên hàm
> 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] p := 1 3 = 72 214 123 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.
1.11 Nguyên hàm Maple lấy được hầu như mọi nguyên hàm và tích phân: > Int(x/(xˆ3+1),x):%=value(%); ? (? ) » 1 3 3 1 x 2 dx = ln(x x + 1) + arctan (2x 1) ln(x + 1) 3 x +1 6 3 3 3
Kiểm chứng bằng đạo hàm: > diff(rhs(%),x):%=normal(%,expanded); 2x 1 1 1 x + = 3 2 2 6(x x + 1) 2(x x + 1) (3x + 3) x +1 > Int(xˆ2*sin(x),x=0..Pi):%=value(%); »π
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(%); Phạm Minh Hoàng
23
Chương 1. Cú pháp Maple »
1
ln(x2
»
1)
dx =
1
ln(x2
1) dx
(1.11.1)
»
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)); 1 2 x ln(x) 2
»
x dx 2
Giá trị của biểu thức trên đơn giản, có thể dùng value > p:=value(%); »
1 1 x ln(x)dx = x2 ln(x) x2 dx 2 4
Ta cũng có thể chọn u = x > intparts(p,x):expand(%); x2 ln(x)
x2
»
»
x ln(x)dx + xdx
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); »
1 2 1 1 x ln(x) x2 + xdx 2 2 2
Đến đây thì ta có thể dùng value để hiển thị kết quả: > p:%=value(%); »
1 1 x ln(x)dx = x2 ln(x) x2 dx 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
24
Phạm Minh Hoàng
1.11. Nguyên hàm
Phương pháp đổi biến. > p:=Int(x*sqrt(1-xˆ4),x); »
p :=
?
x 1 x4 dx
Đổi biến bằng cách x2 = sin(u): > changevar(xˆ2=sin(u),p,u); » 1a 1 sin(u)2 cos(u)du 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 1 x4 x2 + arcsin(x2 ) 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. Thiết lập các công thức quy nạp.
Các cách biến đổi trên có một ứng dụng rất hay là tính các công thức tích phân quy nạp, » chẳng hạn như thiết lập công thức của x lnn xdx. > p:=Int(x*ln(x)ˆn) »
x lnn xdx
> q:=intparts(p,ln(x)ˆn); » 1 1 ln(x)n nx n 2 q := ln(x) x 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); 1 1 Fn := ln(x)n x2 nFn1 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)
Phạm Minh Hoàng
25
Chương 1. Cú pháp Maple
Để á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: $ ' &
»
F (n) =
n
x ln (x)dx =
' %
1 2 1 x ln(x) x2 (n = 1) 2 4 1 1 ln(x)n x2 nFn1 (n ¡ 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: > factor(F(3)); int(x*ln(x)ˆ-F(3); 1 2 x (4 ln(x)3 6 ln(x)2 + 6 ln(x) 3) 8 0
1.12 Bài tập Các lệnh cơ bản Cho đa thức p = x2 4x3 1 1. Vẽ đường biểu diễn của p. Tìm các nghiệm trong R và trong C . 2. Thừa số hóa p và
1 trong R và trong C . p
Đại số [ 2t 1. Cho M = 2
] 1 t . Xác định t sao cho M nhận giá trị riêng kép.
?
? 2I 2 Tính véc-tơ riêng trong trường hợp này. (ĐS: t = , [1, I 2]). 3 x 0 ?0 3. Tìm x, y, z sao cho m nhận ba giá trị riêng 4, 8, 12. 2. Cho M = 0 ?y 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ó.
26
Phạm Minh Hoàng
1.12. Bài tập
Tìm an , bn sao cho @n P N , M n = an M + bn In 1 (ĐS: an = 2n 1, bn = (2n+1 + 1)). 3
Phương trình vi phân 1. Cho phương trình vi phân E : x(x2 1)y 1 (x) (x2 1)y(x) + 2x = 0. Chứng minh rằng tiếp tuyến tại hoành độ x = 2 của các lời giải của E đều đi qua một điểm cố định A. Tìm A, vẽ đồ thị. 2. Cùng một câu hỏi nhưng tại hoành độ x = u với: E(k) : x(x2 1)y 1 (x) (x2 1)y(x) + kx = 0
3 với: 2 E(k) : x(x2 1)y 1 (x) (xk 1)y(x) + 2x = 0
3. Cùng một câu hỏi nhưng tại hoành độ x =
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) ln(x)3 1. p = x3
?
4. p = x 1 + x4
2. p = x arccos(x)
5. p =
arcsin(x) x2
3. p = ex sin(x)
6. p =
a
2
x(x2 + 1) ln(x2 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
1 + bx + c
b 1 b2 (Hướng dẫn: Đổi biến bằng công thức: x + = (c ) tan(u)) [18 ] 2a a 4a 1 1 1. p = 2 3. p = 2 3x + 6x + 5 (x 6x + 18)2 2. p =
(2x2
1 4x + 10)2
4. p =
?
3x [19 ] 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 #
Dãy Syracuse là một dãy được định nghĩa như sau: ui+1 = 18 19
ui (ui chẵn ) 2 3ui + 1 (ui lẻ )
Xem hàm completesquare Đặt (x + 1) = 3 sin(u).
Phạm Minh Hoàng
27
Chương 1. Cú pháp Maple
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);
28
Phạm Minh Hoàng
1.12. Bài tập ´ ; Jn:=map(i¡iˆn,eval(J)); > J:=jordan(avalm(1/3*S),p ´)
> 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));
Phạm Minh Hoàng
29
Chương 1. Cú pháp Maple
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 ˆ +1)*ln(xˆ2-1),x);value(%); > p:=Int(x*sqrt(x2 > 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
Trong bài này chúng ta chấp nhận
30
»
1 dx là một trường hợp "đơn giản". cos(x) Phạm Minh Hoàng
1.12. Bài tập
> 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 u1 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));
Phạm Minh Hoàng
31
Chương 1. Cú pháp Maple
1.13 Bài đọc thêm: Thalès Thalès (625-547 trước Công Nguyên) Thalès vốn là một thương gia, nhưng sau khi phát tài giàu có thì ông dùng tiền kiếm được để đi chu du, giao lưu học hỏi, nghiên cứu. Chặng đường đầu tiên ông dừng chân là Ai Cập. Tương truyền rằng ở đó có người thách Thalès đo chiều cao của kim tự tháp mà không cần leo lên (mà cho dù có leo lên đỉnh cũng chẳng giải quyết được gì !). Thalès liền cắm một cây gậy xuống đất rồi nói: Khi chiều dài bóng cây gậy bằng cây gậy thì chiều dài bóng kim tự tháp bằng chiều cao của nó. Có lẽ lúc ấy ông không thể ngờ rằng hơn 26 thế kỷ sau, các học sinh đều phải học qua câu nói bất hủ này: Định lý 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 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 văn, Toán học... Ông đã biết và truyền bá cho những người xung quanh rằng một năm có 365 ngày, người ta còn đồn rằng vào thời đó ông đã hiểu vì sao có nguyệt thưc, nhật thực. Ông đượ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 điểm của ông về nguồn gốc của muôn loài là 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ó một năm, được mùa quả ô-liu, Thalès bèn bỏ 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 đó, ông thu được tiền nhiều vô kể. Thật khó kết luận là những phát minh tìm
32
tòi thời đó có phải thật là của ông hay không, nhưng có điều gần như chắc chắn ông là nhà hình học đầu tiên của nhân loại. Tác phẩm của ông về Hình học sơ cấp như những điều ông đã phát biểu về đường thằng, góc, tam giác... đều khá rõ ràng tuy có một số kiến thức được biết từ thời văn minh Babylone nhưng Thalès quan tâm đến chứng minh, đó là điều làm tôn giá trị khoa học của ông. Những nhà khảo cổ đã sưu tập được những bài phát biểu này, đó chính là cơ sở để đánh giá tính khoa học của việc nghiên cứu ông để lại cho đời sau. Sáu kết quả quan trọng sau đây người ta cho là công lao của Thalès: Các góc đáy của tam giác cân bằng nhau. Nếu hai đường thẳng cắt nhau thì các góc đối đỉnh bằng nhau. Một tam giác được xác định chính xác nếu biết độ dài của một cạnh và hai góc kề với cạnh đó. Những cạnh tương ứng của các tam giác đều thì tỉ lệ với nhau. Đường kính chia vòng tròn ra hai phần bằng nhau. Một tam giác ABC nội tiếp trong một vòng tròn và nếu BC là đường kính của z là một góc vuông. vòng tròn thì BAC
Phạm Minh Hoàng
Chương2 Bài toán cực trị 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à: Xác định đại lượng muốn tìm cực trị. 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. Giải phương trình đạo hàm.
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.
2.1 Tiết kiệm nhôm Cho một hình trụ thể tích π lít. Tìm kích thước hình trụ sao cho diện tích của nó nhỏ nhất. Gọi V là thể tích, S là diện tích toàn phần của hình trụ. Đặt r là bán kính đáy, h là chiều cao. Mục đích của chúng ta là tìm cực trị của S theo r (hoặc h) bằng cách giải phương trình: dS = 0. Ta có: dr > S:=2*Pi*rˆ2+2*Pi*r*h; S := 2πr2 + 2πrh
> V:=Pi*rˆ2*h; V := πr2 h
Để loại h ta làm (thể tích là π lít): > eh:=h=solve(V=Pi,h);
Chương 2. Bài toán cực trị
.r
.
.
.
.h
Hình 2.1:
eh := h =
1 r2
Thay vào biểu thức của S: > subs(%,S); 2π + 2πr2 r
Giải
dS = 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.
2.2 Đoạn đường gần nhất Một người muốn đi từ P đến R và phải bơi qua con sông. Vận tốc bơi là u, và vận tốc đi là v. Tính quãng đường nhanh nhất đến R. Biết rằng chiều rộng con sông là h và khoảng QR là n. Gọi X là một điểm trên bờ QR với QX = x, thời gian tổng cộng để bơi từ P đến X và đi bộ từ X đến R là: 34
Phạm Minh Hoàng
2.2. Đoạn đường gần nhất
Hình 2.2:
> T:=sqrt(hˆ2+xˆ2)/u+(n-x)/v; ?2 2 nx h +x + T := u v
Tọa độ của x là nghiệm của phương trình
dT = 0: dx
> solve(diff(%,x),x); hu ? hu , ? 2 2 u + v 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),%); hu p1 := ? u2 + v2
Giả sử bây giờ ta đặt RX = x, thời gian tổng cộng sẽ là: > T:=sqrt(hˆ2+(n-x)ˆ2)/u+x/v; ?2 2 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); Phạm Minh Hoàng
35
Chương 2. Bài toán cực trị
? 2 2 ? 2u +2v n u + v
hu +
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.
2.3 Góc nhìn của phi hành gia Giả sử một phi hành gia đang lơ lửng trên đường nối giữa A là tâm trái đất (bán kính a) và B là tâm mặt trăng (bán kính b). Cho l = AB. Xác định tọa độ phi hành gia trên AB sao cho tổng diện tích của phần trái đất và mặt trăng ông ta có thể quan sát được là cực đại. Biết rằng diện tích phần lồi nhìn thấy được là 2πrh, với r là bán kính hành tinh quan sát, h là chiều cao phần lồi. .K
.A
.
.a
.X
.
.B
.H
.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ó: cos α =
a AH = a x
2
ñ AH = ax
Tương tự, về phía mặt trăng, chiều cao của phần lồi sẽ là b
b2
. 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);
36
Phạm Minh Hoàng
2.4. Hình nón và hình cầu
?
?
1 (2a2 + 2b ba)la 1 (2a2 + 2b ba)la s := 2 a3 + b3 , 2 a3 b3
Maple cho ra hai nghiệm, và theo như đầu bài thì ta phải có 0 x l: > select(i¡is(i>0),[s]);
Error, selecting function must return true or false
Đ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)
Bây giờ ta giả sử b ¡ 0.
¡ 0, và 1 nếu ℜ(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
?
l3a ?. 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à ? 3 a+ 3b
2.4 Hình nón và hình cầu Tính bằng thể tích Tìm thể tích lớn nhất của một hình nón có thể nội tiếp được trong một hình cầu bán kính R. Hình 2.4 (a) là mặt cắt hình nón nội tiếp một hình cầu. Gọi R là bán kính hình cầu; r, h là bán kính đáy và chiều cao hình nón. Ta có: 1
Nếu khai báo assume(a ¡ 0, b ¡ 0, l ¡ 0), lệnh select trên cũng không cho ra kết quả gì khác hơn
Phạm Minh Hoàng
37
Chương 2. Bài toán cực trị 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 trình
B pV (h, R) = 0 để tìm giá trị của h(h ¡ 0): Bh
> p3:=subs(%,rhs(pV)); 1 p3 := πRooOf ( Z 2 + h2 2hR)2 h 3 > eh:=h=op(select(i¡i0,[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(%); ( ) 4 32 3 32 3 2 2 2 π(RootOf (9 Z 8R )) R = π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
38
Phạm Minh Hoàng
2.4. Hình nón và hình cầu
2? 4 32 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: Kết luận: r =
> 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 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.
33.51
.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. Trong trường hợp này ta có (tam giác M BC và M DO đồng dạng): OD MD 2 2 2 = với M D = M O OD = (h R)2 R2 BC MB > uE:=R/r=sqrt((h-R)ˆ2-Rˆ2)/h;pE:=isolate(%,r); ?2 R h 2hR uE := = r h hR pE := r = ? h2 2hR
(2.4.2)
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 p3 := 3 h2 2hR > s:=solve(diff(%,h),h); > simplify(isolate(subs(h=s[2],uE),r),symbolic); s := 4R Phạm Minh Hoàng
39
Chương 2. Bài toán cực trị
?
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.
Tính bằng diện tích Bây giờ giả sử chúng ? ta cực trị hóa diện tích chung quanh hình nón thay vì thể tích, ta sẽ tính cực trị của S = πr r2 + h2 . Và cùng một lý luận như trên:
Hình nón nội tiếp cực đại
?
> 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 ? 8 ? 8 = πR2 3, πR2 3 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] để a
lại dấu ngoặc vuông:
> select(i¡is(Re(op(1,op(s[i])))>0),[s]); [ ] 2? 2R 3
?
2? 4R 8 3 2 ,r = πR và đó cũng là kích thước hình nón khi tính Kết luận: h = 2R, S = 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):
40
Phạm Minh Hoàng
2.4. Hình nón và hình cầu
? ? ?? ?? π h2 + 2hR 2 hR, π h2 + 2hR 2 hR = [πh (2h 4R)R, πh (2h 4R)R]
> %=map(combine,[%],radical,symbolic); 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
Hình nón nội tiếp cực tiểu > p3:=simplify(subs(pE,rhs(pS)),symbolic);
Ta thực hiện cùng phương pháp bằng cách áp dụng (2.2) vào biểu thức pS: > op(select(i¡i0,[solve(diff(p3,h),h)])); πhR(h R) p3 := h 2R > eh:=op(select(i¡is(op(1,op(s[i]))>1),[%])); (2 +
?
2)R, (2
?
2)R
Và diện tích cực tiểu sẽ là:
?
? ?
> s2:=simplify(subs(h=%,p3),symbolic); s2 := df rac12π(2 +
2)R2 (1 +
(2.4.3)
2) 2
Và giá trị của r là:
? ? 7 5 2R, 7 5 2R,
> s:=solve(subs(S=s2,h=eh,pS),r); a
s :=
a
Dĩ nhiên ta chỉ chọn nghiệm r
¡ R:
a
1+
?
a
2R,
1+
?
2R
> op(select(i¡is(Re(op(1,op(s[i])))>0),[s])):%=evalf(%); a
1+ Phạm Minh Hoàng
?
2R = 1.5537R
41
Chương 2. Bài toán cực trị
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):
V S
Tính theo V int ext 32 3 8 3 πR πR 81 3 8? 3πR2 6πR2 9
Tính theo S ext ( ?) 1 3 πR 4 + 3 2 3
int 32 3 πR 81 8? 3πR2 9
?
πR2 (3 + 2 2)
Bảng 2.1: Kết quả theo V và theo S của hình nón nội tiếp hình cầu
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)]
Nội tiếp cực đại tính theo S : h = (2 +
?
2)R, r =
a
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)]
2.5 Khúc cua gắt Trong một khúc cua (rẽ) thẳng góc hợp bởi hai con đường có chiều rộng a và b mét. 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?
42
Phạm Minh Hoàng
2.5. Khúc cua gắt
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): > as:=op(remove(has,[%],I)); ?3 2 ab as := arctan( ) b
(2.5.2)
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 b 1+ + ab b2
1+
(ab2 )2/3 1 2 ?3 2 [ ] b2 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ố
Phạm Minh Hoàng
43
Chương 2. Bài toán cực trị
.B .b
.a
.
.α
.A
.C Hình 2.8:
> expand(%): factor(%); ( )2 3 2 2 3 3 b +a
(2.5.3)
Đ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); u a b cos(α) q := + cos(α) sin(α) > solve(diff(q,alpha),alpha); ( ) %13 a 2%12 u + u arctan , % 1 b(%12 1)
44
Phạm Minh Hoàng
2.5. Khúc cua gắt
.B .b
.B 1
.u .F .α .a .E .
.α
.A
.A1
.C
Hình 2.9:
%1 := RootOf ((a2 + b2 ) Z 6 4 Z 5 ua + (3b2 + 4u2 ) Z 4 +2ua Z 3 + (4u2 + 3b2 ) Z 2 + u2 b2 )
Khủng khiếp! Và còn khủng khiếp hơn nếu khai triển ra dưới dạng "tường minh" bằng allvalues. Gọi là "tường minh" chứ thật ra ta chỉ thu được 6 hàng RootOf còn phức tạp hơn gấp bội! Đến đây thì ta chỉ còn cách thử nghiệm giá trị của lời giải bằng cách gán từng RootOf vào một hàm theo (a, b, u) trước khi thử với các giá trị bằng số: Ta dùng seq để gán lời giải i vào hàm f (i, a, b, u): > s2:=allvalues([%]): > f:=unapply(subs(alpha=op(s2[i]),p),(i,a,b,u)):
Cho a = 3, b = 2, u = 0 nghĩa là trường hợp khúc cây, và thử với 6 lời giải: > seq(evalf(f(i,3,2,0),5),i=1..6);
7.2668, 1.5069, 19.239, 7.0240, 3.9222, 8.6530
Không có một kết quả nào khả dĩ chấp nhận được. Tương tự, khi có bề rọng chiếc xe u = 1 ta cũng thu được cùng một kết quả như khi u = 0, thậm chí khi cho u = 4, a = 3, b = 2 nghĩa là bề rọng của xe còn lớn hơn hai con hẻm, kết quả vẫn không mảy may thay đổi. > seq(evalf(f(i,3,2,4),5),i=1..6):
Trong những trường hợp "khó xử" như thế này, chúng ta chỉ còn cách... gác Maple qua một bên và lý luận. Xem Hình 2.9 ta có thể thấy rằng cho dù đoa là khúc cây hay chiếc xe, ta chỉ tịnh tiến AB đi một đoạn u thành A1 B 1 , điều đó có nghĩa là trong cả hai trường hợp, góc α - tương ứng với đoan AB cực tiểu - không đổi và như thế ta có thể dùng lại biểu thức (2.5) và gán vào (2.4) với điều kiện thay a bằng a u: > subs(a=a-u,as); a 3 (a u)b2 arctan( ) b > subs(alpha=%,a=a-u,p); Phạm Minh Hoàng
45
Chương 2. Bài toán cực trị b
(
)+
arctan((a 2u)b2 ) b > simplify(%,symbolic); 1 3
cos b
?
(
sin
au
arctan((a 2u)b2 ) 3 b
1
)
b 3 + (a 2u) 3 ( 3 a 2ub 3 + a u) 2
2
? 3
2
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); 2 ? 2 2 1a 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));
a bu )+ ) ( 2 f rac13 arctan(a(a 2u) ) arctan(a(a 2u)2 )f rac13 cos sin b 2u b 2u > evalf(f3(3,4,1)),evalf(f4(4,3,1)),evalf(f4(3,2,0)); f 4 := (a, b, u) ÞÑ
(
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ế)?
46
Phạm Minh Hoàng
2.6. Ellipsoid
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 Hình 2.10: Hình hộp nội tiếp trong một ellipsoid
Đâ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: $
tối ưu hóa hàm dưới ràng buộc
f (x, y) g(x, y) = 0
ùñ
' & ' %
B f (x, y) + u B g(x, y) = 0 BBx BBx 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]; Phạm Minh Hoàng
47
Chương 2. Bài toán cực trị 1? 1? 4? 1? x= 3a, y = 3b, u = 3cab, z = 3c 3 3 3 3
"
*
? ?] [ ? a 3 b 3 c 3 Vậy (H) có các cạnh theo (x, y, z) là 2 ,2 ,2 . Và lúc ấy thể tích lớn nhất 3 3 3 sẽ là (nhớ dùng hàm assign để chấp nhận lời giải): > assign(%):V; ? 8 3 abc 9
Và khi (E) là một hình cầu (a = b = c = R), thể tích lớn nhất của (H) sẽ là: > subs(a=R,b=R,c=R,V); ? 8 3 3 R 9
Hình vẽ cho bài toán Ellipsoid Chúng ta lấy lại ký hiệu và các kết quả vừa tính xong. Gọi (a, b, c) là bán kính của ellipsoid theo (x, y, z). Các đỉnh của hìn khối chữ nhât sẽ từng cặp đối xứng qua ba trục tọa độ và tọa độ của chúng có dạng:
?
?
?
3 3? 3 x = |a| , y = |b | 3, z = |c| 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]);
2.7 Cực trị của hàm hai biến: Thí dụ 2 Ở các thí dụ trên, khi tính cực trị của một hàm hai biến, người ta tìm cách khử đi một biến trước khi giải phương trình đạo hàm với biến còn lại. Tuy nhiên có những trường hợp không 48
Phạm Minh Hoàng
2.7. Cực trị của hàm hai biến: Thí dụ 2
Hình 2.11: Hình khối cực đại trong một ellipsoid
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
B
*
S(x, a) = 0, 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 Phạm Minh Hoàng
49
Chương 2. Bài toán cực trị
có RootOf và dùng hàm allvalues để hiển thị: > s:=allvalues(op(select(has,[%],Root0f))); tx = n3 , a = π3 u, tx = n3 , a = π3 u
Trong hai cặp nghiệm trên, dĩ nhiên loại cặp 2: > assign(s[1]):S; 1 2? n 3 12
Kết luận: x =
π 1 ? n , a = , S = n2 3 3 3 12
2.8 Cực trị của hàm ba biến Một hình ngũ giác hợp bởi một hình chữ nhật và một hình tam giác cân có kích thước theo (α, x, y) như hình bên. Gọi P là chu vi ngũ giác, hãy tính (α, x, y) sao cho diện tích S của nó cực đại.
.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; x vp := 2x + 2y + 2 P cos(α)
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); + 2x cos(α) + 2x 12 P cos(α) cos (α) > 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à: 50
Phạm Minh Hoàng
2.8. Cực trị của hàm ba biến
> ex:=diff(S1,x); P cos(α) + 2x cos(α) + 2x x(2 cos(α) + 2) + 2x tan(α) ex := 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 1 1 a = arctan( , RootOf ( Z 2 + 1 4 Z, label = L2) + 1)u 2 2 > u:=allvalues(%); " * " * ? ? 1 5π 5π 1 u := x = (2 + 3)P, a = , 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ì: ? P x = (2 + 3) ¡ P . Dung hàm assign để chấp nhận lời giải: 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)); ? 1 y := (3 + 3)P 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: α=
? ? ? P π P P2 , x := (2 3), y := (3 3), S := (2 3) 6 2 6 4
(2.8.1)
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, allvalues. 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): $
tối ưu hóa hàm dưới ràng buộc
f (x, y, a) g(x, y, a) = 0
*
ùñ
' ' ' ' & ' ' ' ' %
B f (x, y, a) + u B g(x, y, a) = 0 BBx BBx 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
Phạm Minh Hoàng
51
Chương 2. Bài toán cực trị
> allvalues(%); " * ? ? ? 5π 1 1 1 1 a= , u = (2 + 3)P, x = (2 + 3)P, y = (2 + 3)P + P 6 2 2 6 6 " * ? ? ? 1 1 1 1 1 u = (2 3)P, x = (2 3)P, a = π, y = (2 3)P + P 2 2 6 6 6
Chỉ nghiệm 2 là chấp nhận được và người ta tìm lại được kết quả như ở (2.11) > 'y'=factor(eval(eval(y,%[2])); ? (3 + 3)P y= 6
52
Phạm Minh Hoàng
2.9. Bài đọc thêm: Pythagore
2.9 Bài đọc thêm: Pythagore Pythagore (Samoa 569 - 500 trước Công Nguyên) Cuộc đời của nhà toán học Hy Lạp lỗi lạc thời cổ đại này luôn là một bí ẩn đối với hâu thế. Người ta đoán rằng gia đình ông gốc Tyr, và hình như ông đã từng là học trò của Thalès. Ông đi chu du nhiều nơi, qua Ai Cập, rồi Babylone, Tiểu Á rồi cuối cùng về định cư và mở trường tại Crotone. Học trò của ông lúc này thuộc nhiều tầng lớp của xã hội. Đặc biệt trong trường có cả phụ nữ, đó là điều cấm kỵ thời bấy giờ. Trong số "nữ sinh" của ông có Théano sau này thành vợ ông mặc dù có sự cách nhau khá lớn về tuổi đời. Trong số học trò của Pythagore, chỉ có một số ít được tuyển vào một nhóm đặc biệt thân cận với thầy mà thôi. Có những phát minh gì mới thì thầy phổ biến cho nhóm đặc biệt này và thành viên không được tự tiện phổ biến ra ngoài. Pythagore truyền bá mạnh mẽ tư tưởng triết học cùng tín ngưỡng của minh vào đám học trò thân cận. Nhưng cũng vì đó mà nảy sinh lòng ganh ghét trong cộng đồng và kết cục là Pythagore và một số học trò thân thiết của ông bị giết thê thảm! Nhưng cộng đồng do ông gây dựng lên thì vẫn tồn tại và phát triển thêm một thế kỷ nữa và phần nào thành công trong việc phát triển toán cũng như triết học.
Triết lý Pythagore xem thế giới này là có thể giải thích được bằng số. Ở đây, số có nghĩa là số nguyên, một phân số không thể xem là số được. Pythagore quan tâm đến thương của hai độ dài. Ông nói rằng thương số này là khả ước nếu ta biểu diễn được dưới dạng phân số, nghĩa là tử số và mẫu số của nó được biểu diễn bằng số nguyên (cùng đơn ? vị đo). Vì vậy cho nên khi phát hiện ra rằng 2 không phải là khả ước các học trò hoang mang không hiểu nó là gì, vì chưa giải thích nó được bằng luận điểm của thầy, nên họ giấu đi không công bố hiện tượng đó. Môn đệ của Pythagore gắn mỗi số với một số hạt sỏi tương ứng. Họ xếp các số theo cách sau: các số như 1, 3, 6, 10... và tổng quát là số 1 n (n + 1) được gọi là những số tam giác; 2 các số như 1, 4, 9, 16, tổng quát là n2 thì gọi là những số vuông. Những số không phải là số nguyên tố thì gọi là những số chữ nhật. Nhờ cách sắp xếp ấy mà người ta chứng minh được một số công thức, ví dụ:n2 + 2n + 1 = (n + 1)2 , 1 + 3 + ... + (2n 1) = n2 , và chính trường phái Pythagore đã phát hiện ra các số hoàn hảo, số bạn bè.
Số hoàn hảo là các số bằng tổng các ước số của nó.
Thí dụ 28 = 1+2+4+7+14 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.
Phạm Minh Hoàng
53
Chương3 Đồ thị ba chiều 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); 1 1 2 2 2 2 2 2 f := (x, y) ÞÑ 3(x 1)2 ex (y+1) 10( x x3 y 5 )ex y e(x+1) y 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: fx (x, y) =
Bf D[1]f (x, y), f (x, y) = Bf D[2]f (x, y) y Bx 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 1 2 2 2 2 (2 + 30x2 + 20( x x3 y 5 )x)ex y + ( + x)e(x+1) y 5 3 3 2
1
2
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:
> fy:=D[2](f)(x,y): 'fy'=collect(fy,exp);
f y = 3(x 1)2 (2 2y)ex (y+1) + 1 2 2 2 2 2 (50y 4 + 20( x x3 y 5 )y)ex y + ye(x+1) y 5 3 2
2
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: 3 điểm cực đại : [0, 1.6], [1.2, 0], [0.4, 0.6] 3 điểm cực tiểu : [1.4, 0.2], [0.3, 0.3], [0.2, 1.6] 2
Được dùng nhiều trong lãnh vực khảo sát địa chất và không ảnh. Kỹ thuật này cho thấy rõ sự gồ ghề của trái
đất Phạm Minh Hoàng
55
Chương 3. Đồ thị ba chiều
Hình 3.2: Đường đồng mức của hàm f (x, y) 3 điểm yên ngựa : [1.1, 0.8], [0.3, 0.45], [0.4, 0.4]
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 S:=map(allvalues,{%}); S := ttx = 0, y = 1u, tx = 0, y = 1u, tx =
?
?
1 1 3 3 , y = u, tx = , y = uu 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 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); ? ? 3 1 3 1 [0, 1], [0, 1], [ , ], [ , ] 2 2 2 2
(?
Thí dụ tại điểm dừng C
3 1 , ,f 2 2
(? ) ) 3 1 13 2 là: , = , giá trị của ∆ và fxx 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: 2 Kết luận Điểm / tọa độ ∆ fxx A(0, 1, 2) 36 6 cực đại B(0,?1, 2) 36 6 cực tiểu ( ) 3 1 13 , , C 45 6 yên ngựa 2 2 16 ? ( ) 3 1 13 , , D 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 58
Phạm Minh Hoàng
3.2. Thí dụ 2
Hình 3.4: Các điểm dừng của f (x, y)
điểm này trong không gian: > Pts:=seq)[u(i),f(u)i))],i=1..4); ? ? 3 1 13 3 1 13 [0, 1, 2], [0, 1, 2], , , , , , 2 2 16 2 2 16 > Points:=pointplot3d([Pts],symbol=circle,color=black): > display({Surface,Points},orientation=[131,60]); [Hinh 3.4 (b)]
Maple có một lệnh rất hay là spacecurve. Lệnh này vẽ đường cong đi qua các điểm xác định và ôm theo hình dạng của f (x, y), những hình này sẽ kiểm chứng tính chất của các điểm dừng một cách dễ hiểu nhất: > CA:=spacecurve([x,1,f(x,1)],x=-1.5..1.5,color=navy,TK3): > CB:=spacecurve([x,-1,f(x,-1)],x=-1.5..1.5,color=green,TK3): > CX:=spacecurve([0,y,f(0,y)],y=-1.5..1.5,color=magenta,TK3): > display({Surface,CA,CB,CX,Points},AW,orientation=[131,60]);
Đ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 magenta. > 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): Phạm Minh Hoàng
59
Chương 3. Đồ thị ba chiều
Hình 3.5: Điểm cực đại và cực tiểu của f (x, y)
> 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. [ ? ] 3 1 13 D , , 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 } 4
`
Pk }2
¡ e, tính Pk+1 = Pk + λ ` Pk
Xin xem môn tối ưu hóa hàm nhiều biến bằng phương pháp số.
60
Phạm Minh Hoàng
3.3. Thí dụ 3
Hình 3.6: Điểm yên ngựa của hàm f (x, y) 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
Kiểm chứng: tại điểm này, gx và gy
(3.3.2)
:
> evalf(subs(xy max,[gx,gy])); [2.9 e10 , 1 1010 ]
Bây giờ ta viết một đoạn mã nhỏ để thực hiện thuật toán 3.1: Phạm Minh Hoàng
61
Chương 3. Đồ thị ba chiều
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])):
(3.3.3)
if norm(p,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
62
Phạm Minh Hoàng
3.4. Thí dụ 4
Hình 3.8: Chuyển động Pk trong không gian
Ráp đường đi của Pk vào chung với đồ thị g(x, y): > display([Surf,st],style=hidden,color=navy, axes=framed,orientation=[-163,69]); [Hình 3.8 (b)]
Tuy nhiên ấn tượng nhất là hiển thị bằng hình động: > anim:=seq(diplay([Surf,pointplot3d( [seq([w[i,1],w[i,2],evalf(f(w[i,1],w[i,2]))],i=1..k)], color=red,thickness=3,connect=true)]),k=1..nops([w])); > display(anim,orientation=[-163,69],lightmodel=light2, style=hidden,insequence=true);
Bây giờ nếu cho P0 = [0.5, 0.7], λ = 0.3, Pk sẽ đi xuống. [6 ]
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: Tối ưu hóa hàm f (x, y) = x3 + xy + 2y 3
1 1 Dưới ràng buộc g(x, y) = (x 9)2 + (y 7)2 1 = 0 4 9 > restart:with(plots):with(plottools):with(linalg): > f:=(x,y)¡xˆ3+x*y+2*yˆ3;
> g:=(x,y)¡(1/4)*(x-9)ˆ2+(1/9)*(y-7)ˆ2-1; Việc chọn lựa giá trị đầu rất quan trọng vì nó quyết định đường đi của Pk . Ở đây nếu chọn P0 = [0.5, 0.8], Pk sẽ rất đi xa. 6
Phạm Minh Hoàng
63
Chương 3. Đồ thị ba chiều
Trước tiên chúng ta có hai nhận xét: 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ố.
( Nhắc lại, ellips phương trình "
xh a
)2
( +
xk b
)2 = 1 có phương trình tham số:
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) 64
Phạm Minh Hoàng
3.4. Thí dụ 4
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]); 2y x 9 grF := [3x3 + y + λ( ), x + 6y 2 + λ( 2 2 9 > EnvExplicit:=true;[7 ].
149 )]
> 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
Phạm Minh Hoàng
65
Chương 3. Đồ thị ba chiều
> Point P:=textplot([P[1]+.4,P[2]+.7,'P']): > Point Q:=textplot([Q[1]-.1,Q[2]-.5,'Q']): > display(C 2d,El 2d,Point P,Point Q,scaling=constrained):
(không hiển thị) Tại P và Q các véc-tơ gradient thẳng góc với tiếp tuyến chung của f và g. Để ` vẽ các véc-tơ này ta phải xác đnhj được các phần của chúng bằng cách thế các tọa độ P, Q vào f (x, y): > gf:=grad(f(x,y),[x,y]); gf := [3x2 + y, x + 6y 2 ]
(3.4.3)
> vgP:=subs(sr[1],eval(gf)); vgP := [182.4486749, 141.6080201]
> vgQ:=subs(sr[2],eval(gf)); [287.2113132, 592.2871979]
Vậy véc-tơ gradient có tọa độ ở hai đầu là: `
!
P =
! ` 7.697, 4.724 9.615, 9.855 Q = 182.4486, 141.6080 287.2113, 592.2871
Để dễ nhìn ta thu ngắn dọ dài của hai véc-tơ bằng cách chia cjho hai hệ số (50 và 150) cũng như đảo chiều của véc-tơ tại P . > VGrad1:=arrow( [P[1],P[2]],[P[1]-vgP[1]/50,P[2]-vgP[2]/50],.2,.5,.2,color=blue): > VGrad2:=arrow( [Q[1],Q[2]],[Q[1]+vgQ[1]/150,Q[2]+vgQ[2]/150],.2,.5,.2,color=blue):
(3.4.4) Để 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 ) A A B y yA = x Bu (x , y ) (x xA) 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). 66
Phạm Minh Hoàng
3.5. Bài đọc thêm: Euclide
Hình 3.10: (a) Đường đồng mức và ellips 2D, (b) Véc-tơ gradient tại điểm cực trị
3.5 Bài đọc thêm: Euclide Euclide (330 - 275 trước Công Nguyên) Euclide sống vào thế kỷ thứ 3 trước công nguyên, khi nền Toán học Hy Lạp cổ đại đạt tới đỉnh cao. Tác phẩm cơ bản của ông là bộ Éléments- Những nguyên tắc cơ bản có thể nói là tổng hợp tri thức của loài người về Hình học Métrique và Lý thuyết Số ở thời cổ đại. Bộ Éléments gồm 13 tập trong đó có các tri thức của các bậc tiền nhân được Euclide soạn lại một cách khoa học và rất nhiều phần là sản phẩm của bộ óc sáng tạo, thông minh tuyệt vời của ông. Từ xưa đến nay, có lẽ trên thế giới chưa có một bộ sách nào đã được dịch và tái bản đến hàng ngàn lần như bộ Éléments của Euclide. Thiên tài của Euclide thể hiện ở chỗ ông sắp đặt các mệnh đề Toán học theo một trật tự rất khoa học, ông tập trung ý tưởng vào những vấn đề Toán học, không dây dưa đến tôn giáo huyền bí như hầu hết các nhà khoa học đương thời. Nhờ các phát biểu toán học gãy gọn, và các chứng minh chặt chẽ của Euclide, những nhà khoa học thuộc thế hệ sau đã thừa hưởng gia tài trí tuệ của ông để đi tìm những kết quả
Phạm Minh Hoàng
mới. Bốn tập đầu của bộ Éléments dành cho Hình học. Trong tập 1, Euclide đưa ra những khái niệm nguyên thuỷ như điểm, đường thẳng, mặt, vòng tròn, sự song song, trong đó có định đề đầu tiên về Hình học: qua hai điểm có một và chỉ một đường thẳng đi qua. Từ những khái niệm ban đầu ấy Euclide đã suy diễn ra nhiều kết quả về góc, về tam giác cân, tam giác đều, và ông đã chứng minh định lý Pythagore (Euclide ra đời sau Pythagore 239 năm). Trong tập 2, Euclide đã dùng Hình học để chứng minh một số kết quả của trường phái Pythagore mà ngày nay ta quen gọi là Đại số. Ví dụ (a+b)2 = a2 + 2ab + b2 .... Tích ab theo Euclide là diện tích hình chữ nhật mà chiều dài các cạnh là a và b. Trong tập 7 ông đưa ra một thuật toán mà người đời sai gọi là thuật toán Euclide, dùng để chứng tỏ hai số là nguyên tố cùng nhau. Trong tập 8 có định lý về phân tích một số nguyên ra thừa số nguyên tố, cách tính tổng các số hạng
67
Chương 3. Đồ thị ba chiều
của một cấp số nhân. Tập 9 có 36 mệnh đề nhưng nổi bật nhất vẫn là mệnh đề số 36 vì ở mệnh đề này ông chứng tỏ rằng một số có dạng 2n1 (2n 1) là số hoàn hảo[9 ] nếu như (2n 1) là số nguyên tố. Ngày nay người ta biết được rằng số hoàn hảo là số chẵn có dạng như Euclide đã tìm ra. Còn số hoàn hảo nào là số lẻ không thì đến nay vẫn chưa ai tìm ra. Ngay nhà Toán học vĩ đại của thế kỷ 18 (và có lẽ của mọi thế kỷ) là Euler cũng chỉ chứng minh rằng mọi số hoàn hảo
9
chẵn đều có dạng như Euclide đã tìm ra. Ngoài ra, ông còn dùng Toán để nghiên cứu Thiên văn, kết quả này được trình bày trong Phaenomena. Euclide cũng có những nghiên cứu về Quang học, và cả về âm nhạc nhưng đã bị thất lạc. Những tác phẩm của Euclide rất cơ bản, có giá trị không phải chỉ vì nội dung khoa học mà còn giá trị với hậu thế vì phương pháp nghiên cứu nữa.
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
68
Phạm Minh Hoàng
Chương4 Hình học giải tích Ở 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.
4.1 Tìm và vẽ tiếp tuyến chung của hai vòng tròn Để đơn giản vấn đề, ta giả sử rằng tâm hai vòng đều nằm trên trục Ox, một vòng có tâm nằm tại gốc tọa độ. Gọi A là vòng tròn tâm A(0, 0), bán kính a; B là vòng tròn tâm B(e, 0), bán kính b, (a b) và X(x, 0) là giao điểm của tiếp tuyến và trục Ox. Ta được: a x = - Nếu x e, trường hợp tiếp tuyến chéo, ta có ex b x a - Nếu x ¡ e, trường hợp tiếp tuyến cùng phía trục hoành, ta có = xe b Ở đây ta chỉ tìm một tiếp tuyến chéo, các tiếp tuyến khác được suy ra dễ dàng. > x/(e-x)=a/b; a x = ex b
Giải phương trình theo x, và gán kết quả cho một hàm. Hàm này sẽ tính hoành độ của X theo a, b, e: > u:=unapply(solve(%,x),a(a,b,e)); 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
.B
.X
. . 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; 1 ea ? 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
a2
ea 2 + b + a
a a2
ea 2 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
70
Phạm Minh Hoàng
4.2. Diện tích phần giao của hai vòng tròn
4.2 Diện tích phần giao của hai vòng tròn Trong hệ tọa độ xOy, cho vòng tròn (C1 ) tâm O, bán kính R và (C2 ) bán kính r và có tâm D ở tọa độ [R, 0]. Tính r sao cho diện tích phần giao của 2 vòng tròn bằng một nửa diện tích của (C1 ). Với những điểm xác định như trong hình 4.2 ta được: .y
.A
.O .
.C .U
.(C2 )
..D
.x
.B
.(C1 ) 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. > p:=xˆ2+yˆ2=Rˆ2, q:=(x-R)ˆ2+yˆ2=rˆ2; > isolate(p,yˆ2);isolate(q,yˆ2); " " p := x2 + y 2 = R2 y 2 = R 2 x2 2 2 2 q := (x R) + y = r y 2 = r2 (x R)2
Hoành độ của U là: > u:solve(rhs(%)=rhs(%%),x); 1 r2 + 2R2 u := 2 R
Và hàm số của (C1 ) và (C2 ) là: > 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!): Phạm Minh Hoàng
71
Chương 4. Hình học giải tích c
(
lim(rÑ2R) arctan
r2 (4R2 r2 ) ) R2 2 4R r2
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 S:=subs(r=k*R,%); c c ( ) 1 2 1 1 1 2 2 S := k R %1 4 arcsin( k R)R + 2kR π 4 2 k 2 R2 k 2 R2 ( )) ( ? 2 2 2 ? 2 1 1 R (k R 2R2 ) 4 2 2 2 3 2R R π + %1k R 2%1R + 4R arcsin 4R 2 R %=
a
k2(4R2 + k2R2)
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 1 2 1 1 2 2 2 S := R 2k arcsin( k) + k π + π k 4 k + 2 arcsin(1 + k ) 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 1 trong phương trình S = πR2 ( vì R 0 ta đơn giản cho R2 ): 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]
72
Phạm Minh Hoàng
4.3. Quỹ tích 1
4.3 Quỹ tích 1 Cho một hypperbol vuông (H), gọi P (a) là tiếp tuyến của (H) tại a, và Q(a) là đường thẳng qua gốc tọa độ và thẳng góc với tiếp tuyến P (a) tại M . Tìm quỹ tích của M khi a chạy trên (H). Gọi f (x), p(a), q(a) lần lượt là phương trình của (H), P (a) và Q(a). Ta có: > f:=x¡1/x;with(plots): 1 f := x ÞÑ x > p:=a¡y-f(a)=D(f)(a)*(x-a);
p := a ÞÑ y f (a) = D(f )(a)(x a)
> q:=a¡y+x/D(f)(a); x q := a ÞÑ y + D(f )(a)
Để tính tọa độ của M , giải hệ p(a), q(a) và gán kết quả vào hai biến xm, ym: > s:=solve({p(a),q(a)},{x,y}); * " a3 a ,y = 2 4 s := x = 2 4 a +1 a +1 > xm:=unapply(rhs(op(select(has,s,x))),a); > ym:=unapply(rhs(op(select(has,s,y))),a);
Để vẽ hình tĩnh, ta chọn a = 2. Riêng hình động quỹ tích, ta cho a chạy từ 0 đến 2, nghĩa là quét hết (H). Sau khi xác định được tọa độ của M theo a, cách vẽ đơn giản nhất là tham số. Các lệnh sau vẽ hình tĩnh (hình 4.3) và động của M . > h1:=plot([xm(a),ym(a),a=0..2*Pi]): > h2:=implicitplot({p(2),q(2),x*y=1},x=0..4,y=0..3): > display(h1,h2,scaling=constrained);
> g1:=t¡plot([xm(a),ym(a),a=0..2*t]):
> g2:=t¡implicitplot({p(t),q(t),x*y=1},x=0..4,y=0..3): > seq(display([g1(t/8),g2(t/8)]),t=1..trunc(15*Pi)): Phạm Minh Hoàng
73
Chương 4. Hình học giải tích
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]. 1 B B Diện tích của một chiếc lá là: x(t) y(t) y(t) x(t)dt 2 Bt Bt 2π »
0
> int(xm(a)*D(ym)(a)-ym(a)*D(xm)(a),a=0..2*Pi)/2; π4 16 1 + 16π 4
4.4 Quỹ tích 2 Trong hệ tọa độ trực chuẩn Oxy cho hai điểm A[0, 0], B[1, 0]. Gọi M là một điểm chạy trên đường tròn tâm A bán kính AB = 1. Tìm quỹ tích của C là tâm vòng tròn nội tiếp tam giác ABM . Gọi C là giao điểm của các đường phân giác trong tam giác ABM . Muốn tìm quỹ tích của C ta áp dụng một phương pháp "vô song" của Maple: Khai báo điểm M dưới dạng tham số. 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. Sau cùng vẽ đồ thị hàm số tham số.
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 a
74
a21
+
b21
+
a2 x + b2 y + c2 a
a22 + b22
=0 Phạm Minh Hoàng
4.4. Quỹ tích 2
.y .M1
.A .
.C1
.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 geometry 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)); (u) + y(1 + cos(u)) + sin(u) x sin(u) + y cos(u) + x sin a a = 0[4 ] 2 2 (sin(u)) + (cos(u)) (sin(u))2 + (1 + 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
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 4
Phạm Minh Hoàng
75
Chương 4. Hình học giải tích
> f2:=unapply(%,u):
Đồ thị của tam giác và hai phân giác tương ứng với u =
4π [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) a a s := x = ,y = 2 2 cos(u) + 2 2 2 cos(u) + 2
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.
76
Phạm Minh Hoàng
4.5. Quỹ tích 3
Hình 4.5:
4.5 Quỹ tích 3 Trong tọa độ trực chuẩn Oxy cho hai điểm A[0, 0], B[1, 0] gọi M là điểm chạy trên vòng tròn tâm A bán kính AB. Tìm quỹ tích trực tâm H của tam giác ABC.
Cách giải thứ nhất Khác với quỹ tích tâm vòng tròn nội tiếp ở phần [ trên, quỹ ] tích của trực tâm - là giao điểm π π của 3 đường cao có phần phức tạp hơn - vì khi u P , , nghĩa là M nằm trên phần tư thứ 2 2 hai và ba của vòng tròn, thì trực tâm H nằm ngoài tam giác và đôi khi nằm ngoài vòng tròn. Hơn nữa khi |u| π thì H chạy ra vô cùng, và việc này sẽ gây khó khăn khi vẽ hình động. { Đặt u = M AB, Q là hình chiếu của A xuống M B. Tọa độ của M, Q, H là:
Phạm Minh Hoàng
77
Chương 4. Hình học giải tích
.y .M1
.M2
.
.H1
.B .x
.A
.H2 Hình 4.6:
$ !
M
cos u sin u
' &
Q
' %
1 + cos u 2 1 + cos u u tan( ) 2 2
"
H
cos u u cos u tan( ) 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)]:
Để dễ nhìn, ta vẽ tam giác [ ABM], hình tròn bằng nét liền. Các đường cao bằng nét đứt π π đ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π]. 78
Phạm Minh Hoàng
4.5. Quỹ tích 3
> 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]); Phạm Minh Hoàng
79
Chương 4. Hình học giải tích
[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 3π [ , 2pi] và u P [π, 2π]. Trong trường hợp thứ nhất (cos(u) ¡ 0, H nằm trong tam giác ABM ) 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":
Hình 4.8: Quỹ tích của H với các vị trí M
- M sẽ cahỵ đều trong khoảng [0, 6
5π ], hay [0 Ñ 2.24] 7
Đường x = 1 có thể được vẽ bằng lệnh plot([-1,t,t=-1..0],color=black):
80
Phạm Minh Hoàng
4.6. Giới hạn của Maple
- Tại 2.24, M sẽ dừng ít lâu rồi nhảy sang
5π π + 7 2
3.82 Sự kiện dừng ít lâu đơn thuần là
tránh thay đổi đột ngột. - Tại 3.82, M sẽ ừng ít lâu rồi chạy đều về 2π. Tóm lại, các giá trị của u là (nhân lê với 10 vì vận tốc giảm đi 10 lần): > p:=seq(i,i=0..23),23,23,23,4,40,40,seq(i,i=40..63); > s:=seq(display([gr(0,t/10),f(t/10),th(t/10)]),t=p): > display(s,insequence=true,scaling=constrained);
Cách giải thứ hai Đây đúng ra chỉ là một cách dùng các lệnh trong geometry để tìm trước tiếp tọa độ của các điểm. Tuy nhiên, điều phức tạp nhất là phải dùng các điều kiện assume. Và các điều kiện này chỉ có thể biết được khi Maple từ chối một mệnh lệnh nào đó. Ta bắt buộc phải lùi lại để thức hiện assume trước khi đi tiếp: Khai báo các điểm A, B, M , tam giác ABC và trực tâm H. Tọa độ M, H được gán vào cùng hàm cm(u),ch(u) như trên: > with(geometry): > point(A,0,0):point(M,cos(u),sin(u)):point(B,1,0): > cm:=unapply(coordinates(M),u); > assume(sin(u)0):triangle(T,[A,M,B]):orthocenter(H,T): > ch:=unapply(coordinates(H),u);
Khai báo điểm Q, tọa độ Q được gán vào cùng hàm cq(u) như trên: > assume((1-cos(u))ˆ2+sin(u)ˆ20): > altitude(hA,A,T,Q):cq:=unapply(coordinates(Q),u);
Các hàm cm(u),ch(u),cq(u) đã được thay đổi, ta có thể tiếp tục dùng lại các lệnh trong mục 4.5.1, và phần tiếp theo cũng giống như cách giải thứ nhất: > display(gr1,gr2);display(gr3,gr4);
4.6 Giới hạn của Maple Một thí dụ thuần hình thức Chứng minh hai vòng tròn có phương trình p1 và p2 sau đây trực giao: " p1 = x2 + y 2 2mx 2ny m2 + n2 p2 = x2 + y2 2nx + 2my + m2 n2
Khai báo hai phương trình dưới dạng hàm theo (m, n):
> p1:=(m,n)¡xˆ2+yˆ2-2*m*x-2*n*y-mˆ2+nˆ2; > p2:=(m,n)¡xˆ2+yˆ2-2*n*x+2*m*y+mˆ2-nˆ2;
Nhập thư viện geometry và đặt ngay câu hỏi với Maple: > with(geometry): EnavHorrzontalName:= x:
EnvVerticalName:= y:
> AreOrthogonal(circle(k,p1(m,n)),circle(h,p2(m,n))); Phạm Minh Hoàng
81
Chương 4. Hình học giải tích circle: "hint: 2*mˆ2 must be positive" Error, (in circle) not enough infomation
Maple đòi m phải là số thức mới có thể trả lời. > assume(m>0,n>0): > AreOrthogonal(circle(k,p1(m,n)),circle(h,p2(m,n))); true
Câu trả lời ngắn gọn là trực giao. Nhưng ta có thể "tự làm khó mình" bằng hai phương pháp khác để qua đó thấy được khả năng tính toán hình thức (cũng như yếu điểm) của Maple:
Bằng tích vô hướng Gọi K, H lần lượt là tâm của p1 , p2 . Giả sử hai vòng tròn này cắt nhau tai P, Q. Nếu chúng trực giao, ta phải có [Hình 4.9 (a)]: HP
ÝÑ ÝKP ÝÑ = 0 K KP ðñ ÝHP
Tọa độ của H, K và bán kính của p1 , p2 :
?
> 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 (m + n)mn s := ty = m + n, x = 0u, y = ,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
Bằng hàng điểm điều hòa Đường thẳng KH đi qua hai tâm cắt p1 tại hai điểm A, B, và cắt p2 ở C, F . Hai vòng tròn trên trực giao nếu A, B, C, F là một hàng điểm điều hòa hay: BF AF = BC AC
ðñ BF AC = AF BC
(4.6.1)
Trước tiên khai báo đường thẳng KH: > line(kh,[center(k),center(h)]): > KH:=Equation(kh);
KH := x(n + m) + y(m + n) m2 n2 = 0
Giao điểm của KH và p1 : 82
Phạm Minh Hoàng
4.6. Giới hạn của Maple
.P .K.
.A
.H .C
.F
.B .(p2)
.Q .(p1)
Hình 4.9: Vòng tròn trực giao
> solve({KH,p1(m,n)},{x,y}); " * m%1 + n%1 m2 n2 y = %1, x = m+n 2 2 %1 = RootOf ((m + n ) Z 2 + (2m2 n 2n3 ) Z m4 + n4 2m3 n)
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 x= m+n
m2
) n2
?
+
1 %1 ,y = 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))): Phạm Minh Hoàng
83
Chương 4. Hình học giải tích
.P
.K .
.A
.H .C
.F
.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" Error, (in 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.
Một khúc mắc... Nói chung Maple là một công cụ tốt để học hình học giải tích. Tuy nhiên, nói đến Maple là phải nghĩ ngay đến khía cạnh "hình thức", và đó là khúc mắt lớn nhất khi áp dụng vào hình học. Ta vừa thấy trong bài toán vòng tròn trực giao cũng như các bài toán dùng geometry trong phần quỹ tích: Maple đặt ra vô số điều kiện để bắt phải lùi trở lại khai báo các lệnh assume. Càng đi sâu vào vấn đề, các assume càng phức tạp hơn. Có những lần chúng ta "luồn lách" được. Nhưng có những lần khác thì... thì bế tắc. Ta thử xem thí dụ nhỏ sau: Trong mặt phẳng cho 4 điểm A, B, C, E, tìm giao điểm của hai đường thẳng AB, CE: 84
Phạm Minh Hoàng
4.6. Giới hạn của Maple
> 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); [ ] a 1 1 1 1 xa + xb , ya + yb , (xa xb )2 + (ya + yb )2 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 x[a]
x[b] ¡ 0y[a] y[b] ¡ 0
Error, (in geometry/checkline) not enough information: the line is not defined
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(xaxb,yayb,xcxe,ycye): > 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
ya2 2ya yb + yb2 + x2a 2xa xb + x2b
Maple đòi cho bằng được A B mới tính phương trình AB nhưng lại không đặt điều gì với C khi tính khoảng cách từ C tới AB, vì khi A B phương trình không có nghĩa (vế phải bằng không), trong khi nếu C P AB thì khoảng cách C tới AB bằng không. Nhưng nếu bây giờ ta tìm giao điểm của AB và CE: > intersection(K,AB,CE);
Maple lại cho ra một thông báo đòi (ya yb )(xc + xe ) (yc ye )(xa + xb ) 0. Nhưng bây giờ thì assume không giải quyết được gì cả. Tóm lại, trong hình học, chúng ta bắt buộc phải khai báo các tọa độ như một hằng số. Khi đó tất cả sẽ trở nên đơn giản như thí dụ (phức tạp) sau.
Một thí dụ điển hình Trong tọa độ trực chuẩn Oxy, cho ba điểm A[3, 3], B[7, 6], C[1, 3]. Xác định phương trình đường Euler[7 ], vòng tròn nội tiếp và ngoại tiếp của tam giác ABC. > restart:with(geometry): > EnvHorizontalName:=x:
EnvVerticalName:=y:
> point(A,-3,3):point(B,7,6):point(C,1,-3): 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
Phạm Minh Hoàng
85
Chương 4. Hình học giải tích
> midpoint(X,A,B): X=coordinates(X);distance(A,B); [ ] 9 ? X = 2, , 109 2 > line(AB,[A,B]),[Equation(AB)];
21 + x + 8y = 0
z Khai báo tam giác ABC, tính diện tích của nó và BAC:
> triangle(ABC,[A,B,C]):S[ABC]=area(ABC); > FindAngle(line(AB,[A,B]),line(BC,[B,C])): > %=evalf(convert(%,degrees),3); S[ABC] = 36 ( ) 24 arctan = 39.6degrees 29
Khai báo các đường trung tuyến, trung trực và đường cao của tam giác ABC: > median(mA,A,ABC):median(mB,B,ABC):median(mC,C,ABC): > PerpenBisector(qA,A,B): PerpenBisector(qB,B,C): PerpenBisector(qC,C,A): > altitude(hA,A,ABC):altitude(hB,B,ABC):altitude(hC,C,ABC):
Khai báo như trên ta được mA, qA, hA lần lượt là trung tuyến, trung trực và đường cao xuất phát từ A. Phương trình của chúng là: > mA=Equation(mA),qA=Equation(qA),hA=Equation(hA); ( ) ( ) 33 3 67 mA = + x+7y = 0 , qA = +10x+3y = 0 , hA = (9 6x 9y = 0) 2 2 2
Tương tự với B và C, ta có mB, qB, hB và mC, qC, hC. Gọi M, H, Q lần lượt là trọng tâm, trực tâm và giao điểm của ba đường trung trực. Tọa độ của chúng là: > AreConcurrent(mA,mB,mC);intersection(M,mA,mC): > AreConcurrent(qA,qB,qC);intersection(Q,qA,qB): > AreConcurrent(hA,hB,hC);intersection(H,hA,hC): > M=coordinates(M),Q=coordinates(Q),H=coordinates(H); [ ] [ ] [ ] 5 21 29 1 7 M= ,2 ,Q = , ,H = , 3 8 12 4 6
Ba điểm này thẳng hàng và phương trình của đường Euler là: > AreCollinear(M,Q,H),eMH:=Equation(line(MH,[M,H])); 22 5 23 true, eM H := + x y = 0[8 ] 9 6 12
Tâm và phương trình vòng tròn nội tiếp: > incircle(vI,ABC): > combine(coordinates(center(vI)),radical):%=evalf(%,3); ? ? ] [ 7 13 + 109 ? 1, 3 ? = [1.0, 1.58] 5 13 + 109 > collect(combine(factor(Equation(vI)),radical),[x,y]); ( ) 1? 3? 107 x2 2x + y 2 + df rac473 + 1417 y 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))
86
Phạm Minh Hoàng
4.6. Giới hạn của Maple
Hình 4.11:
Tâm và phương trình vòng tròn ngoại tiếp: > circumcircle(vE,ABC): > coordinates(center(vE)): > %=evalf(%,3); [ ] 21 29 , = [2.62, 2.42] 8 12 > Equation(vE); 77 21 29 x2 + y2 x y = 0 4 4 6
Và hình vẽ tương ứng với các tính toán trên đây là: > Tr:=polygonplot([coordinates(A),coordinates(B),coordinates(C)], color=white,thickness=3): > gI:=implicitplot(Equation(vI),x=-4..9,y=-6..9): > gE:=implicitplot(Equation(vE),x=-4..9,y=-6..9): > MQH:=polygonplot([coordinates(M),coordinates(Q),coordinates(H)]); > EL:=implicitplot(eMH,x=-4..9,y=-6..9,linestyle=2): > display(Tr,gI,gE,EL,MQH,scaling=constrained);
Phạm Minh Hoàng
87
Chương 4. Hình học giải tích
4.7 Bài đọc thêm: Archimède Archimède sinh trưởng ở Syracuse, một đô thị lớn thời Hy Lạp cổ đại. Sử chép rằng ở ông có một thời lưu học ở Ai Cập, đặc biệt ở Alexandrie, và chính tại đây ông được gặp Connon, học trò của Euclide và Eratostène, Giám đốc Thư viện Alexamdrie nổi tiếng, nhờ đó mà Archimède tiếp cận được với những phát minh mới về Toán học và khoa học. Trở về quê hương, ông say sưa nghiên cứu, truyền thụ cho học trò những tri thức, phát minh vè Toán học, khoa học đã làm cho tên tuổi ông trở thành bất tử. Cuộc đời cũng như cái chết của ông đã trở thành huyền thoại được đời đời truyền tụng, thán phục và thương cảm. Vào năm 212 trước Công Nguyên, thành Syracuse bi quân La Mã vây hãm trong hai năm nhưng không tài nào hạ nổi vì Archimède đã giúp dân Syracuse sáng chế vũ khí giết giặc. Tướng La Mã là Marcellus đành cho quân vây thành chờ thời cơ. Lâu ngày, quân Hy Lạp mất cảnh giác. Nhân dịp lễ nữ thần Diane, quân La Mã lẻn được vào trong thành vì thế mà Syracuse thất thủ. Marcellus mến mộ tài Archimède đã ra lệnh cho quân lính không được chạm đến ông nhưng đã quá muộn, quân La Mã say sưa chém giết vì thế mà ông đã bị sát hại. Trong những huyền thoại về cuộc đời ông, thì có lẽ câu chuyện ông phát minh ra nguyên lý đầu tiên của Thủy tĩnh học là thú vị nhất. Tục truyền, vua Hiéron sai thợ kim hoàn làm một vương miện nhưng nhà vua nghi ngờ thợ kim hoàn ăn bớt vàng và thay bạc vào, bèn hỏi
88
ý kiếm Archimède làm sao xác định được mà không làm hỏng vương miện. Ông suy nghĩ mãi. Một hôm nhân ngâm mình tắm trong nước, ông thấy cơ thể như nhẹ đi, ông sung sướng hét to lên: Eurêka ! Eurêka !. Một lần khác, khi nghiên cứu về đòn bẩy, ông thấy có thể dùng một lực nhỏ để bẩy một vật nặng hơn gấp nhiều lần vì vậy ông nói vui: Hãy cho tôi một điểm tựa tôi sẽ bẩy được Quả Đất nên! Khi tim ra diện tích hình ellipse, ông dùng phương pháp chia ellipse ra thành rất nhiều tam giác có diện tích tăng theo cấp so nhân có công 1 bội là . Theo ngôn ngữ của chúng ta ngày 4 nay, Archimède đã tính tổng của một chuỗi hội tụ, một kỹ thuật tính toán kỳ lạ của nhân loại vào thời đó, tiền thân của phép tính tích phân. Sinh thời, ông thích thú với bài toán mà ông đã giải: "một hình cầu nội tiếp trong một hình viên trụ" và ông nói rằng: Mai kia, sau khi tôi qua đời, nên ghi hình ảnh bài toán này trên bia mộ tôi. Và người ta đã thực hiện đúng nguyên ước của ông. Chính nhờ đó mà hơn một trăm năm sau Cicéron đã tìm ra được ngôi mộ Archimède bị bỏ hoang theo năm tháng, gai mọc đầy và cỏ dại phủ kín!. Ông đã đẻ lại cho đời sau một gai tài vô giá về các phát minh khoa học thuộc các lĩnh vực Hình học phẳng, Hình học không gian, Số học, Cơ học, Thủy tĩnh học, Thiên văn học. Ngôn ngữ trình bày trong các công trình khoa học ấy thật mạch lạc, trong sáng, khiến ngày nay ai đọc cũng kinh ngạc.
Phạm Minh Hoàng
Chương5 Bài toán mô phỏng 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.
5.1 Cạnh tranh tay đôi Xem xét thương vụ của hai cửa hàng A và B thì người ta thấy rằng cứ sau mỗi tháng hoạt động có một lượng khách nhỏ từ A bỏ sang B và ngược lại một lượng nhỏ khác từ B chuyển sang A. Mô phỏng hóa lượng khách của A và B, biết rằng số khách lúc đầu của A là X và B là Y . Gọi (x, y) lần lượt là tỷ lệ khách ở lại A và B sau mỗi tháng. Ta có sau một tháng hoạt động: - số khách ở A là: xX + Y (1 y) - số khách ở B là: yY + X(1 x) Dưới dạng ma trận, với Si là số khách ở thời điểm i: [
] [ ] 1 y . X = MS 0 1x y Y 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.
Giải bằng hàm tổ hợp Từ phương trình (5.1), ta khai báo: g(u) = M u > g:=u¡evalm(M&*u):
Ta được g(g(u)) = g g(u) = (g @@2)(u). Gọi g(u) 4 lần để có tình trạng khách hàng sau 4 tháng hoạt động với u = S0 ta được: > transpose((g@@4)(S)):%=evalf(%,5); [ ] 3748 2813 , = [0.57125, 0.42857] 6561 6561
Gải bằng ma trận Cũng từ (5.1) bây giờ ta khai báo f (n) là hàm tích M n S, nghĩa là tình trạng của khách hàng sau n tháng hoạt động: > f := n¡ evalm((Mˆn)&*S):
Chúng ta tìm lại được kết quả như hàm số hợp: > f(1),f(2),transpose(evalf(f(4), 5)); [ ] [ ] 5/9 46/61 4/9 , 35/81 , [0.57125, 0.42875] > g1:=plot([[0,1/2],seq([i,f(i)[1,1]], i =1..6)],linestyle=1): > g2:=plot([[0,1/2],seq([i,f(i)[2,1]], i =1..6)],linestyle=4): > plots[display]([g1,g2]);
Lưu ý: f (0) không xác định: evalm(Mˆ0); sẽ cho ra 1. Kết quả là một số, và như thế khi nhân với vector S sẽ [ sai.]Vì thế thay vì tính chuỗi từ 0, ta phải tính từ 1 và "ghép" vào phía đầu 1 1 chuỗi giá trị S0 = , . 2 2 Chúng ta nhận thấy chỉ sau 3 hoặc 4 tháng hoạt động, lượng khách của A và B được coi như ổn định. (Đồ thị gạch đứt đoạn là của B). Phương pháp trên chúng ta đã tính trực tiếp M n với n được xác định trước. Trong trường hợp n là biến hình thức, chúng ta sẽ phải dùng hàm jordan để tính M n = P J n P 1 với J là ma trận đường chéo và P là ma trận chuyển cơ sở: > J:=jordan(M,P): Jn:=map(i¡iˆn,J); [ ] 1 0 Jn = 0 (2/9)n > evalm((P &* Jn * Pˆ(-1))&* S):
90
Phạm Minh Hoàng
5.1. Cạnh tranh tay đôi
Hình 5.1:
> f:=unapply(map(op,convert(%, listlist)), n); ] [ 1 2 n 3 1 2 n 4 ( ) , 7 + 14 ( 9 ) f := n ÞÑ 7 14 9
(5.1.2)
Ta cũng tìm lại được kết quả sau 4 tháng là: > f(4): % = evalf(%,5); ] [ 3748 2813 , = [0.57125, 0.42875] 6561 6561
Giải bằng hàm quy nạp rsolve Từ M chúng ta khai báo hàm quy nạp: > s:=u(n+1)=2*u(n)/3+4*v(n)/9, v(n+1)=u(n)/3+5*v(n)/9; $ 2 4 ' & u(n + 1) = u(n) + v(n) 3 9 s := 1 5 ' % v(n + 1) = u(n) + v(n) 3 9 > rsolve({s,u(0)=1/2, v(0)=1/2},{u,v}):
Ta sẽ tìm lại được kết quả như trong (5.2)
Biểu diễn trong không gian 3-D Một cách khác để thấy sự thay đổi lượng khách là vẽ đồ thị trong không gian 3 chiều. Trong trường hợp này ta dùng tính toán hình thức. Để dễ nhìn, khối lượng ban đầu của khách bây giờ là [1, 1] và ta tính sau 3 tháng hoạt động: > M:=matrix(2,2,[x,1-y,1-x,y]): S:=matrix(2,1,[1,1]): > M=eval(M), 'S'=eval(S); [ ] [ ] x y ,S = 1 M = 1x 1 y 1 > P:=map(simplify@expand, f(3)); Phạm Minh Hoàng
91
Chương 5. Bài toán mô phỏng
Hình 5.2: Thương vụ với đồ thị 3-D [
] 3 + x xy 2 + 1 x2 + y 2 y yx2 y 3 x P = 2 x + 1 y 2 x3 x + xy 2 + y yx2 + y 3 > 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.
5.2 Kinh tế ASEAN [1 ] Bây giờ là một trường hợp tương tự nhưng phức tạp hơn. Số cửa hàng bây giờ là 5 và mang tên A, B, C, D, E. Tỷ lệ khách hàng ở lại và bỏ đi sang các cửa hàng bên cạnh được xác định bằng bảng dưới đây. Giá trị thực được nhân lên với 10. Giả sử 1 số khách ban đâu bằng cho 5 của hàng: 5 . A B C D E
°
A . 3 2 4 2 11
B 3 . 1 1 2 7
C 1 1 . 1 2 5
D 3 2 3 . 3 11
E 1 2 1 3 . 7
°
8 8 7 9 9
Xét hàng thứ nhất, tỉ lệ khách từ A bỏ sang (B, C, D, E) lần lượt là (3, 1, 3, 1). Xét cột thứ nhất, tỉ lệ khách từ (B, C, D, E) bỏ sang A lần lượt là (3, 2, 4, 2).
Như thế, tỉ số giữa tổng khách ở lại trên
1
Đây là một bài toán cụ thể do nhà toán học Wassily Leontief, giải Nobel kinh tế năm 1973 đặt ra để mô phỏng tình trạng của 5 nền công nghiệp của Mỹ. Ta cũng có thể ứng dụng vào trong trường hợp của một tập thể như khối các nước ASEAN
92
Phạm Minh Hoàng
5.3. Lãi suất ngân hàng
tổng số khách đi của (A, B, C, D, E) là
11 7 5 11 7 , , , , . 8 8 7 9 9
Tỉ lệ khách ở lại A là 10 (3 + 1 + 3 + 1) = 2, và tính tiếp tục với (B, C, D, E). ta có ma trận chuyển của hệ là: > M:=matrix(5,5,[2,3,2,4,2,3,2,1,1,2,1,1,3,1,2,3,2,3,1,3,1,2,1,3,1]): > M:=evalm(M)/10:S:=matrix(5,1,1)/5:'M'=eval(M),'S'=eval(S); 2 3 2 4 2 1 3 2 1 1 1 1 1 M= 1 1 3 1 2 , S = 15 1 10 3 2 3 1 3 1 1 2 1 3 1 1
Tương tự như trường hợp hai cửa hàng, sau 3 tháng hoạt động, số khách của năm cửa hàng đều ổn định: > evalf(transpose(f(3))); [0.2654, 0.1884, 0.1462, 0.2346, 0.1654]
Sau 3 tháng hoạt dộng, A có số khách cao nhất, điều này cũng dễ hiểu, vì tỉ số của tổng số 11 khách ở trên đi của A lớn nhất ( ). 8
5.3 Lãi suất ngân hàng Một khách hàng vay tiền với lãi xuất r%/năm. Gọi P là số tiền vay, m là số tiền trả hàng tháng. Hãy mô phỏng bài toán này. Mục đích của bài toán trên là đi tìm số tiền còn phải trả ở năm thứ n và biện luận trên lãi xuất r, trên thời gian trả . . . Trước tiên ta lí luận bài toán trên như sau: Gọi Xn là số tiền còn phải trả vào năm n.
rP 12m = P (1 r) 12m Sau năm thứ hai, X2 = X1 (1 r) 12m Và cứ thế tiếp tục, ở năm n ta phải sùng kết quả của năm n 1.
Sau năm thứ nhất, X1 = P
Để giải bài toán này ta lần lượt dùng 3 phương pháp:
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à: Phạm Minh Hoàng
93
Chương 5. Bài toán mô phỏng
> 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
Dãy truy hồi (quy nạp) Cùng một lí luận trên và đặt X(n) là số tiền phải trả ở năm n, ta được: > X(n+1)=X(n)*(1+r)-12*m;
X(n + 1) = X(n)(1 + r) 12m
Dùng hàm rsolve để tìm ra công thức quy nạp, với điều kiện ban đầu (X(0) = P :) rsolve({eq,X(0) = P},X(n)); m(1 + r)n m P (1 + r)n 12 + 12 r r
(5.3.1)
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.
94
Phạm Minh Hoàng
5.3. Lãi suất ngân hàng
Phương trình vi phân Cả 3 cách làm trên đều có đặc điểm chung đó là những phương pháp rời rạc. Chúng ta tính giá trị từng năm một và để thấy được tiến trình của thời gian, chỉ cần vẽ đồ thị, và đồ thị được nối từng điểm một. Gọi un là số tiền phải trả ở cuối năm thứ n, công thức chung cho 3 trường hợp trên là: un = P (1 r)n . Và với những dữ kiện đã cho ở trên, đồ thị tiền phải trả theo thời gian là: > f1:=i¡50000*(1+0.11)ˆi: > p1:=(f1(i))$i=1..10: > f1(i)/12 $i=1..10: > pp:=seq([i,f1(i)],i=1..10): > g1:=plot([pp],t=1..10,symbol=box,style=point,symbolsize=18): > g1b:=plot([pp],t=1..10): > display(g1,g1b);
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: Phạm Minh Hoàng
95
Chương 5. Bài toán mô phỏng
> 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(xi-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; d eq3 := u(t) = ru(t) 12m 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.
96
Phạm Minh Hoàng
5.4. Nuôi tằm
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)(!).
5.4 Nuôi tằm [3 ] Nghiên cứu sự sinh sản của tằm, người ta thấy một con tằm trưởng thành sẽ đẻ một trăm trứng mỗi tháng. Trong số này chỉ có 10% sống sót qua giai đoạn ấu trùng. 20% số ấu trùng này sẽ nở thành nhộng và chỉ có 30% số nhộng này lớn thành tằm. Giả sử rằng mỗi giai đoạn sẽ kéo dài một tháng và 40% số tằm trưởng thành 1 tháng tuổi sẽ sống cho đến tháng tiếp theo và có khả năng sinh sản. Kế hoạch hóa sự sinh sản của tằm, biết lúc đầu có u = 10 con. Gọi wn , xn , yn , zn là số lượng của trứng, ấu trùng, nhộng và tằm ở tháng thứ n. Ta có: w1 = 100z0 , x1 = 0.1w0 , y1 = 0.2x0 , z1 = 0.3y0 + 0.4w0
Hoặc dưới dạng ma trận:
] 0 0 0 100 [w0 ] w1 0.1 0 0 0 x0 = M.A 1 A1 = x 0 y0 y1 = 0 0.2 0 0 z0 z1 0 0 0.3 0.4 [
M là ma trận chuyển từ tháng này qua tháng kế tiếp. Vậy: A2 = M A1 = M 2 A0 , A3 = M A2 = M 3 A0 , . . . , An = M An1 = M n A0
(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 làm thừa số chung như sau:
1 10
> 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 0 1000 1 1 0 0 0 , 0 0 0 10 0 2 0 10 0 0 3 4
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]
Phạm Minh Hoàng
97
Chương 5. Bài toán mô phỏng
> plot([seq([i,g(i,80)[1,4]],i=1..40)]); [hình 5.5(b)]
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)]));
98
Phạm Minh Hoàng
5.4. Nuôi tằ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 0.11 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ệ Phạm Minh Hoàng
99
Chương 5. Bài toán mô phỏng
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ó p 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 50 p+1 và mv( ) ¡ 1. 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 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 i0),[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.
100
Phạm Minh Hoàng
5.4. Nuôi tằm
> 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 là:[ ] 4
> 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
Phạm Minh Hoàng
101
Chương 5. Bài toán mô phỏng
5.5 Bồn khuấy nước đều Bài toán dưới đây thuộc loại kinh điển của phương trình vi phân. Đây là một trong các thí dụ khá cụ thể như sự trao đổi nhiệt lượng, sự rơi tự do, sự gia tăng dân số. . . trong đó gia số của đại lượng tỉ lệ với hàm muốn tìm: ∆x(t) = kx(t). 1 Cho một bồn nước chứa u lít nước (trong). Người ta đổ vào bồn một dung dịch ⃝ chứa p gram muối trong 1 lit nước với vận tốc trung bình là alít/phút và khuấy đều. Giả sử đáy hồ có một vòi thoát nước cũng với vận tốc a. Hổi trong bao lâu nồng độ muối trong hồ đạt mức độ k gr/lít? 2 Cùng một câu hỏi nhưng giả sử bây giờ chúng ta có hai hồ nước A và B. Hồ A ⃝ chứa 100 lít nước trong, hồ B chứa 100 lít nước hòa tan với 200 kg muối. Lượng muối đổ vào A là 12 kg/phút. Các dữ kiện khác được trình bày như trong hình 5.7. .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; d a x(t) = pa x(t) 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);
102
Phạm Minh Hoàng
5.6. Bài toán cân bằng môi sinh
limtÑ8 pu(1 + e
at 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); ( ) u pk ss := ln 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; $ 1 7 ' d & x(t) = 12 + y(t) x(t) dt 100 100 sys = 3 3 ' d % y(t) = x(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]);
5.6 Bài toán cân bằng môi sinh Quan sát sự tăng trưởng của rắn và chuột thì người ta thấy: Nếu chuột sinh sản quá nhiều thì có hại cho canh nông. Phải có một lượng rắn vừa đử để tiêu diệt chuột. Nhưng nếu không có con chuột nào thì rắn cũng chết vì không có thức ăn. Câu hỏi là phải duy trì lượng rắn và chuột như thế nào để có được sự cân bằng môi sinh. Bài toán được mô phỏng như sau. Gọi: x(t), y(t) là số lượng rắn và chuột. a là tỷ lệ suy giảm số lượng rắn nếu không có chuột. c là tỷ lệ gia tăng số lượng chuột nếu không có rắn. Phạm Minh Hoàng
103
Chương 5. Bài toán mô phỏng
1 và (b) trường hợp ⃝ 2 Hình 5.8: Đường biểu diễn của lượng muốn (a) trường hợp ⃝
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. d là xác suất chuột sống khi gặp rắn (!)
Phương trình của bài toán này là: > eq1:=diff(x(t),t)=(-a+b*y(t))*x(t); > eq2:=diff(y(t),t)=(c-d*x(t))*y(t); $ d ' & eq1 := x(t) = (a + by(t))x(t) dt d ' % eq2 := y(t) = (c dx(t))y(t) dt
Áp dụng các dữ kiện thích ứng: > a:=1:b:=1/100:c:=2:d:=2/25:
Ta thấy khi không có rắn x = 0 ñ y 1 = 2y ñ y(t) = Ae2t , số chuột sẽ tăng lên theo hàm mũ và khi đó sẽ dẫn tới việc bùng nổ dân số. Và khi không còn chuột y = 0 ñ x1 = x ñ x(t) = Bet , số rắn sẽ giảm một cách nhanh chóng. Trước tiên với 4 dữ kiện a, b, c, d chúng ta cũng đã có thể tìm ra một trạng thái ổn định bằng " (a + by(t))x(t) = 0 cách giải hệ phương trình: (c dx(t))y(t) =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,
104
Phạm Minh Hoàng
5.7. S.A.R.S
[[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 kéo dài nhưng không dẫn tới chết người. 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
Giải với các đại lượng rời rạc Trong bài toán này, vấn đề nằm ở sự kiện số lần tiếp xúc giữa người đã nhiếm với người chưa nhiễm. Để mô phỏng sự kiện này ta có thể lí luận rằng việc này chỉ xảy ra khi cả hai nhóm 5
Chủ đề trích từ [26]
Phạm Minh Hoàng
105
Chương 5. Bài toán mô phỏng
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 Qn+1 = Qn + aPn Qn
(5.7.1)
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: n là số vòng lặp (ở đây là số ngày). Chúng ta chạy chương trình với: 1 P0 = 999, Q0 = 1, a = , và 16 ngày. 100 > prg1(99,1,0.01,16):
Tiếp theo chúng ta khai báo tiếp các lệnh cần thiết để vẽ đồ thị. Để nêu bật tính cách rời rạc của các biến, chúng ta sẽ in ra các đường biểu diễn bằng các chấm và nối chúng với nhau: > gP:=seq([i,lP[i]],i=1..16):gQ:=seq([i,lQ[i]],i=1..16): > gP1:=plot([gP],symbol=box,style=point):gP2:=plot([gP]): > gQ1:=plot([gQ],symbol=cross,style=point):gQ2:=plot([gQ]): > display(gP1,gP2,gQ1,gQ2,tickmarks=[3,3]); 1 Quan sát đồ thị hình 5.10(a) thì rất đơn giản. Số người nhiễm ngày càng tăng với tỉ lệ 1000 , chỉ 13 ngày là tất cả cộng đồng bị nhiễm. Mặt khác, khi cộng các phương trình của (5.6), ta luôn có Q(t) + P (t) = 1000 và có thể kiểm chứng:
> seq(map(round,[lP[i],lQ[i],lP[i]+lQ[i]]),i=5..13); [968, 32, 1000], [937, 63, 1000], [878, 122, 1000], [771, 229, 1000],
106
Phạm Minh Hoàng
5.7. S.A.R.S
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 Qn+1 = Qn + aPn Qn bQn Rn+1 = Rn + bQn
(5.7.2)
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: Chúng ta chọn a = .001, b = .1 và thực hiện 20 vòng lặp: > prg2(999,1,0,.001,.1,20): > gP:=seq([i,lP[i]],i=1..20): > gQ:=seq([i,lQ[i]],i=1..20): Phạm Minh Hoàng
107
Chương 5. Bài toán mô phỏng
> 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.
Giải với các đại lượng liên tục Với mô hình liên tục, P (t) là số người chưa nhiếm và Q(t) là số người đã bị nhiễm ở thời điểm t. Chúng ta sẽ kết luận rằng tốc độ lan truyền tỷ lệ với số lần tiếp xúc a giữa P (t) và Q(t). Xét thêm một nhận định bổ sung là mỗi ngày có một tỷ lệ không đổi b của những người đã nhiễm sẽ khỏi bệnh (và lại có thể bị nhiễm hoặc miễn dịch). Số người lhoir và miễn dịch là R(t). Bài toán này chính là hệ (5.7) với các đại lượng liên tục: $ ' ' ' ' & ' ' ' ' %
d P (t) = aP (t)Q(t) dt d Q(t) = aP (t)Q(t) bQ(t) dt d R(t) = bQ(t) dt
(5.7.3)
Bài toán dĩ nhiên không có lời giải giải tích: > dsolve({eq1,eq2,eq3,P(0)=99,Q(0)=1,R(0)=0},{P(t),Q(t),R(t)});
Bắt buộc phải giải bằng số, ta nhập các dữ kiện ban đầu. Giả sử tỷ lệ gặp nhau trong cộng 1 1 đồng là a = và tỷ lệ khỏi bệnh là b = . Ta giải và gán lời giải vào biến sol: 1000 10 > a:=0.001:b:=0.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);
Theo dự tính thì chúng ta sẽ thay đổi các giá trị của a, b cũng như sẽ khai triển bài toán này về các dạng phức tạp hơn, và mỗi lần tính toán chứng ta sẽ xuất ra các kết quả dưới dạng đồ thị hoặc bảng số. Vì thế cách hay nhất là thiết lập các hàm để giải quyết những công việc sẽ lặp đi lặp lại nhiều lần. Trước tiên chúng ta khai báo hàm gr, hàm Maple này nhận 3 biến x, u, v với x là tên của hàm số muốn in, u là giá trị tối đa theo hoành độ và v là nét in:
> gr:=(x,u,v) ¡plot(seq([i,eval(x(t),sol(i/1))],i=0..u),linestype=v):
Hàm Maple thứ hai dùng để in ra mẫu tự tượng trưng cho hàm trên đồ thị: > tx:=(x,y,a)¡textplot([x,y,a]):
> display([gr(P,18,1),gr(Q,18,3),gr(R,18,4), tx(5,1000,P),tx(12,670,Q),tx(17,650,R)],tickmarks=[3,3]);
Xem hình 5.11(a) thì ta tìm lại được kết quả cùng 5.10(b). Ta thiết lập một hàm gt để trích ra các giá trị của P, Q, R từ hàm sol. Hàm gt nhận hai biến: x là tên của hàm và k là giá trị của thời điểm (hoành độ) gt nhận tối đa 5 chữ số: > gt:=(x,k)¡evalf(eval(x(t),sol(k)),5):
108
Phạm Minh Hoàng
5.7. S.A.R.S
Hình 5.11: Lây lan của bệnh dịch với b =
1 1 và b = 10 2
> for u from 9.0 to 10 by .2 do print (u,gt(P,u),gt(Q,u),gt(R,u),gt(P,u)+gt(Q,u)+gt(R,u)) od:
Bảng trên đây cho thấy giá trị của các số liệu ngày thứ 9 đến ngày thứ 10. Chúng ta có từ trái sang phải: ngày, P, Q, R và P + Q + R. Ta luôn có đại lượng sau cùng này bằng 1000 (hoặc xấp xỉ 1000 vì chỉ lấy hai số lẻ) vì đây là trường hợp cộng đồng khép kín. Mặt khác, vì đây là các đại lượng liên tục, nên chúng ta có thể có được các giá trị nằm trong khoảng [9, 10]. 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 = cP (t), vậy với c là một hằng chủng là S(t), ta chọn một mô hình đơn giản nhất là 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. $ ' ' ' ' ' ' ' & ' ' ' ' ' ' ' %
d P (t) = aP (t)Q(t) cP (t) dt d Q(t) = aP (t)Q(t) bQ(t) dt d R(t) = bQ(t) dt d S(t) = cP (t) dt
Phạm Minh Hoàng
109
Chương 5. Bài toán mô phỏng
(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ẻ): ∼∼∼∼∼∼∼∼∼∼∼
> for u from 45 to 50 do print(u,gt(P,u),gt(Q,u),gt(R,u),gt(S,u), round(gt(P,u)+gt(Q,u)+gt(R,u)+gt(S,u))) od:
Bảng 5.4:
Hình 5.12: Lây lan của bệnh dịch trường hợp c) và d)
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ệ: $ ' ' ' ' & ' ' ' ' %
110
d P (t) = aP (t)Q(t) + f (P (t) + Q(t) + R(t)) gP (t) dt d Q(t) = aP (t)Q(t) bQ(t) gQ(t) dt d R(t) = bQ(t) gR(t) dt
(5.7.5) Phạm Minh Hoàng
5.7. S.A.R.S
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: ∼∼∼∼∼∼∼∼∼∼∼
> for u from 25 to 30 do print(u,gt(P,u),gt(Q,u),gt(R,u), round(gt(P,u)+gt(Q,u)+gt(R,u))) od:
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 đề.
Phạm Minh Hoàng
111
Chương 5. Bài toán mô phỏng
5.8 Bài đọc thêm: Eratosthene
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, Lập trình bằng Maple
Trong chương trình crible sau đây, để tiện lợi, mỗi khi tìm được một bội số của một phần tử, ta sẽ cho nó bằng 0. Kết quả sau cùng sẽ là những số khác 0. Sau khi nhập chương trình trang sau, ata có các số nguyên tố nhỏ hơn 120 là: > crible(120);[6 ] [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113] 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 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 ? array. Sàng Eratosthene cũng 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) 6
112
Phạm Minh Hoàng
5.8. Bài đọc thêm: Eratosthene
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
> crible:=proc(n) local i,j,p,q,z,u: p:=[2,seq(3+2*i,i=0..n/2-1)];: u:=floor(evalf(sqrt(n))): for i to u do for j from i+1 to nops(p) do if p[j]>0 and p[i]>0 then if irem(p[j],p[i])=0 then p[j]:=0: fi:fi:od: od:select(i¡i>0,p); end:
Bảng 5.6:
Đo chu vi trái đất
Eratosthene quan sát vào "đúng ngọ", mặt trời chiếu thẳng xuống một cái giếng ở Syene không tạo ra bóng trên thành giếng. Điều đó có nghĩa là lúc ấy đường thẳng đi từ tâm trái đất, xuyên qua giếng sẽ đụng mặt trời. Vào cùng thời điểm ấy, mặt trời chiếu thẳng xuống mọt cái tháp ở thành phố Alexandrie và tạo một cái bóng trên mặt đất. Điều đó có nghĩa là mặt trời không nằm trên đường thẳng đi qua tháp. Bằng những tính toán hình học đơn giản, Eratosthene đã tính được góc hợp bởi tia sáng mặt trời và tháp là 7o 2[7 ] Eratosthene xấp xỉ 7o 2 tương đương với 787.5 km là khoảng cách đường chim bay từ Syene đến Alexandrie, vậy 360o tương đương với 360 787.5/7.2 = 39.375 km là chu vi trái đất. Một con số cực kỳ chính xác vào thời bấy giờ. Tuy nhiên đó là những tính toán và suy luận của chúng ta ở thế kỷ 21, vào thời Eratosthene chuyện không đơn giản như thế: 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.
Phạm Minh Hoàng
113
Chương 5. Bài toán mô phỏng
.Tháp Alexandrie
.87.5km .Giếng Syene
.Tr
ái
Đấ t
.7.2o
.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.
114
Phạm Minh Hoàng
Chương6 Bài toán kích thước hình xoay Đâ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.
6.1 Diện tích, thể tích ellipse và ellipsoid Diện tích một ellipse Cho một ellipse có bán kích theo (x, y) là (a, b). Phương trình ellipse có dạng: > eq:=xˆ2/aˆ2+yˆ2/bˆ2=1; x2 y 2 eq := 2 + 2 = 1 a b
Gọi y = f (x) là hàm số theo x rút ra từ phương trình ellipse: > s:=solve(eq,y); ? 2 2 ? 2 2 x + a b , x + a b s := 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 x + a b s1 := 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 = S
f (x)dx S
.y
.y
.x
.
.x
.
.x
.f (x) .dx
Hình 6.1: ellipse và ellipsoid > int(s1,x=0..a); ? 1 x lim b(x x2 + a2 + a2 arctan( ? )) 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 .
Thể tích một ellipsoid Bây giờ ta xét một ellipsoid được tạo thành bởi phép quay quanh trục Ox của ellipse trên. Ellipsoid vì thế sẽ có tiết diện tròn (nếu ta cắt thẳng góc với trục Ox) và có hình dáng giống một trái dưa Thái. Để tính thể tích, ta tưởng tượng cắt trái dưa thành nhiều lát thật nhỏ [Hình 6.1 (b)] mà ta có thể xem như là những hình trụ chiều dày dx, bán kính f (x). Thể tích của mỗi hình trụ sẽ là dV = πf (x)2 dx, và thể tích của trái dưa Thái sẽ là: »
V =
»
πf (x)2 dx
dV = 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.
116
Phạm Minh Hoàng
6.1. Diện tích, thể tích ellipse và ellipsoid (
) y2 2 = 1 2 a b > Int(Pi*rhs(%),y=-b..b):%=value(%); ) »b ( y2 2 4 π 1 2 a dy = πba2 b 3 x2
b
Và khi a = b = R, ellipsoid biến thành hình khối tròn như quả dưa hấu có thể tích là: > subs(a=R,b=R,rhs(%)); 4 3 πR 3
Diện tích một ellipsoid Khi ellipse xoay quanh Ox, diện tích bao quanh được tính bằng cong thức: dS = 2πf (x) 1 + [f 1 (x)]2 a
(6.1.2)
> dS := 2*Pi*s1*sqrt(1+diff(s1, x)ˆ2); 2π ? 2 dS := x + a2b a
?
d
1+
b2 x 2 (x2 + a2 )a2
? ? ? ? a2 + b2 + a2 ln( b a? b + a + b) a2 ln( b a b + a + b) a2 + b2
Và diện tích trái dưa Thái sẽ là:
πb(2b
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
u :=
2
2
2
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: Phạm Minh Hoàng
117
Chương 6. Bài toán kích thước hình xoay
> 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 (!): > s := simplify(int(%, x = -a .. a), symbolic) ?2 2) ( ?2 2 2 2πb ? 2 2 b a b + a arctan( a b 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à: »
»
πf (x)2 dx
dV =
V =
Hx
Hx
1 Ví dụ tích thể tích hình xoay f (x) = x3 , miền giới hạn x P [0, 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
2
1
1
1
1
1
(6.3.1)
Kể từ đây, để đơn giản ta không cần ghi đơn vị
118
Phạm Minh Hoàng
6.4. Trường hợp một hàm nội suy
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 )
π2
y
1 12 1 dy = 4( 3 ) π2( 3 ) 5
) = 0.9246
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.4 Trường hợp một hàm nội suy Cho hai dãy X, Y xác định hoành và tung độ của một đồ thị. Dùng phép nội suy để tính hàm và tính diện tích khi xoay quanh Ox: > X:=[seq(k$k=0..8)]: > Y:=[2,2,1.7,1,1.6,1.4,.8,.6,.6]:
Dùng nội suy spline chính xác hơn Lagrange: > h:=spline(X,Y,x,cubic): Phạm Minh Hoàng
119
Chương 6. Bài toán kích thước hình xoay
Hình 6.3: Đồ thị x = f 1 (y) và hình xoay quanh Oy
Thể tích của hình xoay quanh Ox là: > Digits:=4:Int(Pi*hˆ2,x=0..8):%=value(%); a
> plot(h,x=0..7,0..2.2,scaling=constrained,tickmarks=[2,2]); > tubeplot([x,0,0],x=0..7,radius=h,scaling=constrained, tubepoints=80,orientation=[63,156],tickmarks=[3,0,3],OP);
Trong trường hợp này ta không thể có được h1 (y) và hình xoay quanh Oy.
6.5 Tìm thể tích sinh ra bởi phép quay của phần giao của hai hàm Khảo sát phần giao của hàm f (x) =
x3 (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):
120
Phạm Minh Hoàng
6.5. Tìm thể tích sinh ra bởi phép quay của phần giao của hai hàm
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 ) 1 6 128 2 π(4x x )dx = π = 19.149 4 21 0
Lưu ý: Vẽ hình xoay quanh Ox [Hình 6.6 (a)], ta giới hạn hàm eq1 =
1 3 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 ) 1 2 12 ( 1 ) ( 1 ) 16 ( 13 ) ( 13 ) π(2 y y )dy = 4 3 π2 3 π = 13.403 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. Phạm Minh Hoàng
121
Chương 6. Bài toán kích thước hình xoay
Hình 6.5:
6.6 Một trường hợp phức tạp Tìm thể tích snh ra do phép quay qanh Ox, Oy của phần diện tích nằm giữa hai hàm f (x) và g(x) được khai báo như sau: > f:=y=x*(x-2)ˆ2; g:=y=2; f := y = x(x 2)2 g := y = 2
> plot([rhs(f),rhs(g)],x=0..3,0..2);
Xoay quanh Ox > Int(Pi*rhs(f)ˆ2,x=0..2):%=value(%):%=evalf(rhs(%),5); ) (»2 128 2 4 π = 3.8296 πx (x 2) dx = 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)
122
Phạm Minh Hoàng
6.6. Một trường hợp phức tạp
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 nhật có chiều dày dx cực bé, chiều cao ? chữ 2 2 (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) [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 x(x 2)2 ) 8.06162449 x2 dx = 34.334
2 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
Phạm Minh Hoàng
123
Chương 6. Bài toán kích thước hình xoay
Hình 6.7:
Tương tự cách này ta có thể vẽ Hình 6.1 (a) bằng implicitplot
124
Phạm Minh Hoàng
6.7. Bài đọc thêm: Galilée
.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
6.7 Bài đọc thêm: Galilée
Galileo Galilée (Pise 1564 - Florence 1642) Ông là con trai của một nhà buôn vải sợi, có tên gọi theo tiếng Ý là Galilei. Ban đâu, cha muốn ông theo nghề buôn của gia đình, nhưng sau nhân thấy con mình thích khoa học nên cho Galilée theo học Y khoa ở Toscane. Năm 1581, Galilée vào học Đại học Pise nhưng rồi càng ngày càng bị toán học chinh phục, nên ông theo học những lớp riêng không chính thức và được đền bù xứng đáng: năm 1589 ông được phong Giáo sư Toán Đại học Pise và 3 năm sau về dạy Đại học Padoue. Thời bấy giờ, lý thuyết Copernic về Quả Đất chuyển động quanh Mặt Trời bị Giáo Hội cho là "tà đạo" và cấm đoán đẻ không cho phép
Phạm Minh Hoàng
giảng dạy ở Đại học. Nhưng ông cho răng Copernic có lý nên cho công bố một tác phẩm dưới hình thức đối thoại, ngụ ý xa gần bênh vực cho học thuyết Copernic. Do nhà cầm quyền thời ấy không dễ gì bị qua mặt, Galilée bị bắt. Ông bị buộc nói lại khác với suy nghĩ của mình. Năm 1637, ông bị mù, nhưng sức làm việc không giảm. Năm 1642, Galilée qua đời sau một cơn sốt ác tính nhưng còn kịp trăn trối lại những ý nghĩ cuối cùng của mình về chuyển động của các hành tinh trong Thái dương hệ cho hai học trò giỏi của mình là Torricelli và Viviani Sáng tạo của Galilée chủ yếu là về Vật lý
125
Chương 6. Bài toán kích thước hình xoay
và Thiên văn, nhưng đóng góp của ông cho Toán học không phải là nhỏ. Lấylaij ý kiến của Nicole Oresme,Galilée cho vẽ đồ thị vận tốc của một chuyển động tăng dần đều phụ thuộc vào thời gian và ông ước lượng rằng diện tích giữa đường biểu diễn của vận tốc và trục hoành tương ứng với quãng đường đã đi. Để đi đến nhận thức ấy,Galilée đã chia trục thời gian ra từng phần vô cùng bé, có nghĩa là chia diện tích ra từng phần rất bé. Chính ông đã dẫn đương cho "Lý thuyết các phần không thể chia nhỏ được nữa" của học trò ông là Cavalieri, người được hậu thế xem như đã tiếp cận với Lý thuyết tính tích phân từ thế kỷ 16. Nhưng đóng góp của Galiée cho Vật lý rất cơ bản. Ông đã khám phá ra nhưng đăc điểm của chuyển động quả lắc, chuyển động tăng dần đều của một vật rơi tự do. Ông còn sáng chế ra kinh thiên văn, nhờ đó phát hiện các vệ tinh của Jupiter (Mộc tinh) (1609-1610) và cũng chính
126
vì thế mà Galilée càng khẳng định lý thuyết Copernic về Vũ trụ (hệ nhật tâm) là đúng; ông còn đóng góp phát triển kính hiển vi, sáng chế ra compa tỷ lệ, đồng hồ quả lắc. Vì thành tích của Galilée về Vật lý và Thiên văn quá rực rỡ nên người ta có cảm giác đóng góp của ông cho Toán học bị lu mờ, nhưng thực ra chính nhờ sự nghiên cứu của Gelilée qua các công cụ toán học, ông đã đưa toán học vào vị trí then chốt vì ông đã từng nói rằng: "Thiên nhiên đã tuân theo các quy luật Toán học bất di bất dịch!". Ý nghĩa triết học toát ra từ nghiên cứu khoa học của ông có giá trị hùng hồn. Nhờ những phát minh kỳ diệ đó mà khoa học đã thoát y hẳn những lý luận thần học bí hiểm của thời đại ông đang sống. Người ta nói Galilée đã đem cơ sở Toán học làm nên tảng cho mọi hoạt động khoa học nhân loại thời bấy giờ. Theo [28].
Phạm Minh Hoàng
Chương7 Bài toán sức bền vật liệu 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 Hai gối đơn
Ngàm một đầu, lực ở đầu kia
Ngàm một đầu, đầu kia tự do
Ngàm một đầu, lực bất kỳ
Ngàm hai đầu
Hai gối đơn
Ngàm một đầu, một đầu gối đơn Ngàm một đầu, gối đơn không ở đầu
7.1 Tải trọng đều .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 d d M (x) = EI ω(x) = y(x)EI dx dx d d3 V (x) = M (x) = 3 y(x)EI dx dx d d4 q(x) = V (x) = 4 y(x)EI 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 y(x) + =0 4 dx EI
(7.1.1)
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ự: Xác định điều kiện biên và giải phương trình vi phân Xác định ba hàm: chuyển vị, góc quay, moment uốn 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:
Hai đầu gối đơn .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: 128
Phạm Minh Hoàng
7.1. Tải trọng đều
> 'fl(x)'=fl(x); 'rt(x)'=rt(x); 'mt(x)'=mt(x); 1 qlx3 1 ql3 x 1 qx4 f l(x) = + 24 EI 12 EI 24 EI 1 qx3 1 qlx2 1 ql3 + 24 EI rt(x) = 6 EI 4 EI 1 1 mt(x) = qx2 + qlx 2 2
Giá trị ở các điểm đặc biệt là: > [fl(l/2)], [rt(0)], [mt(l/2)]; [ ] [ ] [ 1 ql3 1 2 5 ql4 384 EI , 24 EI , 8 ql
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);
Ngàm một đầu, đầu kia tự do Điều kiện biên: Góc quay và chuyển vị tại ngàm bằng không, moment và lực cắt tại đầu tự do bằng không: ω(0) = y(0) = V (l) = M (l) = 0
> ci2:=((D@@3)(y)(l)=0,(D)(y)(0)=0),(D@@2)(y)(l)=0,y(0)=0): > s := rhs(dsolve({ci2, eq}, y(x))): > 'fl(x)'=fl(x); 'rt(x)'=rt(x); 'mt(x)'=mt(x); 1 qx4 1 qlx3 1 ql2 x2 f l(x) = + 4 EI 24 EI 6 EI 1 qx3 1 qlx2 1 ql2 x + 2 EI rt(x) = 6 EI 2 EI 1 1 mt(x) = qx2 + qlx ql2 2 2 > [fl(l)], [rt(l)], [mt(0)]; [ [ ] [ ] 1 ql4 1 ql3 1 2 8 EI , 6 EI , 2 ql
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);
Ngàm hai đầu Điều kiện biên: 1
Lưu ý rằng tất cả các đồ thị đều được dùng với option tickmarks dùng để giới hạn các giá trị trên hai trục tọa
độ. Phạm Minh Hoàng
129
Chương 7. Bài toán sức bền vật liệu
Hình 7.3: Chuyển vị, góc quay và moment trường hợp hai gối đơn
ω(0) = y(0) = ω(l) = y(l) = 0
> ci3:=(((D)(y)(0)=0),D)(y)(l)=0,y(0)=0),y(l)=0: > s := rhs(dsolve({ci3, eq}, y(x))): > 'fl(x)'=fl(x); 'rt(x)'=rt(x); 'mt(x)'=mt(x); 1 qx4 1 qlx3 1 ql2 x2 f l(x) = + 24 EI 12 EI 24 EI 1 ql2 x 1 qx3 1 qlx2 + 12 EI rt(x) = 6 EI 4 EI 1 1 1 mt(x) = qx2 + qlx ql2 2 2 12
Giá trị cực đại tại các điểm đặc biệt: chuyển vị ở giữa dầm, góc quay ở
1 dầm, moment ở 4
hai đầu ngàm: > [fl(l/2)], [rt(l/4)], [mt(l)];
130
Phạm Minh Hoàng
7.1. Tải trọng đều
.y .l .q
.
.x
Hình 7.4: [
[ ] [ ] 1 ql4 1 ql3 1 2 384 EI , 128 EI , 12 ql > plot(fl,0..10); plot(rt(x),x=0..10); plot(mt,0..10);
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 5 qlx 1 ql2 x 1 qx + rt(x) = 6 EI 16 EI 8 EI 1 2 5 1 2 mt(x) = qx + qlx ql 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: Cách giải thứ nhất: Ta phân ra hai trường hợp.
a) x u Điều kiện biên: y(0) = ω(0) = y(u) = 0, M (u) =
q(l u)2 2EI
(7.1.2)
> 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 Phạm Minh Hoàng
131
Chương 7. Bài toán sức bền vật liệu
Hình 7.5: Chuyển vị, góc quay và moment trường hợp ngàm một đầu
1 4 qlx2 3 1 1 1 1 mt1(x) = qx2 + qxl qux + qu2 + ql2 qlu 2 3 u 2 8 8 4 2
b) u x l Trước tiên, ta thử điều kiện biên:
M (l) = y(u) = V (l) = 0, M (u) =
Và kết quả của dsolve là: 4
241 qx EI
+
1 qlx3 6 EI
2 2
14 qlEIx
+ C3 x
q(l u)2 2EI
(7.1.3)
1 u(qu3 + 24 C3EI + 4uq l 6uql2 ) 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)
y (2)
132
q x+A EI q x2 = M (x) + Ax + B EI 2 Phạm Minh Hoàng
7.1. Tải trọng đều
.y .l .q
.
.x
Hình 7.6:
y (1) = ω(x) y (0) = y(x)
q x3 x2 + A + Bx + C EI 6 2 q x4 x3 x2 + A + B + Cx + D EI 24 6 2
Khi y(u) = 0 ta tính được D Khi M (l) = 0 ta có phương trình theo A, B. 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à: M (l) = y(u) = 0, M (u) =
q(l u)2 q(l u)3 , ω(l) = 2EI 6EI
(7.1.4)
> 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 1 2 1 2 mt2(x) = qx + qlx ql 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: Phạm Minh Hoàng
133
Chương 7. Bài toán sức bền vật liệu
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". Cách giải thứ hai:
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)));
134
Phạm Minh Hoàng
7.1. Tải trọng đều
.y .l .q
.
.x
Hình 7.8:
g2 =
1 qx4 1 qlx3 + 24 EI 6 EI
2 2
14 qlEIx
+ C3 x + C4
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 : liên tục của góc quay ' g1 (u) = g2 (u) % 2 g1 (u) = g22 (u) : liên tục của moment > 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 s := 2 2 2 1 u 4lu + 2l 1 (12lu + 6l + u ) ' % C2 = , C1 = 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 plot([mte(eu),fle(eu)],x=0..10,-6..2,linestyle=[1,4]); Phạm Minh Hoàng
135
Chương 7. Bài toán sức bền vật liệu
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
Quan sát các Hình 7.13 ta nhận thấy: 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 gi:=seq(plot([mte((i)/10),fle((i)/10)],
136
Phạm Minh Hoàng
7.2. Tải trọng tập trung
.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);
7.2 Tải trọng tập trung Gọi P là tải trọng tập trung. Ta lặp lại các công thức quen thuộc: ω(x) =
d y(x) dx d d2 M (x) = EI ω(x) = 2 y(x)EI dx dx d d3 V (x) = M (x) = 3 y(x)EI dx dx
, / / / / . / / / / -
3
d P ùñ dx y(x) =0 3 EI
(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: Phạm Minh Hoàng
137
Chương 7. Bài toán sức bền vật liệu
.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)
ω(0) = y(0) = M (l) = 0
> ci51:=(y(0)=0,D(y)(0)=0,(D@@2)(y)(l)=0:) > s := rhs(dsolve({ci51, eq}, y(x))): > 'fl(x)'=fl(x); 'rt(x)'=rt(x); 'mt(x)'=mt(x); 1 P x3 1 P lx2 f l(x) = 2 EI 6 EI 1 P x2 P lx rt(x) = EI 2 EI mt(x) = P l P x
Ngàm một đầu, lực tập trung ở x = u l [Hình 7.14 (b)] Điều kiện biên: ω(0) = y(0) = M (u) = 0
> ci52:=(y(0)=0,D(y)(0)=0,(D@@2)(y)(u)=0:) > s := rhs(dsolve({ci52, eq}, y(x))): > 'fl(x)'=fl(x); 'rt(x)'=rt(x); 'mt(x)'=mt(x); 1 P x3 1 P ux2 f l(x) = 2 EI 6 EI
138
Phạm Minh Hoàng
7.2. Tải trọng tập trung
.y .P .x
.l
.
.(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 EI 2 EI mt(x) = P l P u rt(x) =
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)
Phạm Minh Hoàng
139
Chương 7. Bài toán sức bền vật liệu
Hai gối đơn .y .P .x
.l
. .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; P (l u)x d2 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 1 2 1 3 1 P ul2 eq2 := P u lx + x + Ex El 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
140
Phạm Minh Hoàng
7.2. Tải trọng tập trung
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 + l2 ) 1 P u(u2 + 2l2 3lu) ,E = A= 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 1 2 1 3 1 P u(u2 + l2 )x y2 := P u lx + x lEI 2 6 6 lEI
ul 13 PEI
2
+
1 P u(u2 + l2 ) 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).
Phạm Minh Hoàng
141
Chương 7. Bài toán sức bền vật liệu
7.3 Bài đọc thêm: Képler - Thái Dương hệ
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 !).
Ba định luật Képler. Đị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. 142
Phạm Minh Hoàng
7.3. Bài đọc thêm: Képler - Thái Dương hệ
Hình 7.18: Thái Dương Hệ
1 2 3 4 5 6 7 8
Hành tinh Thủy tinh Kim tinh Trái đất Hỏa tinh Mộc tinh Thổ tinh Thiên Vương tinh Hải Vương tinh
Bảng 7.1: Thái Dương hệ. [3 ] tiếng Anh A B Mercury 58 2.400 Venus 108 6.000 Earth 150 6.400 Mars 227 3.400 Jupiter 778 67.000 Saturn 1.427 60.000 Uranus 2.869 25.000 Neptune 4.500 25.000
C 0.056 0.817 1 0.11 318 95 16 17
D 0.40 0.93 1.00 0.35 2.91 1.08 1.05 1.12
E 88d 224d 365d 680d 12y 29y 84y 164y
F 58d 242d 24h 24h 10h 10h 17h 16h
Cột B: bán kính (đơn vị: km).
Mộc tinh, hành tinh lớn nhất có bán kính gấp 10 lần bán kính trái đất, thể tích của nó gấp 1000 lần thể tích trái đất, nhưng khối lượng của nó chỉ gấp 318 lần (xem cột C), vì nó có nhiều chất khí. Xem ra trái đất là hành tinh có tỷ trọng lớn nhất Cột C: khối lượng tương đối so với trái đất (=1). 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 Phạm Minh Hoàng
143
Chương 7. Bài toán sức bền vật liệu
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.
144
Phạm Minh Hoàng
Chương8 Bài toán đạn đạo 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.
8.1 Môi trường không có ma sát không khí Trước tiên, ta tải vào bộ nhớ các gói hàm cần thiết cũng như định nghĩa một vài chữ viết tắt trong bài: .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
Chiếu v0 xuống hai trục, ta có vx = v0 cos(α) và vy = v0 sin(α). > y2:=diff(y(t),t$2):x2:=diff(x(t),t$2): > s:=dsolve({y2=-g,x2=0,D(y)(0)=v0*sin(a), D(x)(0)=v0*cos(a),x(0)=0,y(0)=0});
(8.1.1)
Chương 8. Bài toán đạn đạo "
1 s := y(t) = gt2 + v0 sin(α), x(t) = v0 cos(α)t 2
*
(8.1.2)
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 1 s := ey := gt2 + v0 sin(α)t 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 1 sin(α)x y := + 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
Và tầm bắn xa nhất tương đương với góc bắn (giải phương trình
d 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
146
Phạm Minh Hoàng
8.1. Môi trường không có ma sát không khí
Độ 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. Phương trình chuyển động thẳng của xe là : x(t) = vh t + x0
ñ t = x(t)v x0 h
Để bắn trúng xe, thời gian bay của đạn phải bằng thời gian chạy của xe (trước khi chúng đạn). Với q(α) và t(α) là điểm rơi và thời gian bay của viên đạn, ta có phương trình (lấy lại Phạm Minh Hoàng
147
Chương 8. Bài toán đạn đạo
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 % 4 %1 = RootOf (324000000 Z + (324000000 + 3600vh2 ) Z 2 + 120x0 Zvh + x20 )
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 21o30 (xe đi được 109m).
67o88 (xe đi được 287m) và 0.3728 rad
8.2 Môi trường có ma sát không khí
2
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,
148
π ] 2 Phạm Minh Hoàng
8.2. Môi trường có ma sát không khí
Thí dụ 1: nghiệm giải tích Kết quả trên đây chỉ có giá trị lý thuyết, thực ra hiện tượng ma sát hiện diện ở khắp mọi nơi trên trái đất. Trước tiên, chúng ta giả sử môi trường có một lực ma sát fr tỷ lệ với vận tốc ⃗v . Hệ (8.1) trở thành: "
mx2 (t) = kvx my 2 (t) = kvy mg
(8.2.1)
> eqx:=diff(x(t),t$ 2)=-x1*k/m; > eqy:=diff(y(t),t$ 2)=-y1*k/m-g; $ 2 k d ' d & x(t) = x(t) dt22 m dt k d ' d % y(t) = y(t) g dt2 m dt
(8.2.2)
> cond:=x(0)=0,y(0)=0,(D)(x)(0)=v0*cos(a),(D)(y)(0)=v0*sin(a): > s := dsolve({eqx, eqy, cond}, {x(t), y(t)}):
Làm lại những lệnh (8.3), (8.4), để sau cùng có được phương trình chuyển động: > ex:=eval(x(t),s): > ey:=subs(s,y(t)): > subs(isolate(x=ex,t),ey): > y:=subs(isolate(%,t),rhs(ey)); > collect(%,x): y=map(factor,%); ( ) gm + v0 sin(a)k gm2 v0 cos(a)m xk y= x + 2 ln kv0 cos(a) k v0 cos(a)m
Một khi thu được nghiệm giải tích, mọi việc trở nên đơn giản (cho dù nghiệm cực kỳ phức tạp và không thể tách biến x). Chúng ta chỉ cần làm lại các lệnh ở trang 140 để có được độ cao, điểm rơi, tầm bắn cũng như thời gian đạn bay. . . Chúng ta cũng có thể tính được góc bắn một chiếc xe trên trục Ox. Tất cả dĩ nhiên đều là những biểu thức giải tích.
Thí dụ 2 : nghiệm bằng phương pháp số Hệ (8.6) có thể giải bằng giải tích vì đây là một hệ tuyến tính theo vận tốc v (và cả theo v 2 cũng thế). Bây giờ ta giả sử chuyển động của m chịu ảnh hưởng của một lực ma sát f⃗r = k⃗v |v |, với |v | là suất của vận tốc. d
|v | =
(
)2 ( )2 d d x(t) + y(t) dt dt
Hệ (8.5) trở nên:
mx2 (t) = kvx |v | 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ó.
Phạm Minh Hoàng
149
Chương 8. Bài toán đạn đạo
> eqy:=diff(y(t),t$2)=-y1*k/m*'v'-g; $ d2 k d ' & eqx := x(t) = x(t)v 2 dt2 m dt d k d ' % eqy := 2 y(t) = y(t)v g 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); [t = 0.03, x(t) = 15.2660497092393293, y(t) = 15.2621296241892282,
d x(t) = 414.341519104685861, dt
d = 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ẻ 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 5
150
Phạm Minh Hoàng
8.2. Môi trường có ma sát không khí
Hình 8.3: Đạn đạo với hệ số ma sát bằng : (a) k = 1 (tối đa) và (b) k =
1 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 , 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.
Với lực ma sát bằ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)]);
Tìm góc bắn xa nhất ∼∼∼∼∼∼
Đế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. Phạm Minh Hoàng
151
Chương 8. Bài toán đạn đạo
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ì 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ị: Căn cứ vào đô thị ta thấy khởi đầu từ
> va:=[seq(param[i,1],i=1..nops([param]))]; [ ] π 2π π π 7π , , , , 10 15 6 5 30
152
Phạm Minh Hoàng
8.2. Môi trường có ma sát không khí
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 π π π > R:=[solve(diff(f,alpha),alpha);]
70561.0 απ
R := [.27896, .50333, .82190]
> evalf[5](map(convert,R,degrees)); [15.983.degrees, 28.893.degrees, 47.091.degrees]
Chỉ R2
P
[
] π 7π , vậy góc bắn xa nhất 28.8o và tầm xa tương ứng là: 10 30
> 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 7
Ta có thể đánh chữ mét để có kết quả như trong hình! Ở phiên bản 8, phải hoán chuyển dãy va thành dạng float
Phạm Minh Hoàng
153
Chương 8. Bài toán đạn đạo 4867.02722
Hình 8.5:
Nối dài tầm bắn 1 1 Các tính toán sau đây cho thấy khi: α 28o ( rad) và lực ma sát = 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) 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);
154
Phạm Minh Hoàng
8.2. Môi trường có ma sát không khí [ ] d d t = 12, y(t) = 1351.97, y(t) = 0.10, x(t) = 3306.84, x(t) = 130.45 [8 ] dt dt
Để lấy được vx = x1 (t), x(t), y(t) ta phải làm:
> vx:=subs(s1(12),diff(x(t),t)); > px:=subs(s1(12),x(t)); > py:=subs(s1(12),y(t)); vx := 130.45, px := 3306.84, py := 1351.97
> odeplot(s1,[x(t),y(t)],0..i-1,scaling=constrained);gr1:=%: > plots[display](gr1); [Hình 8.6 (a)]
Giả sử thuốc nổ trên tọa độ [px, py] sẽ tạo ra một vận tốc vx = 300m/s. Điều kiện đầu tien là: > cond:={D(y)(0)=0,D(x)(0)=vx+300,x(0)=px,y(0)=py}:
cond := tD(y)(0) = 0, D(x)(0) = 430.45, x(0) = 3306.84, y(0) = 1351.97u
> s2:=dsolve(eq union cond,{x(t),y(t)},numeric); > for i to 300 while subs(s2(i),y(t))>0 do od: i-1;
Khi t = 21 (kể từ độ cao cực đại), đạn sẽ rơi xuống đất. Các giá trị lúc này là: > s2(21); [ ] d d t = 21, x(t) = 6633.14, x(t) = 64.73, y(t) = 9.13, y(t) = 110.22 dt dt > odeplot(s2,[x(t),y(t)],0..21,scaling=constrained);gr2:=%:
Và sau cùng khi vẽ trên cùng một đồ thị: [Hình 8.6 (b)]: > plots[display](gr1,gr2);
Hình 8.6: Nối dài tầm bắn 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ẻ
Phạm Minh Hoàng
155
Chương 8. Bài toán đạn đạo
Sức cản trong trường hợp phức tạp Trong tất cả những phần trên, nếu sức cản có hiện hữu thì nó luôn là một hằng số, nhưng thực ra, nó tùy thuộc vào nhiều yếu tố. Bây giờ để biểu diễn một cách sát với thực tế nhưng không quá phức tạp, ta cho lực cản là một hàm theo cao độ. Gọi p(y(y)) là hàm hệ số sức cản (với độ cản tối đa ở mặt đất là p(0) = 1). Hệ phương trình vi phân (8.7) trở thành: $ ' ' ' ' & ' ' ' ' %
d
( )2 ( )2 d k d d x(t) = x(t) p(y(t)) x(t) + y(t) dt2 dt m dt dt d ) ( )2 ( 2 d2 d k d d y(t) = y(t) p(y(t)) x(t) + y(t) g dt2 dt m dt dt d2
Để khai thác hết sức mạnh của Maple, ta sẽ khai báo hệ trên dưới dạng hàm mũi tên với tham số là p(y(t)). Như thế ta chỉ phải khai báo một lần duy nhất: > restart:with(plots): > x1:=diff(x(t),t):x2:=diff(x1,t): > y1:=diff(y(t),t):y2:=diff(y1,t): > v:=sqrt(x1ˆ2+y1ˆ2):
> eq:=p¡{x2=-x1*(k*p(y(t)))/m*v,y2=-g-y1*(k*p(y(t)))/m*v}: > cond:={D(y)(0)=v0*sin(a),D(x)(0)=v0*cos(a),x(0)=0,y(0)=0}: > g:=10:m:=50:k:=1/40:v0:=900:a:=Pi/4:
Khi p(y) = 1 (hằng số): > s:=dsolve(eq(1) union cond,{x(t),y(t)},numeric): > for i to 300 while subs(s(i),y(t))>0 do od: i: (Kết quả i = 42) > g1:=odeplot(s,[x(t),y(t)],0..%):
(Hình 8.7 (c), đường có tầm bắn khoảng 4400m) Khi p(y) = 1 là một đường thẳng:
1 Giả sử sức cản ở mặt đất là 1 và ở cao độ 4000 là . Hàm tuyến tính có dạng: 5 > p:=x¡-x/5000+1: plot(p,0..4000); [Hình 8.7 (a)] hspace5mm> s:=dsolve(eq(p) union cond,{x(t),y(t)},numeric): > for i to 300 while subs(s(i),y(t))>0 do od: i: (Kết quả i = 47) > g2:=odeplot(s,[x(t),y(t)],0..%):
(Hình 8.7 (c), đường có tầm bắn khoảng 6000m) Khi p(y) = 1 phi tuyến:
Giả sử sức cản ở mặt đất là 1 và ở cao độ 4000 là ex/2500 :
1 nhưng thay đổi theo hàm mũ: x 5
ÞÑ
> p:=x¡exp(-x/2500: plot(p,0..4000); [Hình 8.7 (b)]
hspace5mm> s:=dsolve(eq(p) union cond,{x(t),y(t)},numeric): > for i to 300 while subs(s(i),y(t))>0 do od: i: (Kết quả i = 50) > g3:=odeplot(s,[x(t),y(t)],0..%):
156
Phạm Minh Hoàng
8.2. Môi trường có ma sát không khí
(Hình 8.7 (c), đường có tầm bắn khoảng 6000m) > display(g1,g2,g3);
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
Dưỡng Do Cơ thế kỷ XXI! [9 ] ∼∼∼∼∼∼∼
Giống như mục 8.1 - 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 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"
Phạm Minh Hoàng
157
Chương 8. Bài toán đạn đạo
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
Từ param ta trích ra 3 dãy: > 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]))]; ] [ 3π 2π π 3π 7π 4π , , , , , 50 25 10 25 50 25 [17, 20, 24, 27, 29, 32] [4249.74, 4481.61, 4722.32, 4830.24, 4842.14, 4866.27]
Nội suy Lagrange Từ ba dãy trên, khai báo các hàm nội suy Lagrange: > fta:=unapply(interp(vt,va,t),t): (Nội suy t theo góc α) > ftd:=unapply(interp(vt,vd,t),t): (Nội suy t theo tầm bắn d) > fdt:=unapply(interp(vd,vt,u),u): (Nội suy tầm bắn d theo t) > fad:=unapply(interp(va,vd,a),a): (Nội suy tầm bắn d theo góc α) Trước khi vào vấn đề chúng ta cần phân biệt hai trường hợp: 158
Phạm Minh Hoàng
8.2. Môi trường có ma sát không khí
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 a cũng là trường hợp ⃝ b nhưng chỉ lùi thời xe phải khởi hành cùng lúc. Mặt khác trường hợp ⃝ 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.
Nội suy Spline Nếu xét về phương pháp thì không có gì sai vì chỉ áp dụng lại những gì ở mục 8.2.3 là nội suy và giải phương trình đạo hàm để tìm cực trị. Cách tính cực trị này thì chắc chắn đúng vì đã làm nhiều lần (và có cả chương 1 để khảo sát), vậy thì trục trặc chỉ còn "đâu đó" quanh các hàm ội suy. Thay vì Lagrange, bây giờ ta thử với spline cubic. Từ param ta khai báo hàm nội suy: > 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]); > plot(fda,vd[1]..vd[6]);
Quan sát đồ thị thì lần này đến lượt hàm f da(t) [Hình 8.10 (c)] có vấn đề, và cũng như nội suy Lagrange, kết quả này cũng không chấp nhận được. Phạm Minh Hoàng
159
Chương 8. Bài toán đạn đạo
Hình 8.9: Các hàm nội suy ftd(d), fdt(d) và fad(t)
Nội suy Spline với độ chia góc bắn nhỏ Qua hai kết quả sai ở trên ta có nhận xét như sau: Bản chất của các nội suy khong thể sai[10 ], mà các phép tính này đều dựa trên sự chia nhỏ của các biến (ở đây là góc bắn), chia càng nhỏ π cũng chưa đạt. Để kiểm chứng giả thiết hàm càng chính xác. Vậy thì rất có thể với độ chia 50 π này, ta chia góc bắn ra nhỏ hơn, . Hàng thứ 9 của Bảng 8.1 sẽ là: 60 r:=i*Pi/60$i=3..8: Khởi động lại chương trình vẫn với các số liệu trên, ta được: > canon(900,1/40); [ ] [ ] [ ] π π π , 15, 4052.81 , , 18, 4334.20 , , 21, 4554.35 , 20 15 12 10
Ngoại trừ ở các giá trị biên (hiện tượng Runge)
160
Phạm Minh Hoàng
8.2. Môi trường có ma sát không khí
Hình 8.10: Các hàm nội suy ftd(t), fad(a) và fda(x) ] [ ] [ ] 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]); Phạm Minh Hoàng
161
Chương 8. Bài toán đạn đạo
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
162
Phạm Minh Hoàng
8.2. Môi trường có ma sát không khí
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); Phạm Minh Hoàng
163
Chương 8. Bài toán đạn đạo
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 π 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. - Nội suy Lagrange với độ chia các góc bắn
164
Phạm Minh Hoàng
8.3. Bài đọc thêm: Shwerer Gustav
Hình 8.14:
8.3 Bài đọc thêm: Shwerer Gustav
Schwerer Gustav Khẩu đại bác khủng khiếp nhất mọi thời đại Lịch sử hình thành. Vào những năm 30, nước Pháp xây dựng chiến lũy Maginot để ngăn chặn cuộc xâm lăng của phát xít Đức. Chiến lũy được bao bọc chắc chắn để có thể chịu đựng được pháo binh đối phương, đặc biệt là pháo nặng kiểu "Dicke Bertha" với đại bác nòng 420 ly.[11 ] Hitler đã ra lệnh cho cơ xưởng Krupp chế tạo ra đại bác có thể đánh sập Maginot. Và khẩu đại bác lớn nhất thế giới có tên Schwerer Gustav (Gustav hạng nặng, và có tên là Dora) đã ra đời vào năm 1941. Nhìn vào các chi tiết kỹ thuật của Dora, ai ai cũng chết khiếp: Trọng lượng: 1350 tấn Đường kính nòng: 800 ly Chiều dài nòng: 32 m Tầm bắn: 48 km Trọng lượng viên đạn: 48 tấn
11
Mỗi một viên đạn (nặng bằng một chiếc xe tải hạng nhẹ) mang theo 200 kg thuốc nổ có khả năng đi xuyên qua 1 mét thép hay 7 mét bê tông cốt thép hoặc 30 mét đất. Điều đó có nghĩa là không một chiến lũy nào có thể chịu nổi trước sự công phá của Dora. Khủng khiếp hơn, ngoài loại đạn trên Dora còn được trang bị thêm đạn xuyên phá nặng 7 tấn với 700 kg thuốc nổ có khả năng đi xuyên qua 80 m bê-tông cốt thép trước khi phát nổ. Với sức nặng và một kích thước khổng lồ (43 7 12), Dora chỉ có thể di chuyển trên hai đường ray đặc biệt. "Hộ giá" theo Dora là 1400 người trên 5 chuyến xe lửa. Đó là chưa kể lực lượng bảo vệ và một đạo quân khác đã đi trước để chuẩn bị bãi đáp cho Dora. Khi tới nơi phải mất 6 tuần để ráp, để bắn thử trước khi bắn thật. Nói tóm lại đây là một công việc cực kỳ phức tạp.
Khẩu đại bác lớn nhất hồi Đệ nhất thế chiến 1914 - 1918
Phạm Minh Hoàng
165
Chương 8. Bài toán đạn đạo
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. Khi khẩu Dora đầu tiên xuất xưởng vào tháng 11/1941 thì mục tiêu đầu tiên đã không còn. Chiến lũy Maginot đã rơi vào tay quân Đức một cách quá dễ dàng trước đó. Bộ Tham Mưu Dức dự tính đem Dora xuống tuêu diệt căn cứ Anh đang chiếm giữ eo biển Gibraltar. Muốn thế phải đi xuyên qua Tây Ban Nha, nhưng trong đệ nhị thế chiến, Tây Ban Nha, trung lập và Tướng Franco không cho phép Hitler đi vào lãnh thổ mình. Người Đức phải tìm một chiến trường khác, và điều đó đã xảy ra trên mặt trận phía Đông. Vào năm 1941, quân đội Đức xâm chiếm Liên Xô với chiến dịch Barbarossa dưới sức chống trả yếu ớt của Hồng quân Liên Xô. Mỗi ngày Đức tiến sâu hàng trăm cây số và tiến sát tới cảng Sebastopol nổi danh "bất khả chiến bại" gồm địa thế thiên nhiên cũng như những pháo đài vô cùng kiên cố. Hồng quân đã chuẩn bị chiến tranh bằng cách cho xây nhưng hầm chứa đạn sâu dưới đáy biển vịnh Sever-naya. Trong suốt một tháng, nửa triệu viên đạn đại bác đã rơi xuống đây nhưng căn cứ này vẫn đứng vững. Dora được điều tới "xử" Debastopol. Nhày 5/6/1942, sau nhiều tuần lễ chuẩn bị, Dora nã những viên đạn đầu tiên nhắm vào các hầm chứa đạn. Nhưng viên đạn 7 tấn đi qua 30 mét nước, xuyên thủng bê-tông như đạu hủ và phái nổ bên trong hầm đạn. Chỉ sau 8 phát, mục
166
tiêu nát bấy. Thậm chí tầu vè trên mặt nước cũng bị đánh chìm. Sau đó pháo đài Staline cũng sụp đỏ sau khi lanh trọn 6 quả. Bắn xong 14 phát Dora nghỉ vì chuẩn bị cho một viên đạn cực kỳ phức tạp. Hôm sau, chỉ cần 7 phát, pháo đài Molotov đã thành đóng gạch vụn, và ngày qua ngày các pháo đài Siberie, Maxime Gorky lần lượt bị đánh sập. Ngày 1/7/42, toàn vẹn Sebastopol rơi vào tay quân Đức. Tổng cộng Dora "mới" chỉ mã 48 phái, và đó cũng là 48 phát cuối cùng. Vì sau khi Sebastopol thất thủ Dora được tháo ra và đưa vào xưởn bảo trì ở Essen. Sau khi xuất xưởng, Dora không tìm ra mục tiêu "xứng đáng" nên đành bỏ phế. Nhều ý tưởng chỉnh sửa Dora cho gọn nhẹ hơn nhưng đã không được thực hiện. Người ta tự hỏi tại sao vào năm 1944 Hitler không điều Dora đến bờ Normandie để ngăn chặn cuộc đổ bộ ? vì mỗi phái đạn có thể đánh đắm dễ dàng một thiết giáp hạm. Nhưng nói cho cùng, cho dù có sức công phá khủng khiếp nhưng chỉ hiệu quả với nhưungx mục tiêu cố đinh kiểu Sebastopol, đó là chưa kể thời gian nạp đạn quá lâu đủ cho đối phương phản công. Tuy nhiên điều quan trọng hơn cả là vào năm 1944, quân Đức không biết được ở đâu và lúc nào cuộc đỏ bộ sẽ xảy ra. Biết được những yếu điểm của Dora, Hitler đã ra lệnh chế tạo ra khẩu Dora đời mới có tầm bắn lên đến 160 km, nghĩa là có thể
Phạm Minh Hoàng
8.3. Bài đọc thêm: Shwerer Gustav
đứng trên bờ biển Pháp nã đạn vào thủ đô London, nhưung lúc ấy quân đội Đức đang gấp rút khai triển hỏa tiễn V-1 và V-2 gọn nhẹ và có tầm bắn cực xa. Cũng may cho nhân loại là chiến tranh đã
Phạm Minh Hoàng
sớm kết thúc sớm. Vào những phút sau cùng của cuộc chiến, người Đức đã ra lện phá hủy Dora bằng chất nổ và khi hòa bình tái lập, những phần của Dora được nấu chảy đẻ phục vụ cho việc xây dựng đất nước.
167
Chương9 Bài toán dao động 1: Lò xo 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ố.
9.1 Lò xo nằm ngang Một lò xo nằm ngang, một đầu gắn cố định, nơi đầu tự do gắn một khối m. Vào thời điểm t = 0, người ta kéo giãn ra (hoặc co vào) một đoạn x0 rồi buông ra. Khảo sát hiện tượng của hệ thống. Trước tiên, ta tải vào bộ nhớ các gói hàm cần thiết cũng như định nghĩa một vài chữ viết tắt. > restart:with(plots):with(plottools): > alias(SC='scaling=constrained' ,IT='insequence=true'):
Trước khi bước vào phần tính toán, chúng ta dùng các lệnh graphics của Maple để vẽ đặc biệt là để tạo hình động cho hệ thống lò xo và khối m. Về khối m (giả sử tròn), ta dùng lệnh disk([x,y],r) trong đó x, y, r lần lượt là tọa độ và bán kính của m. Ở đây ta khai báo một khối tọa độ [5, 5; 0], bán kính 0.3. > m:=disk([5.5,0],.3):
Riêng về lò xo thì phức tạp hơn. Để vẽ một lò xo có thể biến dạng theo chiều dài, không gì hay hơn là dùng một hàm tuần hoàn dạng f (x) = sin(ux + v). Vì hai đầu lò xo (giả sử có tọa độ là x = a và x = b) phải nằm trên trục Ox nên ta phải có: " ua + v = 0 f (x) = sin(ux + v) = 0 ñ ub + v = 2π
9.1. Lò xo nằm ngang
Giải hệ phương trình này theo (u, v). Ta được: > solve({ u*a+v=0, u*b+v=2*Pi },{ u,v }); 2π 2πa u= ,v = ba ba
Phương trình của lò xo có hai đầu x = a và x = b là: (
f (x) = sin
2π
ba
x
2πa ba
)
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); ( ) 1 2πx 2πa RS := (a, b) ÞÑ plot sin(5( )), x = a..b, SC (9.1.1) 2 ba ba
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);
Hình 9.1: Lò xo và khối m trên trục hoành 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 d như trong cách viết thông thường (x (t) thay vì viết x(t)) dt 1
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
Phạm Minh Hoàng
169
Chương 9. Bài toán dao động 1: Lò xo
> alias('x' '(t)'=(D@@2)(x)(t),'x' '(t)'=diff(x(t),t)):
Chọn hệ tọa độ với x ¡ 0 như Hình [9.1]. Gọi m, B, K lần lượt là khối lượng hòn bi, lực giảm xóc, độ cứng của lò xo. Áp dụng nguyên lý căn bản động lực học vào hệ thống, ta có phương trình chuyển động trong trường hợp tổng quát là: (F ) = mγ = Kx Bx1
°
2 ñ m BBt2 x(t) + Kx(t) = 0
Để 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)
Trường hợp 1 : Không có lực giảm xóc, λ = 0 Điều kiện đầu : x(0) = x0 , x1 (0) = v(0) = 0: > subs(lambda=0,eq); x2 (t) + ω 2 x(t) = 0
> DK:=x(0)=x0,D(x)(0)=0: > dsolve({subs(lambda=0,eq),DK}); x(t) = x0 cos(ωt)
> f1:=unapply(rhs(%),(x0,omega,t)):
f1 là hàm xác định vị trí của x theo (x0 , ω, t), ta thử với một vài vị trí thích ứng: > plot(f1(1(sqrt(2)/2,t),t=0..3*Pi);
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
170
Phạm Minh Hoàng
9.1. Lò xo nằm ngang
?
?
2 2 g1 := t Ñ display(disk([5.5 + f1 (1, , t), 0], .3), RS(5 + f1 (1, , t), 0), w(7)); 2 2 > tu:=time():movie:=NULL:for i to 45 do movie:=movie,g1(i);
od:time()-tu; 0.874[3 ]
> display([movie],IT,SC);
Cần 7 giây để vẽ một hình động đơn giản với 45 lần lặp. Đúng ra chúng ta có thẻ chạy ít lần hơn, vì trong trường hợp này, chuyển đọng tuần hoàn và điều hòa, nhưng làm như thế "đoạn phim" sẽ vị giật. Trong những câu kế tiếp chúng ta sẽ thấy bắt buộc phải dùng nhiều vòng lặp với những hàm số phức tạ hơn nhiều. Nên nhớ khi dùng hình động, cần phải có một máy tính thích hợp.
Trường hợp 2 : Lực giảm xóc, λ ¡ 0 Đặt ∆ = λ2 ω 2 , và giải phương trình (9.2) với cùng điều kiện ban đầu. > alias(Delta=lambdaˆ2-omegaˆ2): > expand(dsolve({eq,DK}));
?
?
1 x0 et ∆ λ 1 x0 et ∆ x(t) = ? + 2 ∆etλ 2 etλ
21 ?
x0 λ
? +
∆etλ et ∆
1 x0 ? 2 etλ et ∆
∆ 0ñλ ω
Phương trình (9.2) sẽ có nghiệm phức. Dưới đây ta lấy 1 1 x0 = 1, λ = , ω = ? 20 2
(9.1.3)
> f2:=unapply(rhs(%),(x0,lambda,omega,t)): > simplify(f2(1,1/20,1/sqrt(2)): collect(%,exp); ( ) ( ) ? ? 1 1 ? 1 ? 1 1/20t( 1+i 199) i 199 e i 199 e1/20t(1+i 199) + 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 Phạm Minh Hoàng
171
Chương 9. Bài toán dao động 1: Lò xo
Hình 9.3: Chuyển động với giảm xóc λ = df rac120 và
1 11
Error, (in plot) range values must be real constants
Đâ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 ω 3 . Khi ω = 3 (lò xo cứng) ta sẽ có 0.5, chuyển động m = 1 nghĩa là cần số góc băng 2π 2π 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ñλ¡ω
Phương trình (9.2) bây giờ có nghiệm thực. Dùng lại f2 đã được khai báo ở (9.4) và lấy x0 = 1, λ = 4
?4
2
,ω =
?1
2
Tránh trường hợp đồ thị bị đứt đoạn
172
Phạm Minh Hoàng
9.1. Lò xo nằm ngang
> combine(simplify(f2(1,4/sqrt(2),1/sqrt(2),t)),radical); ( ) ? ? ? ? t?30 ? 1 t 30 4 15e + 15e 4 15 + 15 e1/2 2t(4+ 15) 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 4 (đường biểu diễn liên tục là đường tương ứng với λ = ? ). 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: Phạm Minh Hoàng
173
Chương 9. Bài toán dao động 1: Lò xo
> subs(lambda=c,omega=c,eq); dsolve({%,DK}); x2 (t) + 2cx1 (t) + c2 x(t) = 0
ñ x(t) = x0ect + x0cectt
Phương trình (9.2) nhận nghiệm kép x = c. > fc:=unapply(rhs(%),(x0,c,t)): > plot([f2(1,2/sqrt(2),1/sqrt(2),t),fc(1,1/2)], t=0..7*Pi,linestyle=[4,1],thickness=[2,3]);
Trong trường hợp ∆ ¥ 0, chuyển động không còn tuần hoàn nữa nhưng chậm dần. Đặc biệt trong trường hợp ∆ = 0, [Hình 9.4 (b)] giá trị của λ được gọi là giá trị tới hạn (critical). Khi đó thời gian trở về vị trí cân bằng ngắn nhất (đường nét đậm liên tục). Và đóng cũng là trị số có nhiều ứng dụng trong công - kỹ nghệ khi người ta chế tạo các ống giảm xóc, cân, galvannometre...
Khảo sát hiện tượng cộng hưởng Lò xo dưới ảnh hưởng ngoại lực Giả sử bây giờ người ta tác dụng vào lò xo một lực f = cos(ut) 1 1 3 Giải và gán kết quả vào hàm f3 rồi vẽ đồ thị với x0 = , λ = , ω = π, u = : 2 5 2 > f:=cos(u*t):eq=f; > r:=dsolve({eq=f,x(0)=x0,D(x)(0)=0}): > f3=unapply(rsh(%),x0,lambda,omega,u,t): > plot(f3(1/2,1/5,Pi,3/2,t),t=0..20*Pi);
Hình 9.5 cho thấy trong 10 giây đầu tiên chuyển động của lò xo bất kỳ, người ta gọi đây là giai đoạn chuyển tiếp, sau giai đoạn này chuyển động trở nên điều hòa. Khoảng thời gian này dĩ nhiên tùy thuộc vào các giá trị của λ, ω, u. Dĩ nhiên, ngoại lực phải là nội lực hoàn toàn.
Hình 9.5: Chuyển động với ảnh hưởng ngoại lực Tạo hình động:
> g3:=t¡display(disk([5.5+super(f3(1,1/5,Pi,2/5,t)),0],.3),
RS(5+(f3(1,1/5,Pi,2/5,t)),0),w(7)): > movie:=NULL:for i to 100 do movie:=movie,g3(i);od: > display([movie],IT,SC);
174
Phạm Minh Hoàng
9.1. Lò xo nằm ngang
Hiện tượng cổng hưởng Đến đây người ta sẽ đặt câu hỏi: phải chăng chuyển động điều hòa này sẽ tiếp tục đến vô tận? Câu trả lời tất nhiên là phụ thuộc vào lực cưỡng bức. Nhưng theo các kết quả thực nghiệm, thì người ta thấy rằng biên độ này sẽ càng lúc càng tăng khi tần số dao động cưỡng bức trùng với tần só dao động riêng của hệ thống. Đó là hiện tượng cộng hưởng. Dưới đây chúng ta hãy kiểm chứng lại tính chất đặc biệt này. 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. Gọi f (t) = F0 eiut là lực cưỡng bức có vận tốc góc là u. 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+ϕ)
Nếu dùng lại phương trình (9.2), ta có:
M x2 (t) + Bx1 (t) + Kx(t) = x2 (t) + 2λx1 (t) + ωx(t) = f (t) B 2 K ñ 2λ = M ,ω = M > f:=F0*exp(i*u*t):x(t):=A*exp(i*(u*t+phi));eq=f; F := F0 eiut Au2 ei(ut+ϕ + 2iλAuei(ut+ϕ + ω 2 Aei(ut+ϕ =
F0 eiut M
Vì phương trình trên đúng với mọi thời điểm t, vậy thi t = 0 ta có: > collect(subs(t=0,eq=f),exp); F0 e0 (Au2 + 2iλAu + ω 2 A)eiϕ = M
Phương trình trên gắn liền biên độ với tần số cưỡng bức. Nếu nhân hai vế với dạng liên hợp, chúng ta sẽ có bình phương của biên độ dao động: > lhs(%)*conjugate(lhs(%))=rhs(%)*rhs(%); (Au2 + 2iλAu + ω 2 A)eiϕ (Au2 + 2iλAu + ω 2 A)eiϕ =
F02 M2
> assume(phi>0):evalc(%); F02 M2 > op(select(i¡sign(i)>0,[solve(%,A)])); F0 ?4 M u 2u2 ω 2 + 4λ2 u2 + ω 4 (Au2 + ω 2 A)eiϕ + 4λ2 A2 u2 =
Tìm biên độ dao động cực đại bằng cách lấy đạo hàm biểu thức trên theo u và giải phương trình theo u:
?
?
> solve(diff(%),u),u);
0, ω 2 2λ2 , ω 2 2λ2
> select(i¡i0,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: u2
=
Phạm Minh Hoàng
?
ω2
c
2λ2
=
K M
2
B 2M 2
175
Chương 9. Bài toán dao động 1: Lò xo
Ứng dụng số 1 1 , ω = ? ). Dĩ nhiên 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ì: Dùng các trị số tương ứng (M = 20, K = 10, B = 1) hay (λ =
2λ2 =
B2 1 = 2 2M 800
K ! ω2 = M
=
Nên để đơn giản hóa vấn đề, ta có thể loại
1 2
B2 . 2M 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 = ω =
2 . 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; 1 1 3 t x2 (t) + λx1 (t) + x(t) = cos( ? ) 20 2 20 2 > dsolve({eq=f,x(0)=1,D(x)(0)=0}):
?
1 1 2 7? 1? 1? t) + e 40 t cos( 799t) 799e 40 t sin( 799t) 2 40 47 40 > p:=unapply(evalf(rhs(%)),t):
?
x(t) = 3 2 sin(
> 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ẽ
176
Phạm Minh Hoàng
9.2. Hệ ba lò xo nằm ngang
> 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; ? 1 1 1 x2 (t) + λx1 (t) + x(t) = cos( 2t) 20 2 20 > dsolve({eq=f,x(0)=1,D(x)(0)=0}): 1 201 ? 1? x(t) = 799e 40 t sin( 799t)+ 360349 40 ? ? 150 ? 5 601 1 t 1? e 40 sin( 799t) + sin( 2t) 2 cos( 2t) 451 40 451 451 > plot(rhs(%),t=0..200); [Hình 9.6 (b)]
9.2 Hệ ba lò xo nằm ngang Ba lò xo nằm ngang có cùng độ dài l và độ cứng k được nối liên kết với nhau. Lò xo bên trái được móc vào tường. Ở mỗi đầu lò xo có gắn một khối m. Kéo khối m thứ ba một khoảng rồi buông ra. Khảo sát chuyển động của hệ Hình 9.9 dưới đây cho thấy các lò xo co hoặc giãn bất kỳ. Những chuyển động của hệ kết nối này vô cùng phức tạp nhưng khi được giải và tạo động (animate) bằng Maple thì đây là những bài học rất sinh động.
Hình 9.7: Hệ ba lò xo trước và sau khi chuyển động 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): trở nên khổng lồ. Phạm Minh Hoàng
177
Chương 9. Bài toán dao động 1: Lò xo
> alias(SC='scaling=constrained' ,IT='insequence=true'):
> RS:=(a,b) ¡plot(sin(5*(2*Pi*x/(b-a)-2*Pi*a/(b-a)))/2,x=a..b,SC); ( ) 1 2πx 2πa RS := (a, b) ÞÑ plot sin(5( )), x = a..b, SC 2 ba ba
Gọi x(t), y(t), z(t) là độ giãn của ba lò xo (chứ không phải tọa độ). Ta có phương trình d2 y chuyển đọng: (dùng alias để hiển thị y 2 thay vì 2 ) dt > alias( 'x''(t)'=(D@@2)(x)(t),'y''(t)'=(D@@2)(y)(t),'z''(t)'=(D@@2)(z)(t), 'x'(0)'=(D)(x)(t)(0),'y'(0)'=(D)(y)(0),'z'(0)'=(D)(z)(0)): > p1:=m*(D@@2)(x)(t)=-k*x(t)+k*(y(t)-x(t)): > p2:=m*(D@@2)(y)(t)=-k*(y(t)-x(t))+k*(z(t)-y(t)): > p3:=m*(D@@2)(z)(t)=-k*(z(t)-y(t)):p1;p2;p3; # mx2 (t) = kx(t) + k(y(t) x(t)) my 2 (t) = k(y(t) x(t)) + k(z(t) y(t)) mz 2 (t) = k(z(t) y(t))
Điều kiện ban đầu: vị trí và vận tốc đầu của hai khối bên trái bằng 0, khối thứ 3 vì trí bằng 1, vận tốc đầu bằng 0 (kéo giãn ra 1 đơn vị chiều dài và buông ra không vận tốc đầu): > ci:=x(0)=0,y(0)=0,z(0)=1,D(x)(0)=0,D(y)(0)=0,D(z)(0)=0; ci := x(0) = 0, y(0) = 0, z(0) = 1, x1 (0) = 0, y 1 (0) = 0, z 1 (0) = 0
Ở những hệ phương trình phức tạp như trên, Maple chắc chắn sẽ khong thể giải bằng phương pháp hình thức. Ta giải ngay bằng phương pháp số (mặc định Runge-Kutta 4 nút), và chọn các kết quả của 3 khối x, y, z để gán vào ba chuỗi tương ứng X, Y, Z trước khi vẽ đồ thị chuyển 1 động. Để đơn giản, ta lấy 200 điểm để vẽ và mỗi bước là để đổ thị có một độ mịn chấp nhận 10 được: > s:=dsolve({p1,p2,p3}union{ci},{x(t),y(t),z(t)},numeric): > s(1); [t = 1, x(t) = .00957,
d d x(t) = .03668, y(t) = .22026, y(t) = .38403, dt dt
d z(t) = .42170 dt > X:=seq([i,subs(s(i/10),x(t))],i=1..200):plot(([X]),title='X(t)'); z(t) = .76998
> Y:=seq([i,subs(s(i/10),y(t))],i=1..200):plot(([Y]),title='Y(t)'); > Z:=seq([i,subs(s(i/10),z(t))],i=1..200):plot(([Z]),title='Z(t)');
Quan sát 3 đồ thị hình 9.8 chúng ta thấy chuyển động của 3 khối m không tuần hoàn, nếu không muốn nói là bất kỳ. Để thấy được chuyển động chung, không gì hay hơn là làm hình động. Nguyên tắc khá đơn giản: ta cộng vào tọa độ của ba khối m và ba lò xo các giá trị của X, Y, Z. Các chuỗi này có cấu trúc hai phần tử: số thứ tự và giá trị chuyển vị. Dĩ nhiên ta chỉ quan tâm đến giá trị chuyển vị. X = [1, .00957], [2, .00118], [3, .00374], [4, .00550] . . .
- Đối với 3 khối m ta cộng vào hoành độ của chúng các giá trị của X, Y, Z (vì chúng chỉ trượt trên Ox) - Đối với các lò xo: 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]
178
Phạm Minh Hoàng
9.2. Hệ ba lò xo nằm ngang
Hình 9.8: Chuyển động của hệ thống
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):
Phạm Minh Hoàng
179
Chương 9. Bài toán dao động 1: Lò xo
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
> bidon:=plot(1,x=23..23.1): > fx:=i)¡disk([6+X[i,2],0],.5): > fy:=i)¡disk([13+Y[i,2],0],.5): > fz:=i)¡disk([20+Z[i,2],0],.5): > systems:=proc(i) plots[display](fx(i),fy(i),fz(i), RS(0,5+X[i,2]),RS(7+X[i,2],12+Y[i,2]), RS(14+Y[i,2],19+Z[i,2]),bidon); end: > movie:=NULL:for i to 100 do movie:=movie,systems(i);od: > plots[display]([movie],IT,SC,view=[0..25,-1..1]);
Bảng 9.1: Các lệnh tạo hình động cho hệ ba lò xo có một đầu tự do
9.3 Bài đọc thêm: Cầu Tacoma Trước tiên chúng ta cần có một chút khái niệm cơ bản giữa loại loại cầu : cầu bê-tông và cầu treo: Cầu bê-tông : thoạt đầu người ta xây dựng các trụ cầu với khoảng cách thay đổi từ 20 đến dưới 100m (khoảng cách này còn gọi là nhịp cầu). Tiếp đó người ta mới gác lên giữa hai trụ những cây đà (còn gọi là dầm) bằng bê-tông cốt thép. Tùy theo bề mặt cầu lớn hay nhỏ, người ta sẽ bố trí số dầm cho phù hợp. Lấy thí dụ cầu Sàigòn nằm trên xa lộ Hà Nội có 21 dầm tiết diện 1.5 x 1 cho mỗi nhịp 24 mét. Trên 21 thanh dầm này người ta sẽ đổ những tấm đan làm mặt cầu. Tất cả những cấu trúc này đều được gắn chặt với nhau tạo thành một khối có trọng lượng xấp xỉ 2000 tấn. Sau khi xong một nhịp, người ta lại bắt đầu nhịp kế tiếp. Cầu treo : có hai loại cầu treo, cầu treo cáp thẳng và cầu dây văng (hay cáp xéo). Ở Việt Nam, đến năm 2007 thì mới chỉ có cầu Mỹ Thuận, cầu Bãi Cháy, trong tương lai có cầu cần thơ, cầu Rạch Miễu. Tất cả đều là cầu dây văng. Nhưng cho dù là dây văng hay cáp treo thì nguyên tắc chung cũng chỉ là treo sàn cầu lên hai trụ chính. Khoảng cách giữa hai trụ (còn gọi là nhịp chính) thay đổi từ 400 đến 800m cho dây văng và 500 đến 2000m cho cáp
180
thẳng. Nhịp chính ở cầu treo dài hơn rất nhiều so với cầu bê-tông, và đó chính là nguyên nhân của những tai hại. Thử tưởng tượng khi chúng ta treo một viên bi vào đầu một sợi dây, viên bi sẽ lắc lư nếu có gió. Sợi dây càng dài, lắc càng dữ.Nếu chiều dài này lên đến hàng trăm mét và với cơn gió 50km/h, viên bi này sẽ dao động mạnh, và như ta đã biết trong chương này, khi dao động đến mức cộng hưởng, biên độ sẽ tăng dẫn đến sự phá hủy. Điều này không thể xảy ra được với cầu bê-tông, vì để thổi văng 2000 tấn thì gió cũng đã thổi văng tất cả các công trình khác trên mặt đất. Cầu Tacoma trong bang Washington(Mỹ) do Pacific Bridge Company xây dựng với kinh phí 6,4 triệu đô la, được khánh thành vào ngày 1/4/1940. Đây là dạng cầu treo cáp thẳng có nhịp chính 853 mét, bề rộng mặt cầu 11.7m. Để tạo cho mặt cầu độ cứng cần thiết, người ta gia cố hai bên thành cầu những tấm sắt có chiều cao 2.4m. Ngay sau ngày khánh thành, người ta đã thấy có những dao động bất thường, nhưng thời ấy mọi người không quan tâm mà còn cảm thấy thích thú ! Có người đã đi hàng trăm cây số đến để hưởng thụ cảm giác "phiêu bồng" y như Tề Thiên đằng vân gia vũ ấy.
Phạm Minh Hoàng
9.3. Bài đọc thêm: Cầu Tacoma
Để có một cái nhìn cụ thể, chúng ta thử chia tất cả các kích thước cho 100. Như thế sẽ có một tấm thép tiết diện hình chữ U lật ngược rộng 11.7 cm, cao 2 cm, dầy 3 ly và dài 8.5 mét. Đem treo trước gió thì tấm thép này sẽ đong đưa, uốn éo đủ mọi chiều. Nếu là tấm thép và những sợi dây treo bằng kim loại thì có thể không sao nhưng nếu đó là một vật liệu dòn như bê-tông thì chắc chắn các mấu nối giữa dây và sàn sẽ bung ra, và đó chính là hình ảnh sụp đổ của cầu Tacoma. Ngày định mệnh. Vào sáng sớm ngày 7/11/1940, vận tốc gió là 55km/h. Đến 10g, cảnh sát ra lệnh cấm lưu thông vì ngoài dao động lên xuống lại có thêm dao động xoắn, và biên độ xoắn mạnh đến lỗi sàn cầu nghiêng một góc 450 so với phương ngang và kéo dài suốt ba tiếng đồng hồ, sức gió lúc đó lên đến 70km/h với biên độ 8 mét và 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. Một dao động xoắn mạnh đến nỗi nó "bẻ" cây cầu ra làm 2 phần theo chiều dài và xoắn ngược chiều nhau. Đến 11 giờ bất chợt một đoạn sàn dài gần 200 mét đổ ụp xuống sông : các mối nối đã không chịu nổi sự "tra tấn" của 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 cầu dẫn bị nhấc bổng lên cao 10 mét. Các cuộc điều tra đã tức khắc nhìn ra điểm yếu của cây cầu là nó quá "mềm", nói theo ngôn từ xây dựng là tỷ só chiều dây sàn cầu 2.4 1 trên chiều dài là là quá nhỏ và 850 350
Phạm Minh Hoàng
cây cầu xem ra chỉ "cứng" hơn một cọng bún ! Cũng nên nói, thoạt đầu kĩ sư thiết kế là ông 1 Clark Eldridge đã tính toán là , nhưng sau 112 đó chủ đầu tư đã thuê một công ty khác duyệt 1 lại bản thiêt kế để giảm xuống . Cõ lẽ thời 350 ấy người ta chưa biết đến khí động học, hoặc cũng đơn thuần là vì "chảnh" ! Chiều dài của Tacoma đưa nó trở thành cây cầu dài thứ ba thế giới vào lúc ấy ! Những chi tiết lý thú: Đúng là thiết kế sai lầm nhưng chúng ta cũng cần lưu ý tốc độ xây dựng nhanh : chỉ mất 17 tháng để hoàn tất một cây cầu treo dài 1800m, khẩu độ 853m, tĩnh không (khoảng cách từ sàn cầu đến mắt nước) 20m, hai trụ tháp 130m. Một kỷ lục đáng nể vào năm 1940. Rất may, khi cầu sụp, giao thông đã gián đoạn nên không có thiệt hại nhân mạng. "Nạn nhân" độc nhất là một... con chó. Ông chủ của nó muốn biết cảm giác mạnh và đã may mắn bám kịp vào chỗ an toàn khi nhịp giữa rơi xuống nước. Vào ngày khánh thành, một ngân hàng ở 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ầu Tacoma. Không cần phải nói cũng biết là sau đó ông giám đốc đã hạ cái biển quảng cáo chết tiệt này xuống ngay tức khắc.
181
Chương 9. Bài toán dao động 1: Lò xo
Hình 9.9: Cầu Tacoma lúc sụp đổ
182
Phạm Minh Hoàng
Chương10 Bài toán dao động 2: Con lắc toán học 10.1 Con lắc đơn Xét con lắc đơn được nối như hình 10.1. Gọi l, m là chiều dài và khối lượng con lắc, θ là góc quay. .
.θ
.l
.m
.H .A
.mg Hình 10.1:
Gọi G, T là động năng và thế năng, ta được: $ ( )2 1 2 1 d & T = mv = m l θ(t) 2 2 dt % V = mgAH = mgl(1 cos(θ(t)));
Chương 10. Bài toán dao động 2: Con lắc toán học
Áp dụng định lý bảo toàn cơ năng: 2 d 2 d (T + V ) = 0 ùñ ml 2 θ(t) + mgl sin(θ(t)) = 0 dt dt 2 ùñ θ (t) + gl sin(θ(t)) = 0
(10.1.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):
Trường hợp 1: góc quay nhỏ Trong trường hợp này sin θ(t) θ(t), và phương trình (10.1) trở thành: > eq1:=diff(a(t),t,t)+g/l*a(t)=0; d d2 eq1 := 2 θ(t) + θ(t) = 0 dt l
Chonj a(0) = s(g, t):
π , giải phương trình vi phân, thu gon kết quả và sau đó gán giá trị một hàm 6
> dsolve({eq1, a(0) = (1/6)*Pi, (D(a))(0) = 0}): > combine(subs(1/l = 1/sqrt(lˆ2), %), radical, symbolic); c π g t) θ(t) = cos( 6 l > s := unapply(rhs(%), g, t): > l:=1:plot([s(9.8, t), s(1, t)],t=0..10,linestyle=[1,4]); > plot([diff(s(9.8,t),t),diff(s(1, t),t)], t=0..10,linestyle=[1,4]);
Dao động của con lắc trong trường hợp này không những tuần hoàn mà còn là một dao động π điều hòa. Hình [12.2(a)] cho thấy khối m có biên độ tối đa là 0.524. Còn Hình [10.2(b)] 6 cũng cho thấy tính điều hòa của tốc độ. Dao động này được thấy rõ hơn khi ta hiển thị các chuyển động theo thời gian (Hình [12.2 (c)]). Để làm điều này trước tiên ta phải dùng hàm disk để vẽ khối m. Tọa độ của đầu dây cột m được xác định bởi: x = cos(s(t)), y = sin(s(t)). Tuy nhiên đây là hệ tọa độ trực chuẩn bình thường mà Maple dùng để tính: Ox dương về phía phải và Oy dương hướng lên trên. Để biểu diễn trong hệ tọa độ Ox π dương về phía phải và Oy dương hướng xuống dưới, chúng ta cần quay góc . Trong đoạn 2 chương trình dưới đây fd tượng trưng cho khối m và ld tượng trưng cho sợi dây (nhớ tránh dùng biến l vì l đã ký hiệu cho độ dài). > fd := i¡disk(([cos(-(1/2)*Pi+s(9.8, (1/10)*i)),
sin(-(1/2)*Pi+s(9.8, (1/10)*i))], .03), color = wheat):
> ld:=i¡plot([r, -(1/2)*Pi+s(9.8, (1/10)*i), r = 0 .. 1], coords = polar):
> sd := seq(display([ld(i), fd(i)]), i = 0 .. 8): > display(sd, scaling = constrained);
184
Phạm Minh Hoàng
10.1. Con lắc đơn
Hình 10.2: Con lắc đơn với góc quay nhỏ
Để 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);
Trường hợp 2: góc quay lớn không ma sát Lấy lại phương trình (10.1). Vì Maple không thể tìm ra lời giải giải tích nên ta đi thẳng vào tính toán số. Để đơn giản ta cho l = g = 1: > g := 1: eq2 := diff(a(t), t, t)+g*sin(a(t))/l = 0; d2 eq2 := 2 θ(t) + sin(θ(t)) = 0 dt
Trường hợp này thay vì cho điều kiện đầu là biên độ ta thử cho là tốc độ. Ta khai báo 6 vận tốc đầu với giá trị thay đổi từ 1 đến 2 (điều kiện sau cùng bằng 1.98). Đoạn chương trình sau sẽ tính và vẽ đường biểu diễn biệ độ và tốc độ: 1
Chỉ số trong hàm fd được chia cho 10 vì giảm vận tốc 10 lần.
Phạm Minh Hoàng
185
Chương 10. Bài toán dao động 2: Con lắc toán học
> 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)) 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 186
Phạm Minh Hoàng
10.1. Con lắc đơn
Hình 10.3: Con lắc đơn với góc quay lớn
(θ(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); Phạm Minh Hoàng
187
Chương 10. Bài toán dao động 2: Con lắc toán học
Trương hợp 3: góc quay lớn với ma sát Dao động bây giờ chịu thêm một lực ma sát fr tỷ lệ với vận tốc, phương trình vi phân có dạng g = l = 1): > eq3:=diff(a(t),t,t)+f[r]*(diff(a(t),t))+g*sin(a(t))/l=0; d2 d eq3 := 2 θ(t) + fr θ(t) + sin(θ(t)) = 0 dt dt
Chọn fr = 1.5 và bốn vận tốc đầu giống như trường hợp không ma sát: > f[r] := 1/5: tk := 1: p := NULL: q := NULL: > v := 1, 1.4, 1.8, 2:
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
> 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. > sd := seq(display([ld(4*i), fd(4*i)]), i = 0 .. 18):[2 ] > display(sd, scaling = constrained); [Hình 10.5 (c)]
Hình 10.5 (a), (b) cho thấy chuyển động chậm dần đến khi tắt hẳn. Hình 10.5 (c) cho thấy chuyển động không đểu (không tuyến tính). Để tạo hình động ta lại phải đi tìm t sao cho 2
Ở đây ta hiển thị một hình trên bốn để thấy rõ chuyển động phi tuyến.
188
Phạm Minh Hoàng
10.2. Con lắc kép
Hình 10.4: Con lắc đơn với góc quay lớn và lực ma sát θ(t) = 0. Ta tìm được t 307. > sd := seq(display([ld(i), fd(i)]), i = 0 .. 307); > display(sd, scaling = constrained);
10.2 Con lắc kép [3 ] Xét con lắc kép bao gồm hai con lắc đơn được nối với nhau như Hình 10.6. Gọi l1 , m1 , l2 , m2 là chiều dài và khối lượng của hai con lắc đơn, u1 , u2 là hai góc quay tương ứng. Trong suốt pàn dưới đây, để dễ đọc, các đại lượng u1, l1, m1 sẽ được viết là u1 , l1 , m1 . Gọi T, V là động năng và thế năng, ta được: > x1 := l1*cos(u1(t)); y1 := l1*sin(u1(t)); 3
Theo [4].
Phạm Minh Hoàng
189
Chương 10. Bài toán dao động 2: Con lắc toán học
.
.y .l1
.u1 .m1 .u2
.l2 .m2
.x Hình 10.5: Con lắc kép "
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)) y2 := l1 sin(u1 (t)) + l2 sin(u2 (t))
(10.2.2)
> T[1] := simplify((1/2)*m1*((diff(x1, t))ˆ2+(diff(y1, t))ˆ2)); > T[2] := (1/2)*m2*((diff(x2, t))ˆ2+(diff(y2, t))ˆ2); $ ( )2 1 d ' 2 ' ' T1 := m1 l u1 (t) ' ' 2 (1 dt ' ' ( )2 ' & 1 d d l1 sin(u1(t)) dt u1(t) l2 sin(u2(t)) dt u2(t) + T2 := m2 2 ' ' ' ( )2 ) ' ' d d ' ' ' l1 cos(u1 (t)) u1 (t) + l2 cos(u2 (t)) u2 (t) % dt dt
(10.2.3)
> V[1] := m1*g*(l1-l1cos(u1(t))); > V[2] := m2*g*(l1+l2-(l1*cos(u1(t))+l2*cos(u2(t))); " V1 := m1 g(l1 l1 cos(u1 (t))) V2 := m2 g(l1 + l2 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
(10.2.4)
V:
> L := T[1]+T[2]-V[1]-V[2]:
Và phương trình Lagrange của hệ là: $ ' ' & ' ' %
190
( d BL ) BL = 0 dt ( B u11 (t) ) B u11 (t) d BL BL = 0 dt B u12 (t) Bu12(t)
(10.2.5) Phạm Minh Hoàng
10.2. Con lắc kép
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: vào. Trước tiên với dt B u11 (t) > 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 d ' 2 2 ' ode := 2ml u2 (t) sin(u1 (t)) u2 (t))+ u1 (t) + ml ' 1 ' dt2 dt ' ' ' ' d2 ' & ml2 2 u2 (t) cos(u2 (t)) u2 (t)) + 2mgl sin(u1 (t)) ( dt )2 ' d ' 2 ' ode := ml u1 (t) sin(u1 (t) u2 (t))+ (10.2.6) 2 ' ' dt ' ' ' ' d2 d2 ' % ml2 2 u1 (t) cos(u1 (t) u2 (t)) + ml2 2 u2 (t) + mgl sin(u2 )) dt dt
Trường hợp 1: góc quay nhỏ, tính toán hình thức Giả thuyết u1 , u2 nhỏ ta có thể viết: sin(u1 ) = u1 , sin(u2 ) = u2 , sin(u1 u2 ) = 0, cos(u1 u2 ) = 1[5 ] > eq1:=subs(sin(u1(t)-u2(t))=0, cos(u1(t)-u2(t))=1,sin(u1(t))=u1(t),ode1); > eq2:=subs(sin(u1(t)-u2(t))=0, 4 5
Các dấu ngoặc nọn ({) trong trang này rất quan trọng. Tùy version và tùy lúc chạy, đôi khi phải thêm điều kiện cos(u2 u1 ) = 1.
Phạm Minh Hoàng
191
Chương 10. Bài toán dao động 2: Con lắc toán học
cos(u1(t)-u2(t))=1,sin(u2(t))=u2(t),ode2); $ 2 d2 ' 2 d u (t) + 2mglu (t) & eq1 := 2ml 2 u (t) + ml 1 1 2 2 2 dt dt 2 2 d d ' % eq2 := ml2 2 u1 (t) + ml2 2 u2 (t) + mglu2 (t) dt dt
(10.2.7)
Để tìm nghiệm của hệ (10.2.7), đặt u1 = H cos(wt), u2 = K cos(wt) : > u1(t):=H*cos(w*t):u2(t):=K*cos(w*t):
> eq1 := subs(cos(w*t) = 1, map(x¡x/(m*l),eq1)); > eq2 := subs(cos(w*t) = 1, map(x¡x/(m*l),eq2)); " 2lHw2 2 lKw2 2 + 2gH lHw lKw + gK
(10.2.8)
Vì H, K bắt buộc khác không nên: > with(linalg):genmatrix({eq1,eq2},{H,K}; [ ] 2 2lw2 +2 2g lw lw lw2 + g
Giải theo w và chỉ chọn nghiệm dương. Các nghiệm được biến đổi chút cho gọn (đưa l vào trong căn)[6 ] > select(i¡sign(i)>0, [solve(det(%), w)]):
> gu := combine(map(x¡x*l/sqrt(lˆ2),%), radical, symbolic); [c ? c1 ? ] 1 (2 + 2)g, (2 2)g gu := l l
Thay các giá trị của w vào (10.2.6). Trước tiên với w = gu[2]:
?
> 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 độ. 6
Trước khi biến đổi có dạng
192
1 l
b
lg(2 +
?
2),
1 l
b
lg(2
?
2) Phạm Minh Hoàng
10.2. Con lắc kép
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
1. > with(plots):with(plottools): 2. > x1:=t¡sin(r1(t)): y1:=t¡-cos(r1(t)): 3. > x2:=t¡sin(r1(t))+sin(r2(t)): 4. > y2:=t¡-cos(r1(t))-cos(r2(t)): 5. > b1:=t¡disk([x1(t),y1(t)],.05,color=black): 6. > b2:=t¡disk([x2(t),y2(t)],.05,color=black): 7. > for i from 0 to 10 by 1/10 do 8. > plot([[0,0],[x1(i),y1(i)],[x2(i),y2(i)]]): 9. > P[i]:=display(%,b1(i),b2(i)); 10. > od: 11. > sq:=seq(P[i/10],i=0..20): 12. > display(sq,scaling=constrained,view=[-2..2,-2.1..0]); 13. > plot([r1,r2],0..10,color=black,linestyle=[1,4]);
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);
Trường hợp 2: góc quay lớn - Tính toán số Trước tiên, ta giải phóng các biến để lấy lại các phương trình trong (10.2.6): > l:='l':g:='g':u1(t):='u1(t)':u2(t):='u2(t)':
Và dĩ nhiên Maple không thể tìm ra lời giải giải tích cho hệ (10.2.6). Ta bước ngay vào tính toán só với các số hiệu tương ứng, và ta chọn hai góc quay ban đầu u1 (0) = u2 (0) = 1: > g:=9.8:l:=1: > F:=dsolve({ode1,ode2,u1(0)=1,u2(0)=1,D(u1)(0)=0,D(u2)(0)=0}, {u1(t),u2(t)},type=numeric);
F là một dãy nhiều phần tử và mỗi phần tử gồm 4 đại lượng (ở đây chỉ hienẻ thị 4 số lẻ): > F(0.5); [ t = .5, u2 (t) = .6712,
B u (t) = 2.4404, u (t) = .2570, B u (t) = 1.8854] 1 Bt 2 Bt 1
Cách sắp xếp các phần tử của F rất bất kỳ và tùy theo mỗi lần chạy chương trình. Để chắc chắn lấy được đúng các giá trị của u1 (t), u2 (t), ta phải làm các lệnh khá phức tạp: > s1:=i¡subs(F(i),u1(t)): > s2:=i¡subs(F(i),u2(t)): > s1(.5),s2(.5); 0.25702286, 0.67122248
Để hiển thị chuyển động dưới dạng tĩnh và động, làm giống như khi góc quay nhỏ: > plot([s1,s2],0..11,color=black,linestyle=[1,4]); [Hinh 10.9 (a)] Phạm Minh Hoàng
193
Chương 10. Bài toán dao động 2: Con lắc toán học
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:
194
Phạm Minh Hoàng
10.2. Con lắc kép
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 . Phạm Minh Hoàng
195
Chương 10. Bài toán dao động 2: Con lắc toán học
Hình 10.8: Chuyển động với u1 (0) = u2 (0) = 1 radian
d 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: Viết lại các công thức và thay ui (t) bằng si (t) và thay > 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 1 T2 := ( sin(u1 (t))v1 (t) sin(u2 (t))v2 (t))2 + 2 cos(u1 (t))v1 (t) + cos(u2 (t))v2 (t))2
V1 := g(1 cos(u1 (t))) V2 := g(2 cos(u1 (t)) cos(u2 (t)))
T, V được khai báo dưới dạng hàm theo t (hàm mũi tên), điều này vô cùng tiện lợi khi tính các giá trị ở một thời điểm bất kỳ. > T:=t¡1/2*v1(t)ˆ2+1/2*((-sin(s1(t))*v1(t)-
sin(s2(t))*v2(t))ˆ2+(cos(s1(t))*v1(t)+cos(s2(t))*v2(t))ˆ2:
> V:=t¡g*(l-cos(s1(t)))+g*(2-cos(s1(t))-cos(s2(t))):
Thí dụ động năng, thế năng và cơ năng của hệ ở t = 0.5 là: > T(.5),V(.5),T(.5)+V(.5); 17.79175211, 6.313285446, 24.10503756
Nếu những gì đã tính là đúng thì cơ năng của hệ ở mọi thời điểm sẽ là một hằng số. Để dễ thấy, chúng ta sẽ vẽ trên cùng một đồ thị đường biểu diễn của động năng T (t) (đường g1 ), thế năng V (t) (đường g2 ) và cơ năng T (t) + V (t) (đường g3 ). Nếu đúng, g1 và g2 phải đối xứng qua một đường thẳng song song với trục Ox đồng thời g3 cũng phải là một đường thẳng song song Ox. Các đường biểu diễn được khai báo dễ dàng dưới dạng dãy. Ta lấy t P [0, 50]: 196
Phạm Minh Hoàng
10.2. Con lắc kép
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. Phạm Minh Hoàng
197
Chương 10. Bài toán dao động 2: Con lắc toán học
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.
10.3 Con lắc đơn đàn hồi Trong chương 9 và 10 chúng ta đã khảo sát riêng biệt lò xo và con lắc đơn. Đến giai đoạn này, đều đương nhiên phải xét tới là phối hợp cả hai vào làm một. Ở đây thay vì sợi dây chiều dài cố định, chúng ta sẽ có một lò xo.
Hình 10.11: Con lắc đơn đàn hồi
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à: (
( ( πx 1 sin 10 plot 2 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: 198
Phạm Minh Hoàng
10.3. Con lắc đơn đàn hồi
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
> display(RR(3, 1), disk([3.15, 1.1], .2), color = gray, RR(1, -1), disk([1.15, -1.15], .2), color = gray, RR(-1, -2), disk([-1, -2.2], .2), color = gray);
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 1 a 2 2 V = mgx(t) + k (x(t)) + (y(t)) l0 2) (( ( )2 ) 2 d d 1 x(t) + y(t) T = m 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
Phạm Minh Hoàng
199
Chương 10. Bài toán dao động 2: Con lắc toán học
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ề hệ phương trình vi phân:
V , chúng ta khai báo lại các mệnh lệnh như trang ?? để đưa
> 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));
200
Phạm Minh Hoàng
10.3. Con lắc đơn đàn hồi $ ' ' ' & ' ' ' %
kx(t)l0 d2 x(t) + kx(t) a mg 2 dt (x(t))2 + (y(t))2 d2 ky(t)l0 mg ode2 := m 2 y(t) + ky(t) a dt (x(t))2 + (y(t))2
ode1 := m
Cho các trị số thích ứng và giải bằng số: > m:=1:g:=10:l0:=1:k:=30: > F:=dsolve({ode1,ode2,y(0)=1.5,x(0)=0, D(x)(0)=0,D(y)(0)=0},{x(t),y(t)},type=numeric):
Vị trí s(t) và vận tốc v(t) của khối m là:
> s1:=i¡eval(x(t),F(i)): s2:=i¡eval(y(t),F(i)):
> v1:=i ¡subs(F(i),diff(x(t),t)): v2:=i ¡subs(F(i),diff(y(t),t)):
Với (s1 (t), s2 (t)) là hoành và tung đọ con lắc, ta vẽ quỹ đạo dễ dạng bằng đường biểu diễn tham số. Nhưng xin lưu ý: tất cả các dữ kiện đều được thiết lập với trục tọa độ như trong Hình 10.13 (a), theo đó y là trục hoành và x là trục tung với chiều dương hướng xuống dưới, nên để có đường biểu diễn trong hệ trục tọa độ quen thuộc ta phải nhân x(t) với (1) đồng thời đổi chỗ hai giá trị x(t) và y(t). Và quỹ đạo của con lắc trong 5 giây đầu là: [Hình 10.14 (a)] > plot([s2,-s1,0..5]);
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;
Phạm Minh Hoàng
201
Chương 10. Bài toán dao động 2: Con lắc toán học
> 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.
Tạo hình động > p:=NULL: for i from 0 to 20 by 1/10 do > display(RR(s2(i),-s1(i))); > p:=p,%; od: > display(p,insequence=true,SC,view=[-2..2,-2.8..0.2]);
Sau khoảng 200 giây (Pentium III, 65M hz) sẽ có một kết quả tuyệt vời, chúng ta có thể xuất phát dưới dạng GIF để sử dụng trong các bài giảng.
Các hướng phát triển cho chủ đề này Nếu đã thấy chuyển động "lộn tùng phèo" của con lắc kép và con lắc đơn đàn hồi, thì chắc chắn chúng ta sẽ dễ dàng tưởng tượng ra mức độ phức tạp khi nó là con lắc kép đàn hồi!. Có hai loại con lắc khác nhau (Hình 10.15). Các công thức dưới đây được trích nguyên văn từ [21]. Hệ tạo độ được xoay 180o , nhưng với những gì đã làm ở trên, hy vọng bạn đọc có thể tạo ra cho mình những thí dụ lý thú. Vì có ba ẩn số (u, x(t), y(t)) -Xem Hình 10.5 -Nên trong hệ Lagrange (công thức (10.2.5) trang??), chúng ta sẽ có ba phương trình: $ ' ' ' ' ' ' & ' ' ' ' ' ' %
( d BL ) BL = 0 dt ( B u1 (t) ) B u(t) d BL BL = 0 dt ( B x1 (t) ) B x(t) d BL BL = 0 dt B y 1 (t) By(t)
(u là góc tạo bởi con lắc đơn m1 và trục tung ) Trong cả hai trường hợp của Hình 10.15 ta đều có ba ẩn số: - góc quay u là góc tạo bởi con lắc đơn m1 và trục tung. - x(t), y(t) là tọa độ của khối m2 . 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
Hình 10.14: Con lắc kép đàn hồi $ ' ' ' ' ' & ' ' ' ' ' %
(( )2 ( )2 ) ( )2 1 d 1 d 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) 1 + k((x(t) l1 sin(u))2 + (l2 + e + y(t) + l1 l1 cos(u))2 ) 2 a kl2 (x(t) l1 sin(u))2 + (l2 + e + y(t) + l1 l1 cos(u))2
Trường hợp b) 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 1 d d T = (m1 + m2 ) x(t) + y(t) + m2 l 2 u(t) 2 dt )(( ) dt ( 2 ) dt ) ( d d d +m2 l2 u(t) u(t) cos(u) y(t) sin(u) dt dt dt 1 V = (m1 + m2 )gy(t) mgl2 cos(u) + k((x(t))2 + (l1 + e + y(y))2 ) 2 a kl1 x(t) + (l1 + e + y(y))2
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.
Phạm Minh Hoàng
203
Chương 10. Bài toán dao động 2: Con lắc toán học
10.4 Bài đọc thêm: Lịch sử số π Nếu phải nói về một hằng số có liên quan mật thiết đến đời sóng con người, mọt hằng só tạo sự qan tâm của cộng đồng Toán học từ thời Cổ đại cho đến ngưỡng của thế kỷ 21, đó chính là số π. Thời Cổ đại. Có lẽ chẳng có ai có thể nói được vào năm nào con người đã khám phá ra só π, nhưng theo những ghi chép còn giữ lại đến ngày hôm nay thì số π xuất hện lần đầu quanh quẩn bên những Kim tự tháp Ai Cập. Theo sử gia Herodote, khi ông ta đến viếng Kim tự tháp Gizeh và năm 450 trước Công Nguyên (viết tắt CN), nghĩa là 2000 năm sau ngày xây Kim tự tháp thì đã có những hình vẽ, những hệ thức liên quan đến số π. Chẳng hạn như nguyên tắc khi xây Km π tự tháp là tỷ lệ chiều cao trên cạnh đáy lúc nào cũng là . Tuy nhiên những tài liệu này khong 2 minh chứng cho sự xuất hiện của só π vì người ta có thể "xào nấu" trên các kích thước của Kim tự tháp để tìm ra một cái gì đó liên quan đến số π. Đến năm 1936, các nhà khảo cổ đã tìm ra một tấm thẻ có liên đại 2000 năm trước Công Nguyên, nghĩa là vào thời Babylone. Tấm thẻ có khắc 24 các hệ thức cho thấy chu vi của một lục giác đều bằng 2πr ñ π(Babylone) = 3.125. Cho 25 đến ngày hôm nay, cộng đồng khoa học công nhận đó chính là những tính toán đầu tiên của số π. Trước đó, vào năm 1855, nhà khảo cổ A.H. Rhind đã đào được tại Luxor (Ai Cập) những ghi chép trên papyrus (một loại giấy được làm từ vỏ cây), theo đó có xác định diện tích một cái đĩa đường kính D = 9 là S = 64, và S sẽ bằng bình phương diện tích của cái đĩa ấy nếu ta bớt D 16 đường kính D đi một đoạn bằng . Điều này có nghĩa là π (Ai Cập)=( )2 = 3.1604... 9 9 Cũng theo các tài liệu cổ thì vào những năm 1200 trước Công Nguyên thì người Trung Hoa đã tính ra rằng π = 3 (có lẽ họ chưa biết đến số lẻ). Nói tóm lại vào những năm tháng ấy con người đã "ngờ ngợ" có cái gì liên hệ giữa chu vi và đường kính một hình tròn. "Cái gì đó" xấp xỉ 3 nhưng không rõ chính xác nó là bao nhiêu và lại càng không biết tại sao nó phải là như thế. Phải đợi đến năm 287 trước Công Nguyên với sự xuất hiện của "ông tồng cồng" thì con người mới biết rõ ràng hơn về con số π. Archimede đã dùng tính chất vòng tròn nội và ngoại tiếp một đa giác đều để chứng minh. Trước tiên ta xét một ngũ giác đều ngoại tiếp một hình 2π z chắn 1/5 chu vi hình tròn và bằng tròn bán kính r = 1. AOB . 5
.A .O .
.B Hình 10.15:
204
Phạm Minh Hoàng
10.4. Bài đọc thêm: Lịch sử số π
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 z z ñ sin(AOB) AM 1 tan(AOB) ñ sin( π5 ) π5 tan( π5 ) ñ 5 sin( π5 ) π 5 tan( π5 )
.A1
.A .O . .M
.M 1
Hình 10.16: Và trong trường hợp ngiác đều: π n sin( ) π n
n tan( πn )
(10.4.1)
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 10 100 1.000 10.000
π n sin( ) n 3.090169944 3.141075908 3.141587486 3.141592602
π n sin( ) n 3.249196963 3.142626605 3.141602989 3.141592757
Trung Bình 3.169683454 3.141851256 3.141595237 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. Phạm Minh Hoàng
205
Chương 10. Bài toán dao động 2: Con lắc toán học
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 Somayaji (1444-1545) đã tìm ra công thức đầu tiên về chuỗi:
π=
?
12
8
(1)n (2n + 1)3n n=0 ¸
Để kiểm chứng bằng Maple: > f:=evalf(sqrt(12)*Sum((-1)ˆn/((2*n+1)*3ˆ),n=0..infinity)); f:=3.141592654
(10.4.2)
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 1 π = arctan ? 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.
206
Phạm Minh Hoàng
10.4. Bài đọc thêm: Lịch sử số π
Viete
(1540 1603)
Wallis
1665
Machin
1706
Leibniiz
(1646 1716)
Euler
(1707 1783)
2 2 2 b π = 2? a ? a ? ... 2 2+ 2 2+ 2+ 2 2 ± 4n π=2 8 n=1 4n2 1 1 1 π = arctan( 4 arctan( 5 239 ±8 1 π = 8 n=1 (4n + 1)(4n + 3) ±8 1 2 π = 6 n=1 2 n
16 số lẻ 100 số lẻ
20 số lẻ trong 1 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": 9801 π= ? 8
(
8 (4n)!(1103 + 26390n) )1
¸
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". Phạm Minh Hoàng
207
Chương 10. Bài toán dao động 2: Con lắc toán học
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.
208
Phạm Minh Hoàng
Chương11 Số học và ứng dụng 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.
11.1 Tóm tắt lý thuyết 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
> gcd(42, 24); 6
Hai số được gọi là nguyên tố cùng nhau khi ước số chung lớn nhất của chúng là 1. Thí dụ: 24 và 7 > gcd(24, 7); 1
Thuật toán Eculide: Dùng để tìm ước chung lớn nhất của hai số. a 19 7 5 2
b
7 5 2 1 ⃝
2 1 2 2
r 5 2 1 0
Thí dụ: để tính gcd(19, 7). Ta có ở hàng thứ nhất 19 = (7 2) + 5. Đem 7 xuống cột a và 5 xuống cột b ở hàng thứ 2, ta có 7 = (5 1) + 2 và cứ tiếp tục như thế cho đến khi r = 0. Khi đó ước số chung lớn 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.
(a, b) = f
ñ D(u, v), f = au + bv
Lệnh Maple tương ứng của định lý Bezout: > igcdex(28, 12, 'u', 'v'), u, v; 4, 1, 2
Ước chung lớn nhất của 28, 12 là 4, u = 1, v = 2 và 4 = 28 2 12 Mặt khác ta cũng có thể tính (u, v) từ một cách mà người ta hay gọi là thuật toán Eculide mở rộng. Lấy lại thí dụ gcd(19, 7) của bảng trên ta có thể viết: 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)
Vậy: u = 3, v = 8. Kiểm chứng: > igcdex(19, 7, 'u', 'v'), u, v; 1, 3, 8
Phép chia Eculide trong Z /mZ Phép tính đồng dư
Gọi a và m là hai số nguyên , m 0. Sẽ có và chỉ có một cặp số nguyên (q, r) sao cho a = mq + r(0 ¤ r 210
|m|)
(11.1.2)
Phạm Minh Hoàng
11.1. Tóm tắt lý thuyết
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: a r[m] hay a = r mod m 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] Tính chất đồng dư "
a1 a2
b1[m] ùñ b2[m]
"
a1 + a2 a1 a2
Nhưng không phải lúc nào ta cũng có
$ &
Thídụ :
Nhưng :
%
14 8[6] 8 2[6] 20 6[7]
$
ùñ
14 8[6] ùñ
' & ' %
a1 k
b1 + b2[m] b1b2[m]
(11.1.3)
bk1 [m]
14 + 8 = 22 8 + 2 = 10[6] 14 8 = 112 8 2 = 16[6] 20 6 = 10 = 3[7] 2 2
14 8 = 7 = 4[6] 2 2
(11.1.4)
(11.1.5)
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 a ¯ được gọi là phần tử đảo của a[m] khi và chỉ khi a¯ 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 Phạm Minh Hoàng
211
Chương 11. Số học và ứng dụng
Ứng dụng của phép tính đồng dư Tính số dư trong các con số lớn:
Thí dụ 1: Tính số dư của phép chia 753/7.
Số dư x của phép chia này là 753 x[7]. Ta có: 753 = 700 + 53; 700 0[7]; 53 4[7]
Vậy 753 4[7]. Số dư là 4.
Thí dụ 2: Tính số dư của phép chia 3343 1771 trong Z /4Z Ta có:
ùñ
3 1[4], 17 1[4] 3 1771 (1)343 171 [4] (1)[4] 3[4] 343
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 . . . Tính số đơn vị trong các con số lớn:
Đây đơn thuần là phép chia cho 10 hay là tính số dư trong Z /10Z Thí dụ: Tính số đơn vị của 19971996 19971997 [10]
71996[10] (3)1996[10] (32)998[10] 9998[10] (1)998[10] 1[5]
Số đơn vị là 1. Trong trường hợp này (Z /10Z ), ta cần tìm ra 9, 19, 29, 39 . . . Giải phương trình đồng dư ax b[m]:
1 ax b[m] ùñ x b¯ a[m] với điều kiện a khả đảo nghĩa là a ¯ [m] a Thí dụ: Giải phương trình đồng dư 19x 6[7]
Ta cần có phần tử đảo của 19 là 3[7], do đó x 6 3[7] 18[7] 4[7] Vậy x P t4 + 7k, k
P Z.
Kiểm chứng bằng Maple qua lệnh isolve, ta giải phương trình 19x 6 = 7k > isolve(19*x-6=k*7); x = 4 + 7 Z1, k = 10 + 19 Z1
> f:=unapply(%, Z1):f(0); x = 4, k = 10
> seq(4+7*i, i=-5..4);
31, 24, 17, 10, 3, 4, 11, 18, 25, 32
Tất cả 10 giá trị trên đều nghiệm đúng phương trình 19x 6[7]: 212
Phạm Minh Hoàng
11.1. Tóm tắt lý thuyết
> seq(((4+7*i)*19-6)/7, i=-5..4);
85, 66, 47, 28, 9, 10, 29, 48, 67, 86 "
Giải hệ phương trình đồng dư
a1 x + a2 y u[m] b1 x + b2 y v[m]
Cũng giống như phương trình đồng dư, hệ chỉ có lời giải khi các hệ số (a1 , a2 , b1 , b2 ) khả đảo trong Z /mZ , và giải như phương trình trong Z . Tuy nhiên ta cũng có thể giải bằng Maple với các lệnh ma trận. "
Thí dụ: Giải hệ phương trình đồng dư
3x + 2y 4x y
3[7] 1[7]
> with(linalg): > p:=matrix([[3, 2], [4, -1]]): > u:=Inverse(p) mod 7: p=eval(p), u=eval(u);
[ 3 p= 4
] [ ] 2 2 4 1 , u = 1 1
> map(i¡ mod 7, evalm(u&*[3, 1])); [3, 4]
Vậy lời giải là x P t3 + 7k u, y
P t4 + 7ku(k P Z ).
Định lý Trung Quốc Đọc các truyện như Đông Chu Liệt Quốc, Tam Quốc Chí, Hán Sở Tranh Hùng... ta đã thấy cách đây 20 thế kỷ các nhà quân sự Trung Quốc đã biết nhìn sao, bấm độn để biết thời tiết cũng như biết...tình hình địch quân(!). Đấy chỉ là những thêu dệt mang tính hoang đường và cường điệu. Nhưng điều chắc chắn là ngay từ thuở xa xưa, các nhà thiên văn Trung Quốc đã biết quan sát vũ trụ, tính chu kỳ các thiên thể cũng như phát minh ra âm lịch. Để 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. Định lý 11.1.2 Cho hệ phương trình đồng dư: $ ' x a1 [m1 ] ' ' & x a2 [m2 ] (mi P N zt0, 1u, ai P Z ) .. ' . ' ' %
x an [mn ]
Gọi (mi , mj ) = dij . Hệ phương trình trên có nghiệm khi và chỉ khi dij |ai aj
@i, j(i j)
Phạm Minh Hoàng
213
Chương 11. Số học và ứng dụng
và nghiệm có dạng: x a1 M1 e1 + a2 M2 e2 + . . . an Mn en [m1 m2 . . . mn ] [ ]
i=n ¸
(11.1.6)
i=n ¹
ai Mi ei i=1
mi i=1
±
với Mi =
mi và ei là số đảo của Mi [mi ] mi
x 3[13] x 7[8] % x 2[9] M1 = 8 9 = 72, M2 = 13 9 = 117, M3 = 13 8 = 104 $ &
Thí dụ 1: Tìm lời giải của hệ
Bằng thuật toán Eculide mở rộng ta có: 2
1 1 1 [13], 5 [8], 2 [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] x 7[12] Thí dụ 2: Tìm lời giải của hệ % x 3[8] 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[3] / . & & x 3[17] x 7[3] x 7[12] ùñ x 7[4] x 7[3] ùñ ñ " / ' x 3[4] % / ' x 3[4] / x 3[4] % / x 3[2] x 3[8] ùñ 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 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. 214
3[4] còn
Phạm Minh Hoàng
11.1. Tóm tắt lý thuyết "
Thí dụ 3: Tìm lời giải của hệ
x 5[6] x 2[9]
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] thay x 2[3] bằng x 2[9] và hệ trở thành x 2[9] Bằng thuật toán Eculide mở rộng ta có: 1 1 1 [2], 4 [9] 9 2 ùñ x 9 (2 2 4) 7[18] 11[18] Vậy lời giải là 11 + 18k. Kiểm chứng bằng Maple. Trước tiên nếu dùng hàm chrem ta được: > chrem([5,2], [6,9]) Error, (in chrem) the modular inverse does not exist
Đ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 Phạm Minh Hoàng
215
Chương 11. Số học và ứng dụng
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
216
Phạm Minh Hoàng
11.2. Mật mã
> 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:
0
a 1 n 14
b 1 o 15
c 3 p 16
d 4 q 17
e 5 r 18
f 6 s 19
g 7 t 20
h 8 u 21
i 9 v 22
j 10 w 23
k 11 x 24
l 12 y 25
m 13 z 26
Bảng 11.1: Bảng hoán chuyển mẫu tự ÐÑ số
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 5
Đừng quên hai dấu { } Vì thế dương lich còn được goi là lịch julien
Phạm Minh Hoàng
217
Chương 11. Số học và ứng dụng X := [22, 1, 14, 0, 8, 15, 1, 0, 7, 9, 1, 15, 0, 4, 21, 3]
> f:=i¡irem(i+3,27); > Y:=map(f,X);
Y := [25, 4, 17, 3, 11, 18, 4, 3, 10, 12, 4, 18, 3, 7, 24, 6]
> subs(NA,Y) ["y ", "d", "q ", "c", "k ", "r", "d", "c", "j ", "l", "d", "r", "c",
"g ", "x", "f "] > Z:=map(cat,op(%)); Z := "ydqckrdcjldrcgxf "
Để giải mã, ta thực hiện lại đúng những lệnh trên bằng cách thay vb bằng Z, và hàm f (x) bằng hàm g(y): g : y ÝÑ x y 3 mod 27[6 ] ta dễ dàng tìm lại văn bản gốc. Như thế giữa việ mã và giải mã chỉ khác nhau ở một điểm duy nhất đó là hàm f (x) hoặc g(y), vì thế ta có thể gom tất cả vào một chương trình 3 tham số gồm: văn bản, khóa và sau cùng là một biến cho phép mã hoặc giải mã. Bây giờ ta phức tạp mã César bằng cách dùng hàm: 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: g:y
ÝÑ x y b¯a mod 27
dĩ nhiên g(y) chỉ xác định khi a ¯ hiện hữu hay (a, 27) = 1 Ta cũng có thể dễ dàng gom chung hai công đoạn vào một chương trình có 4 tham số: văn bản, khóa (a, b) một biến cho phép mã hoặc giải mã. ∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
cesar:=proc(vb, k, u) local f:f:=i¡(i+u*k) mod 27; [seq(vb[i], i=1..length(vb))] subs(AN, %); map(f, %); subs(NA, %); map(cat, op(%)); end:
cesar2:=proc(vb, a, b, u) local f, g, ya, h: ya:=1/a mod 27: f:=i¡(a*i+b) mod 27; g:=i¡(i-b)*ya mod 27: if u=1 then h:=f else h:=g: fi: [seq(vb[i], i=1..length(vb))] map(h, subs(AN, %)); map(cat, op(subs(NA, %))); end:
Bảng 11.2: Chương trình mã César > p:="rendez a cesar ce qui est a cesar":[7 ] 6 7
Lý do vì lệnh irem có thể cho những giá trị âm Hãy trả cho César những gì thuộc về César
218
Phạm Minh Hoàng
11.2. Mật mã
> cesar2(p,2,7,1); cesar2(%,2,7,-1); "pqhoqegigmqripgmqgnvygqrtgigmqrip" "rendezacesarcequiestacesar" Bảo Mật. Tính bảo mật của mã César không cao vì hai cách mã đều là những song ánh,
tuyến tính và tối đa chỉ có 27 cách mã khác nhau. Chỉ cần biết lập trình sơ sài là "bẻ khóa" dễ dàng. Thậm chí chỉ băng một công cụ thủ công là hai đĩa đồng tâm, một đĩa ghi mẫu tự, đĩa kia ghi số. Người ta chỉ cần "mày mò" một tý bằng cách giữ cố định một đĩa và xoay đĩa kia là giải mã dễ dạng.
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] Thí dụ với u = 2 và với hệ y2 cx2 + dx2 [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 x1 a b A x2 mod m với A = c d y2 Và giả mã bằng: [ ] [ ] x1 1 y1 A y2 mod m x2 Ma trận A được gọi là khóa của bài toán. ( ) ( 1 7 1 3 1 ,A = Giả sử với chữ v = 22 và a = 1, A = 2 7 13 2 ] [ ] [ ] [ y1 25 22 và =A = y2 1 37 [ ] [ ] [ ] x1 25 22 1 A = x2 37 1
)
3 1
ta có:
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 ...) Phạm Minh Hoàng
219
Chương 11. Số học và ứng dụng
> 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] văn bản gốc văn bản mã
v y
a q
n n
z
h z
o h
a a
y
g g
i v
a s
o v
l
d a
u c
c f
Bảng 11.3: Kết quả mã khối.
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,[%]);
220
Phạm Minh Hoàng
11.2. Mật mã [
124 67 20 54 158 60 68 27 17 36 67 60 81 25 3 12 Y = , , , , , , , , , , , , , , , 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 > Z:=map(i¡(imod27),Y);
]
Z := [22, 1, 14, 0, 8, 15, 1, 0, 7, 9, 1, 15, 0, 4, 21, 3]
> Z:=subs(NA,%); Z := ["v ", "a", "n", "", "h", "o", "a", "", "g ", "i", "a", "o", "",
"d", "u", "c"] > map(cat,op(%)); "vanhoagiaoduc"
Bây giờ ta đặt tất cả vào trong một chương trình có tên cube. cube có ba tham số là văn bản, ma trận khóa và một biến để cho biết phải mã hoặc giải mã. ∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
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:
Bảng 11.4: Chương trình mã khối Thí dụ với hai ma trận bậc 3, ma trận M1 có (det(M1 ), 27) = 1 và ma trận M2 có (det(M2 ), 27) 1: > M1:=matrix([[1,2,-1],[9,3,2],[-2,1,-1]]); > M1:=matrix([[1,1,2],[9,3,2],[-2,1,-1]]); > M[1]=eval(M1),det(M1),M[2]=eval(M2),det(M2); ] ] [ [ 1 1 2 1 2 1 M1 = 9 3 2 , 10, M2 = 9 3 2 , 30 2 1 1 2 1 1 > mot:="cung chuc tan xuan":
> cube(mot,M1,1):%,cube(%,M1,-1); "djadojtf blhsqlbidz ", "cungchuctanxuan" > cube(mot,M2,1):%,cube(%,M2,-1); "yjamojhf bvhshlbwdz ", "ucnyiczcctaeixljn"
Rõ ràng là khi det(M2 ) không nguyên tố cùng nhau với 27 kết quả thu được sai vì ta không tìm lại được văn bản gốc. Hai phương pháp mã mà chúng ta vừa khảo sát là César và mã khối xếp vào họ các mã theo chìa khóa bí mật. Được gọi như thế cũng dễ hiểu vì cả hai phía gửi và nhận đều phải giữ kín chìa khóa này, nếu để lộ thì việc trao đổi thông tin sẽ không còn được bảo mật. Phạm Minh Hoàng
221
Chương 11. Số học và ứng dụng
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 Tính n = pq, m = (p 1)(q 1) Cho e P N , (m, e) = 1. Tính d P Z , e.d 1[m]
, / / . / / -
ùñ @(x, y) P Z 2, y = xe[n] ô x = yd[n]
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)
x = y d [n]
(11.2.3)
Để giải mã một mẫu tự (sau khi đổi thành số):
(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. 222
Phạm Minh Hoàng
11.2. Mật mã
Thí dụ: Mã hóa câu "van hoa giao duc". Trước tiên ta chọn p = 7, q = 137 ùñ n = 2329, m = 2176. Chọn e = 31, thuật toán Euclide mở rộng cho ta d = 351. Vậy nếu gọi hàm f (x) là hàm mã và hàm g(y) là hàm giải mã, ta được: > f := x¡ xp31 mod 2329; g := x¡ xp351 mod 2329; f := x ÞÑ x31 mod 2329
g := x ÞÑ x351 mod 2329
Công đoạn 1 biến văn bản gốc thành số trong cơ số 27 > goc:="van hoa giao duc": > goc2:=[seq(goc[i],i=1..length(goc))]; > X:=subs(AN,goc2); X := [22, 1, 14, 0, 8, 15, 1, 0, 7, 9, 1, 15, 0, 4, 21, 3]
> N1:sum(%i*27p(i 1),i=1..nops(%)); N 1 := 11177030774433958008007
Công đoạn 2: Mã trong cơ số n > convert(N1,base,2329); [486, 323, 1262, 1692, 943, 79, 70]
> map(f,%); [114, 1785, 880, 1838, 49, 932, 1726]
> N2:sum(%i*2329p(i 1),i=1..nops(%)); N 2 := [275523346071718557966724]
Công đoạn 3: Biến đổi sang cơ số 27 trước khi chuyển thành mẫu tự > convert(N2,base,27); [22, 26, 1, 6, 25, 7, 1, 15, 14, 10, 25, 4, 15, 1, 7, 12, 3]
> sub(NA,%); > msg:=map(cat,op(%)); msg := "vzaf ygaonjydoaglc"
Để giải mã, cũng giống như mã César và mã khối, ta chỉ việc lập lại tất cả các công đoạn trên sau khi thay văn bản gốc bằng văn bản mã và f (x) bằng g(y). Sau cùng ta gom chung tất cả vào một chương trình có tên RSA. Chương trình RSA có ba tham số: văn bản (gốc hoặc mã), số e (hoặc d), và n: Bây giờ chúng ta thử chương trình RSA với một khóa công khai khác. Ta lựa chọn ngẫu nhiên hai số nguyên tố p, q bằng lệnh nextprime > nextprime(45), nextprime(835); 47, 839
Ta được n = 47 839 = 49433, m = 46 838 = 38548. Chọn ngẫu nhiên e = 125 lệnh igcdex cho phần tử đảo d[m] (d có thể âm). > igcdex(125,38548,'a'),a; 1, 4009
(11.2.4)
> mot:="ly thuyet ma khoa cong khai": Phạm Minh Hoàng
223
Chương 11. Số học và ứng dụng
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
RSA:=proc(mot, u, n) local f,NB:NB:=27; f:=x¡xˆu mod n: [seq(mot[i],i=1..length(mot))] subs(AN, %); sum(%i*NBˆ(i-1),i=1..nops(%)); map(f, %); sum(%i*nˆ(i-1),i=1..nops(%)); convert(%,base,NB); subs(NA, %); map(cat, op(%)); end:
expo:=proc(m,e,n) local L,f,r,i: L:convert(e,base,2) f:=m mod n: if L[1]=1 then r:m else r:1: fi: for i in subsop(1=NULL,L) do f:=fˆ2 mod n: if i=1 then r:=(r*f) mod n: 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 224
Phạm Minh Hoàng
11.2. Mật mã
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.
Phép bình phương liên tiếp Một trong những điều quan trọng khi lấy p, q ngẫu nhiên là phải chọn những số lớn để bảo mật và như thế n sẽ lớn. Thí dụ p, q gồm 20 chữ số , n sẽ có 40 chữ số đưa đến hậu quả là mất nhiều thời gian để tính hai công thức y xe [n] và x y d [n]. Để giải quyết, chúng ta phải dùng đến phép bình phương liên tiếp: Nếu nhân trực tiếp a13 = a a a a a . . . ta mất 13 phép nhân. Nhưng khi viết: 13 a = a1+4+8 ta chỉ cần bình phương liên tiếp 3 lần sau đó nhân các kết quả ở những lũy thừa 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 Phạm Minh Hoàng
225
Chương 11. Số học và ứng dụng
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ể giả mạo chữ ký người khác 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 ) B giải mã thêm lần nữa bằng mã công khai của A (na , ea )
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 351 ga := x ÞÑ x mod 2329 gb := x ÞÑ x1847 mod 4393 8 9
Chương trình expo không chấp nhận d 0 nên phải lấy modulo theo m Con số này có thể thay đổi theo só lần thực hiện
226
Phạm Minh Hoàng
11.2. Mật mã
Dùng lại các lệnh cũ ta được: > goc:="chu ky dien tu rsa": > goc2:=[seq(goc[i],i=1..length(goc))]; > X:=subs(AN,goc2); X := [3, 8, 21, 0, 11, 25, 0, 4, 9, 5, 14, 0, 20, 21, 0, 18, 19, 1]
> n:=sum(%[i]*27ˆ(i-1),i=1..nops(%)); n := 3722522118728157707349423
Mã lần thứ nhất trong cơ số na 2329 nên trước tiên phải biến đổi số n vừa có sang 2329, sau đó mã lần thứ hai trong nb = 4393 nên phải tìm lại số n trong cơ số 4393 10 > convert(n,base,2329); [637, 1671, 2160, 2215, 1874, 2166, 34, 10]
> map(ga,%); [1528, 58, 1463, 1843, 472, 770, 1904, 233]
> map(fb,%); [191, 3613, 4237, 514, 4096, 136, 55, 1572]
> n:sum(%[i]*4393ˆ(i-1),i=1..nops(%)); n := 49634588465268377202756366854
Biến đổi sang cơ số 27 để chuyển sang mẫu tự la-tinh > convert(n,base,27); [23, 18, 12, 20, 6, 24, 26, 4, 13, 25, 9, 7, 25, 2, 18, 26, 6, 15, 16, 4, 1]
> msg:=map(cat,op(subs(NA,%))); msg := "wrltf xzdmyigybrzf opda"
Để giải, ta lặp lại các lệnh trên nhưng đảo ngược các con số trong phần mã: > convert(n,base,4393); > map(gb,%); map(fa,%); > n:=sum(%[i]*2393ˆ(i-1)..nops(%));
Và sau cùng ta có thể gom vào một chương trình RSA3 với 5 tham số: văn bản (mã hoặc giải mã), khóa bí mật của mình, khóa công khai của người kia: Với: (n, d) là khóa bí mật của mình (nb, eb) là khóa công khai của người kia.
Lấy lại các con số của A và Ban (na , ea ) = (2329, 31), da = 351 (nb , eb ) = (4393, 43), db = 1847
A gởi cho B câu sau: > word:="i disapprove of what you say but i will defend to the death your right to say it":[11 ] 10 11
Lưu ý quan trọng: Trong chữ ký RSA lhi A gởi cho B, điều kiện cần thiết: na nb Tôi không đồng ý với những gì bạn nói nhưng tôi sẵn sàng chết để bạn được nói lên điều ấy. (Voltaire)
Phạm Minh Hoàng
227
Chương 11. Số học và ứng dụng
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
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);
Vài lưu ý khi chon khóa RSA: 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. 228
Phạm Minh Hoàng
11.3. Bài đọc thêm Bẻ khóa RSA: Con đường chông gai
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: π(x) ¡
x 21/2 31/3 51/5 ln ln(x) 301/30
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 ...
Phạm Minh Hoàng
229
Chương 11. Số học và ứng dụng
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
230
Phạm Minh Hoàng
Chương12 Xử lý hình động 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
12.1 Chuyển động đơn giản 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 insequence=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);
232
Phạm Minh Hoàng
12.1. Chuyển động đơn giản
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
Vì chong chóng có 3 cánh nên góc giữa hai cánh là Phạm Minh Hoàng
2π , hay nói cách khác, khi chong chóng 3 233
Chương 12. Xử lý hình động
2π = 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)]: quay, một cánh vẽ đến vị trí của cánh đi trước sau khi quay một gó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);
12.2 Chuyển động phức tạp Trong trường hợp này ta có tối thiểu hai chuyển động. .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. 234
Phạm Minh Hoàng
12.2. Chuyển động phức tạp
Để vẽ hình trên. ta dùng lệnh dưới đây và giả sử r = 0.5. > display(circle([0,1/2],1/2), disk([1/2*cos(Pi/6),1/2*sin(Pi/6)],.03),SC);
Khai báo chuyển động của bánh và van xe Vì bánh xe lăn trên trục Ox nên phương trình của nó là: > cr:=t¡circle([t,r],r);
Và k chuyển động của nó là:
> q:=k¡seq(cr(i),i=0..k);
(12.2.1)
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
Ghép bánh xe và van Trước tiên ta xác định tọa độ của van trong hệ trực chuẩn xOy. Xét một bánh xe bán kính r, van xe gắn tại M . Vào thời điểm đầu, tâm C ở [0, r]. Sau khi lăn một góc t, tọa độ của M là cung P M = OP = rt: Phạm Minh Hoàng
235
Chương 12. Xử lý hình động "
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 x = r(π arccos( )) r 1 r r2 > plottools[reflect](plot(subs(r=1,rhs(eq)),y=0..5), c
[[0,0],[1,1]]);
Tạo hình động Để tạo hình động chung cho bánh xe và van - ta lưu ý rằng khi bánh xe di chuyển một đoạn thẳng u = OP thì van đã quay được một góc α sao cho cung rαu ñ α = ur . Vậy nếu ta đã dùng t là độ dài mà bánh xe lăn được (thay cho k trong biểu thức 12.2.1) thì tọa độ của van tương ứng với phương trình cycloid, ta phải chia t cho bán kính r để lúc nào van cũng "dính" trên vành bánh xe: > s:=i¡seq(disk([r*t/r-r*sin(t/r),r-r*cos(t/r),.05]),t=0..i):
Giả sử t quay được 3 vòng (bánh xe quay 3 vòng) thì đoạn thẳng tương ứng là 3 2πr ≈ 19r. Với r = 4, ta có chuyển động riêng của van xe: > display(s(19*r),SC); 1
vì Maple không thể làm ngược lại
236
Phạm Minh Hoàng
12.2. Chuyển động phức tạp
Hình 12.6: Chuyển động của van xe trong 3 vòng quay
Ghép chung hai chuyển động: > display([q(19*r),s(19*r)], insequence=true,SC); > display([q(19*r),s(19*r)],SC);
Ta thấy kết quả không như ý muốn. (Ở lệnh trên với dấu []), ta được hai chuyển động lần lượt. Bánh xe quay hết đoạn 19r rồi đến van. Ở chuyển động thứ hai (với dấu {}) còn thê thảm hơn, bánh xe hiện ra một hình rồi đến van xe một hình. Cứ thế cho đến khi hết. Trông hoa hết cả mắt! Để hai chuyển động xảy ra đồng thời, phải khai báo chung trong một dãy seq: > p:=i¡seq(display( cr(t),disk([r*t/r-r*sin(t/r),r-r*cos(t/r),.05])),t=0..i); p := i ÞÑ seq(display( t t cr(t), disk([t r sin( ), r r cos( ), .05])), t = 0..i) r r
(12.2.2)
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ú.
Phạm Minh Hoàng
237
Chương 12. Xử lý hình động
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.
Khai báo chuyển động của từng xe Thí dụ này có phần phức tạp hơn thí dụ 1 vì nếu chỉ xét riêng một hình tĩnh thì thí dụ 1 có hai chuyển động (bánh xe và van xe) và mỗi chuyển động có một chi tiết. Trong trường hợp này cũng chỉ có hai chuyển động (hai xe) nhưng mỗi chuyển động có tới 4 phần tử: thùng xe, hai bánh và tên xe. Vì thế trước tiên ta phải khai báo từng chi tiết này trước khi "ráp" chúng lại với nhau. Dùng lệnh polygon để vẽ thùng xe (biến v1 ), lệnh disk dùng để vẽ hai bánh xe. Bánh trước r1 , bánh sau s1 . Biến n1 dùng để vẽ chữ A hoặc B lên thùng xe. Tất cả các khai báo đều dưới dạng hàm mũi tên với biến i là hoành độ đuôi xe. > v1:=i¡polygon([[i,1.2],[i+1.5,1.2],[i+1.5,.7],[i+2,.7],
[i+2,.2],[i,.2]]):
> r1:=i¡disk([i+.5,.2],.2,CW): s1=:i¡disk([i+1.5,.2],.2,CW): > n1:=i¡(textplot([i+.9,.8,"A"],font=[COURIER,BOLD,14])):
Để ráp 4 phần này:
> f1:=i¡display(v1(i),r1(i),s1(i),n1(i)):
Và 4 hình tĩnh của chuyển động [Hình 12.7 (a)] là: > seq(f1(1.5*i),i=1..4): display(%,SC);
Hình 12.7 (a) tượng trưng cho một chuyển động đều với khoảng cách thời gian là 1.5. Tuy nhiên ta cũng có thể tạo ra một chuyển động với những khoảng cách thời gian bất kỳ [Hình 12.7 (b)] (nhớ dùng móc vuông trong trường hợp này): > seq(f1(i),i=[1,2.4,4.3,6.4]): display(%,SC);
Hình 12.7: 4 chuyển động với khoảng cách thời gian (a) đều và (b) không đều
238
Phạm Minh Hoàng
12.2. Chuyển động phức tạp
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):
Ghép hai chuyển động Cũng giống như thí dụ 1, chúng ta ghép hai chuyển động bằng cách gom chúng vào trong các lệnh display và cũng thu nhận được các kết quả ngoài ý muốn. Lệnh đầu tạo ra hai chuyển động lần lượt và lệnh thứ hai thì cũng...hoa cả mắt > display([g1,g2],SC,IT); > ff:=seq([f1(i/5),f1(i/5)],i=1..50): > display(ff,IT,SC);
Để giải quyết ta cũng phải khai báo chung trong một dãy. Và đặc biệt, ở đây chúng ta cho xe B chạy nhanh hơn xe A bằng cách chia nhỏ thời gian và thay đổi thời lượng để các xe vẫn đi hết cùng một khoảng cách: > ff:=seq(display([f1(i/5),f2(i/4)]),i=1..40): > display(ff,IT,SC);
Xem kết quả trên màn hình thì xe B chạy nhanh hơn, đuôi xe đến hoành độ 10 = 40 trong 4 40 khi xe A mới đến hoành độ 8 = 5 [Hình 12.8 (a)]. Ta có thể ví mẫu số như nghịch đảo với vận tốc của xe. Xem hình động thì ta thấy cả hai xe đều ngừng khi một trong hai "cán mức đến" hay nói khác đi, một trong hai xe thực hiện xong dãy thời gian i = 1..40. Cái chúng ta muốn bây giờ là dù nhanh hay chậm, trước hay sau cả hai xe đều phải cán mức. Có nghĩa là sau khi xe B đến đích thì xe A vẫn tiếp tục chạy cho đến khi cán mức. Ta lý luận như sau: chuyển đông chấm dứt khi i đạt vị trí cực đại (ở đây là 40), lúc ấy đuôi xe B đến 10. Vậy thì ta cứ để chi i chạy đến bao nhiêu cũng được rồi ta ngưng chuyển động khi cả hai đuôi xe đến 10. Để làm được điều này ta chỉ cần lấy cực tiểu của 5i hoặc 4i và 10. Nói i chạy đến bao nhiêu cũng được nhưng trên thực tế, và đúng nhất là ta lấy 5 40 = 50, vì với trị 4 này cả hai đều đã đến đích. Sau cùng ta được: > ff:=seq(display([f1(min(10,i/5)),f2(min(10,i/4))]),i=1..50): > display(ff,IT,SC);
Lưu ý: Để lưu một hình tạo từ Maple vào một file thì bình thường ta nhấp nút bên phải chuột vào hình và dùng export để xuất ra file dưới dạng muốn lưu (jpg, bmp, eps). Nhưng điều này chỉ đúng với hình tĩnh, nếu ta làm như thế với hình động thì ta sẽ có hình tĩnh đầu tiên, thường thì không đúng như ý muốn. Nếu muốn có một hình như ý muốn, thì chỉ có cách tạo ra Phạm Minh Hoàng
239
Chương 12. Xử lý hình động
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.
12.3 Chuyển động có sự thay đổi vận tốc Thay đổi đều Được gọi là thay đổi đều khi vận tốc đối tượng thay đổi và được giữ nguyên cho đến hết chuyển động. Đó là trường hợp của chiếc xe mà ta thấy trong phần trên. Bây giờ chúng ta sẽ thay đổi thí dụ chóng chóng 3 cánh trong mục (12.1.3), trang(...). Để tạo hình động, ta phải khai π = 100 và như thế phải 12 lần (từ 0 đến 11) để cánh quạt đi xong một chu báo một phép quay 18 2π 0 kỳ 120 = 3 : > p:=polarplot(cos(3*t),t=0..Pi,SC): > f:=i¡rotate(p,i*Pi/18):
> display(seq(f(i),i=0..11),IT,SC);
Nguyên tắc thay đổi vận tốc rất đơn giản, thí dụ để tăng vận tốc lên 2 lần, ta cho chong π π = 100 mà là 2 18 = 200 và đồng thời chỉ 6 lần quay là xong chóng quay mỗi lần không phải 18 1 chu kỳ thay vì 12 như vận tốc bình thường. Tóm lại: > display([seq(f(2*i),i=0..11/2)],SC,IT); 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ý.
240
Phạm Minh Hoàng
12.3. Chuyển động có sự thay đổi vận tốc
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 (Maple chỉ lấy số nguyên 2 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: fp(2) để chong chóng quay nhanh gấp 2 lần fp(1/3) để chong chóng quay chậm gấp 3 lần
Thay đổi không đều - Thí dụ 1 Đôi khi cách "chia đều thời gian" như trên lại không biểu diễn chuyển động một cách trung thực, chẳng hạn những chuyển động tuần hoàn. Thí dụ, chúng ta muốn quan sát chuyển động của hàm f (x) = sinn x , (x P [0, 5π], n P [1, 8]). Hình tĩnh của chuyển động là: > seq(plot(sin(x)/i,x=0..5*Pi),i=1..8): display(%);
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 Phạm Minh Hoàng
241
Chương 12. Xử lý hình động
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.
Thay đổi không đều - Thí dụ 2 Theo định luật Képler thứ 2 [Xem bài đọc thêm trang 137], khi mặt trăng quay quanh trái đất trên quỹ đạo ellipse trong đó trái đất là một tiêu điểm thì vận tốc của mặt trăng sẽ nhanh khi gần trái đất và chậm khi xa trái đất. Xem [Hình 12.10 (a)] thì thứ tự từ chậm nhất đến nhanh nhất là m3 , m3 , m4 , m1 . Đến 80 năm sau, nhờ vào khám phá của Newton về trọng trường, người ta đã kiểm chứng được định luật này. 242
Phạm Minh Hoàng
12.3. Chuyển động có sự thay đổi vận tốc
.m2
.m3 .5 .A
.
.m1
.
.B
.4 .(b)
.m4 .(a)
Hình 12.10: Chuyển động theo định luật Képler
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; y2 x2 + =1 eq := 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à:
5 + 0.0493k2, (k P [0, 14]) > s1:=seq(-5+kˆ2*.0493, k=0..14);
s1 := 5., 4.95, 4.80, 4.56, 4.21, 3.77, 3.23, 2.58, 1.84,
1.01, .07, .97, 2.10, 3.33, 4.66.
Các trị này đều thuộc khoảng [5, 5]. Và chuyển động tương ứng của mặt trăng là: > g1:=seq(display(tj,disk([k,f(k)],.2,CW)),k=s1): display(%);
Chuyển động này [Hình 12.11 (a)] được thiết lập từ 15 vị trí của mặt trăng và hoành độ đi từ 5 đến +5 nghĩa là một nửa ellipse trên trục hoành. Để tạo một nửa còn lại ta phải thiết lập Phạm Minh Hoàng
243
Chương 12. Xử lý hình động
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).] 244
Phạm Minh Hoàng
12.4. Chuyển động với một hay nhiều hình tĩnh
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à:
5 + 0.0062k2, k P [1, 40] Và cũng làm giống như trên, sau cùng ta có: > s1:=seq(-5+kˆ2*.0062,k=1..40): > s2:=seq(-5+kˆ2*.0062,k=-40..-1): > g1:=seq(display(tj,disk([k,f(k)],.2,CW)),k=s1): > g2:=seq(display(tj,disk([k,-f(k)],.2,CW)),k=s2): > display([g1,g2],insequence=true);
12.4 Chuyển động với một hay nhiều hình tĩnh Trong thí dụ trước (mục 12.3.3, trang...) ta đã thấy mặt trăng chạy trên một quỹ đạo ellipse. Ellipse này là một hình tĩnh hiện hữu trong suốt chuyển động. Đây là một trường hợp có nhiều ứng dụng.
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 báo f (x) dưới dạng hàm mũi tên: 2
> f:=x¡exp(-xˆ2)*sin(x/2):
Theo đồ thị thì cách dễ nhất là tìm các tiếp tuyến trong khoảng [2, 2]. Phương trình tiếp tuyến của một điểm α là: > tg:=a¡D(f)(a)*(x-a)+f(a); tg := a ÞÑ D(f )(a)(x a) + f (a)
Trước tiên ta sẽ tạo hình tĩnh với tiếp tuyến tại các điểm đặc biệt: u là cực đại của f (x) và v là điển uốn. u là nghiệm của f 1 (x) = 0 và v là nghiệm của f 2 (x) = 0: > u:=solve(diff(f(x),x),x); u := 2RootOf (8 Ztan( Z) 1
Phương trình f (x) = 0 phức tạp vì vừa có hàm mũ vừa có hàm lượng giác không thể có lời giải giải tích huống hồ gì f 2 (x) = 0. Giải bằng giải tích không được[3 ], ta bắt buộc phải tính 3
cho dù maxsols hay EnvAllSolutions=true kết quả vẫn không khả qua hơn
Phạm Minh Hoàng
245
Chương 12. Xử lý hình động
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);
x 2 Hình 12.12: Tiếp tuyến của hàm f (x) = ex sin( ) 2
Thí dụ 2 Cho un =
1 n
cosn (x) cos(nx). Tính
8
°
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 n=1
Đặ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
246
Phạm Minh Hoàng
12.4. Chuyển động với một hay nhiều hình tĩnh Ix )2 ln(1
(e
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); 1 1 S := ln(2) ln(1 cos(2x)) 2 2
Để tạo hình động, trước tiên ta khai báo hàm tổng từng phần Sk =
k °
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 n=1 > 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)]
Hình 12.13: Sự hội tụ của
°k
n=1 [
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: ℜ(un ) = ℜ(eInx eIx
ℜ(eInx)ℜ(eIx)
Bây giờ ta dùng hàm mũ để thay thế cho cos(nx), còn cos(x)n để nguyên: > sum(1/n*exp(I*n*x)*cos(x)ˆn,n=1..infinity);
ln(1 xIx cos(x))
Lấy phần thực và thu gọn kết quả: > evalc(Re(%)): %=combine(%,trig); Phạm Minh Hoàng
247
Chương 12. Xử lý hình động
ln( (1 + (cos(x))2)2 + (sin(x))2(cos(x))2)) = ln( 12 a
a
2 2 cos(2x))
> 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);
12.5 Đường lập lên bởi hình động Nếu trong phần (12.4) một phần tử chuyển động với một hình tĩnh, thì hình tĩnh này xuất hiện là bất biến trong suốt chuyển động. Bây giờ chúng ta muốn phần tử này khi di chuyển đến đâu sẽ "vẽ" ra con đường nó đi đến đó. Nhưng ý tưởng "đi đến đâu vẽ đến đấy" trái ngược với những gì ta thấy trong suốt phần xử lý hình động vừa qua. Vì nguyên tắc làm hình động là liên tục hiển thị các hình tĩnh, và hình sau khi xuất hiện chỉ khi hình trước biến mất. Vậy thì làm thế nào sau khi đi quay lại có thể đểlại đoạn đường vừa đi? Ý tưởng xem ra mâu thuẫn và phức tạp nhưng thực sự đơn giản hơn chúng ta nghĩ. Nếu nguyên tắc hình động là hình sau "đè" lên hình trước thì ta phải làm sao cho hình thứ n giống y như hình thứ (n 1) nhưng chỉ khác nhau một chi tiết, và hình thứ (n + 1) chỉ khác một chi tiết nhỏ so với hình thứ n, và cứ tiếp tục như thế. Chúng ta bắt đầu bằng một thí dụ đơn giản.
Viên bi lăn theo đường thẳng Giả sử chúng ta có một ciên bi lăn theo đường thẳng f (x) = x. Khai báo chuyển động này cũng giống như mục (12.3.3), nhưng đơn giản hơn nhiều vì đây là đường thẳng: > s:=i¡display(seq(disk([t/10,t/10],.05),t=0..i),IT,SC):
Ở đây ta chia cho 10 để giảm vận tốc 10 lần. Riêng về quỹ đạo của viên bi ta dùng hàm plot. Ta sẽ vẽ sao cho hình sau chỉ khác hình trước một chi tiết:
- Lần thứ nhất đi từ 0 đến hoành độ
1 10
(vì giảm vận tốc 10 lần)
2 , 10
- Lần thứ hai đi từ 0 đến hoành độ với IT[5 ] đồ thì này sẽ "chồng lên" đồ thị thứ nhất và dài hơn một đoạn làm cho ta cảm thấy đường thẳng "dài" ra 3 - Lần thứ ba đi từ 0 đến hoành độ 10 , và dài hơn lần thứ hai một quãng - Lần thứ i đi đến hoành độ
i . 10 t , 10
và t sẽ đi từ 0 đến
> p:=i¡display(seq(plot(x,x=0..t/10),t=0..i),IT):
(12.5.1)
Có nghĩa là ta phải tạo một dãy các đồ thị mà mỗi hình vẽ đi từ 0 đến i là hoành độ xa nhất mà chúng ta muốn đến.
Để 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
248
Phạm Minh Hoàng
12.5. Đường lập lên bởi hình động
.4
.4
.2
.2
.0
. .2
.x
.4
.0
.4
.4
.2
.2
.0
. .2
.x
.4
.0
. .2
.x
.4
.2
.x
.4
.
Hình 12.14: Chuyển động thẳng của viên bi
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à = 3.33. 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 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. Phạm Minh Hoàng
249
Chương 12. Xử lý hình động
Và chúng ta cũng sẽ sai lầm nếu thêm IT: > display(s(30),IT); Plotting error, ANIMATE must contain lists of objects
Viên bi lăn theo một đường bất kỳ
Bây giờ cũng viên bi này nhưng ta cho lăn và vẽ theo hàm f (x) = sinx x > f:=x¡abs(sin(x)/(x));
Đi theo hàm f (x) ta sẽ có một chuyển động "tương ứng" khá vui mắt. Để có được 3 đồ thị [Hình 12.15] ta chỉ lấy x ¡ 3π, và ta có thể dùng mệnh đề hoặc hàm để vẽ hình này.
Hình 12.15: Đồ thị của hàm (a),
sin x x , (b)f (x) và (c)f ( ) nhân lên 30 lần x 3
> plot(20*sin(x)/(x),x=3*Pi..8*Pi); [Hình 12.15 (a)] > plot(30*f,3*Pi..4*Pi); [Hình 12.15 (b)] > plot(30*f(x/3),x=3*Pi..9*Pi); [Hình 12.15 (c)]
250
Phạm Minh Hoàng
12.5. Đường lập lên bởi hình động
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]);
Phạm Minh Hoàng
251
Chương 12. Xử lý hình động
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
252
Phạm Minh Hoàng
12.5. Đường lập lên bởi hình động
> 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.
Điểm động học Cho một chuyển động trong mặt phẳng. Hãy tạo hình tĩnh và động của chuyển động cùng với các vector vận tốc và gia tốc của một điểm trên quỹ đạo đó.
a) Chuyển động cycloid Để có sự liên tục, ta dùng lại ngay kết quả phần cycloid vừa tính xong. Phương trình của một điểm trên cycloid là: [rt r sin t, r r cos t]. Ta khai báo các vector vận tốc và gia tốc bằng cách lấy đạo hàm (toán tử D) của vector vị trí, và vector vị trí được khai báo băng một vector hàm: > OM:=vector([t¡r*t-r*sin(t),t¡r-r*cos(t)]): > vt:=map(D,OM); gt:=map(D,vt); $ & %
OM := [t ÞÑ rt r sin(t), t ÞÑ r r cos(t)] 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):
Phạm Minh Hoàng
253
Chương 12. Xử lý hình động
> 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);
b) Chuyển động bất kỳ - Lập trình Bây giờ chúng ta sẽ tạo chuyển động với một quỹ đạo bất kỳ, và cách duy nhấtlà lập trình. Nếu đã hiểu cách khai báo ở phần a), thì trong phần này ta chẳng cần phải làm gì hết. Chỉ cần ghép các lệnh trên vào là đủ: Chương trình cine nhận 3 tham số (OM vector-hàm, n: độ dài của đường muốn vẽ, s = 1: hình động, s 1: hình tĩnh. Mặc định lấy s = 1) 254
Phạm Minh Hoàng
12.5. Đường lập lên bởi hình động
∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼∼
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:
Bảng 12.1: Chương trình cine
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 8
Đâ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. Ở đâ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.
Phạm Minh Hoàng
255
Chương 12. Xử lý hình động
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
12.6 Bài đọc thêm Dưới đây là bảng tóm tắt các phát minh, các công trình nghiên cứu cũng như những thời điểm quan trọng của Toán học từ năm 2000 trước Công Nguyên đến nay. Bảng này được trích ra từ địa chỉ Internet: http://www-groups.dsc.st-and.ac.uk/∼history/Chronology/full.html Trong đó chúng tôi chỉ giữ lại những chi tiết gần gũi với bạn đọc Việt Nam. Một và lưu ý: Dấu ∼ dùng khi không rõ chính xác thời điểm Tên của các khoa học gia cũng như công trình được phiên dịch sang tiếng Pháp hoặc tiếng Anh để gần gũi với người đọc.
4000 năm lịch sử Toán học
-1950 (∼) Dân thành Babylone phát minh bản tính nhân.
Hình 12.20: Babylone
256
Phạm Minh Hoàng
12.6. Bài đọc thêm
-530 Pythagore và định lý nổi tiếng mang tên ông.
Hình 12.21: Pythagore
-575 Thales biết cách tính chiều cao kim tự tháp với định lý mang tên mình.
Hình 12.22: Thales
-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.
Hình 12.23: Hippocrates
-300 (∼) Euclide hệ thống hóa các khái niệm về Hình học trong Elements.
Hình 12.24: Euclide
Phạm Minh Hoàng
257
Chương 12. Xử lý hình động
-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
Hình 12.25: Aristote
-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ụ.
Hình 12.26: Archimede
-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ố.
Hình 12.27: Eratosthene
-225 (∼) Apollonius viết Conics trong đó lần đầu tiên xuất hiện các từ "parabola", "ellipse", "hyperbola".
Hình 12.28: Apollonius
258
Phạm Minh Hoàng
12.6. Bài đọc thêm
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.
Hình 12.29: Ptoleme
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.
Hình 12.30: Liu Hui
250 Diophante viết Arithmetica, một nghiên cứu về lý thuyết Số.
Hình 12.31: Diophante
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
Phạm Minh Hoàng
259
Chương 12. Xử lý hình động
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).
Hình 12.33: Abubin-Musa-alKhwarizmi
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.
Hình 12.34: Fibonacci
1247 Qin Jinshao và định lý Trung Quốc về phần dư (Chnese Remainder Theorem).
Hình 12.35: Qin Jinshao
260
Phạm Minh Hoàng
12.6. Bài đọc thêm
1382 Nicolas d'Oresme viết cuốn Le Livre du ciel et du monde (The book of Heaven and Earth) với những chủ đề về Toán, Cơ cũng như những khái niệm về Thiên văn.
Hình 12.36: Nicolas
1543 Copernic đưa ra một lý thuyết về Thái Dương hệ: đó là một hệ nhật tâm (Mặt Trời là tâm) chứ không phải địa tâm (Trái Đất là tâm).
Hình 12.37: Copernic
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ố).
Hình 12.38: Viète
1609 Kepler công bố các định luật về quỹ đạo ellipse của các thiên thể trong vũ trụ.
Hình 12.39: Kepler
Phạm Minh Hoàng
261
Chương 12. Xử lý hình động
1614 Neper công bố các nghiên cứu về logarithme.
Hình 12.40: Neper
1635 Cavalieri công bố các nghiên cứu về lý thuyết cực nhỏ infinitesimal.
Hình 12.41: Cavalieri
1637 Descartes viết La Géométrie nói về các ứng dụng Đại số vào Hình học.
Hình 12.42: Descartes
1639 Desargues bắt đầu những nghiên cứu về Hình học quy chiếu projective geometry.
Hình 12.43: Desargues
262
Phạm Minh Hoàng
12.6. Bài đọc thêm
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.
Hình 12.44: Pascal
1647 Fermat đưa ra khái niệm mà sau đó người ta gọi là Định lý Fermat lớn (phương trình xn + y n z n vo nghiệm khi n ¡ 2).
Hình 12.45: Fermat
1673 Huygens công bố ngững khám phá về đường cycloid.
Hình 12.46: Huygens
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.
Hình 12.47: Leibniz
Phạm Minh Hoàng
263
Chương 12. Xử lý hình động
1683 Seki Kowa công bố các nghiên cứu về định thức.
Hình Kowa
12.48: Seki
1687 Newton viết Mathematical Principles of Natural Philosophy được cộng đồng khoa học công nhận là cuốn sách khoa học giá trị nhất từ trước tới giờ. Newton công bố các công trình về chuyển động, trọng trường và cơ học. Lý thuyết của ông giải thích cho các hiện tượng trong vũ trụ còn trong vòng uẩn khúc.
Hình 12.49: Isaac Newton
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).
Hình 12.50: Jacques Bernoulli
264
Phạm Minh Hoàng
12.6. Bài đọc thêm
1690 Rolle công bố các lý thuyết sau đó trở nên Định lý Rolle.
Hình 12.51: 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.
Hình 12.52: Jean Bernoulli
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 Moivre
12.53: De
1724 Jacapo Riccati nghiên cứu về một dạng phương trình vi phân.
Hình 12.54: Jacapo Riccati
Phạm Minh Hoàng
265
Chương 12. Xử lý hình động
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.
Hình 12.55: Euler
1737 Simpson dùng chuỗi để tìm một tích phân xác định.
Hình 12.56: Simpson
1743 D'Alembert công bố các công trình về số phức cũng như sử dụng phương trình vi phân đạo hàm riêng để nghiên cứu về gió. Trước đó ông đã công bố nhiều nghiên cứu về dộng học trong Traité de dynamique (Treatise on Dynamics).
Hình 12.57: D'Alembert
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
266
Phạm Minh Hoàng
12.6. Bài đọc thêm
1763 Monge bắt đầu đưa ra các khái niệm về Hình học giải tích.
Hình 12.59: Monge
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.
Hình 12.60: Legendre
1799 Gauss chứng minh định lý cơ bản của Đại số đã được D'Alembert nêu lên vào năm 1746. Sau đó ông cũng đã đi tiên phong trong ngành Hình học vi phân.
Hình 12.61: Gauss
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.
Hình 12.62: Fourier
Phạm Minh Hoàng
267
Chương 12. Xử lý hình động
1811 Poisson viết Traité de mécanique trong đó có nhiều ứng dụng toán cho điện, từ, điện từ và cơ học. Đến năm 1830, ông đưa ra hệ Poisson dùng trong cơ học.
Hình 12.63: Poisson
1812 Laplace công bố các công trình về xác suất trong Théorie Analytique 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.
Hình 12.64: Laplace
1817 Bolzano và lý thuyết cực nhỏ trong đó có sự cộng tác của Wierstrass.
Hình 12.65: Bolzano
1821 Navier và phương trình Navier-Stokes giải quyết bài toán chất lỏng không nén.
Hình 12.66: Navier
268
Phạm Minh Hoàng
12.6. Bài đọc thêm
1828 Green và định lý về diện tích và thể tích mang tên ông.
Hình 12.67: Green
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.
Hình 12.68: Galois
1829 Lobachevsky khai triển khái niệm Hình học phi-Euclide
Hình 12.69: Lobachevsky
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.
Hình 12.70: Cauchy
Phạm Minh Hoàng
269
Chương 12. Xử lý hình động
1837 Dirichlet đưa ra một khái niệm tổng quát về hàm số.
Hình 12.71: Dirichlet
1841 Jacobi và hàm Jacobian.
Hình 12.72: Jacobi
1845 Cayley công bố Theory of Linear Transformations hệ phương trình tuyến tính.
Hình 12.73: Cayley
1847 Boole công bố những khái niệm về lo-gích.
Hình 12.74: Boole
270
Phạm Minh Hoàng
12.6. Bài đọc thêm
1850 Chebyshev đưa ra các kết quả về số nguyên tố.
Hình 12.75: Chebyshev
1850 Sylvester là người đầu tiên dùng từ ma trận (matrix).
Hình 12.76: Sylvester
1881 Venn đưa ra giản đồ Venn dùng trong lý thuyết tập hợp.
Hình 12.77: Venn
1883 Poincaré và lý thuyết hàm phức nhiều biến.
Hình 12.78: Poincaré
Phạm Minh Hoàng
271
Chương 12. Xử lý hình động
1887 Frobenius và biểu diễn của lý thuyết nhóm.
Hình 12.79: Frobenius
1899 Lyapunov và sự ổn định của phương trình vi phân.
Hình 12.80: Lyapunov
1901 Runge và Kutta tìm ra phương pháp số dùng để giải các phương trình vi phân.
Hình 12.81: RungeKutta
1909 Carmichael và số giả nguyên tố.
Hình 12.82: Carmichael
272
Phạm Minh Hoàng
12.6. Bài đọc thêm
1921 Borel công bố lần đầu tiên về Lý thuyết trò chơi (game theory).
Hình 12.83: Borel
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.
Hình 12.84: Richardson
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.
Hình 12.85: Turing
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.
Hình 12.86: George Dantzig
Phạm Minh Hoàng
273
Chương 12. Xử lý hình động
1948 Shannon trình bày các phát minh về Lý thuyết dữ kiện (information theory) và những ứng dụng Toán vào việc chuyển tải dữ kiện.
Hình 12.87: Shannon
1948 Schwartz công bố những công trình về Lý thuyết phân bố (theory of distributions).
Hình 12.88: Schwartz
1959 Hall công bố định lý quan trọng về Lý thuyết nhóm.
Hình 12.89: Hall
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.
Hình 12.90: Edward Lorenz
274
Phạm Minh Hoàng
12.6. Bài đọc thêm
1965 Tukey and Cooley công bố công trình về Fast Fourier Transform có ứng dụng rộng rãi trong các ngành Điện, Tin học và Cơ học.
Hình 12.91: Tukey
1975 Mandelbrot và Feigenbaum công bố các kết quả về Lý thuyết Hỗn độn và Lý thuyết Fractal.
Hình 12.92: Mandelbrot
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ả. Hình 12.93: Adleman, Rivest, and Shamir
1997 Wiles thành công trong việc chứng minh định lý Fermat lớn.
Hình 12.94: Wiles
Những khám phá...tình cờ Nếu khám phá của Archimede đến từ một sự tình cờ (đi tắm, mà phải tắm bằng bồn kia), thì đây không phải là một thí dụ hy hữu. Trong suốt quá trình tiến hóa của nhân loại, tình cờ đã đem lại Phạm Minh Hoàng
275
Chương 12. Xử lý hình động
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
276
Phạm Minh Hoàng
12.6. Bài đọc thêm
Ký hiệu phân số lũy thừa cộng, trừ bằng căn vô cực ¤, ¥ nhân cộng trừ
Bảng 12.2: Lịch sử các ký hiệu Toán Thí dụ Tác giả 2 N. Oresme 3 24 , 32 N. Chuquet +, Stifel a R. Recorde ?= b 2 C. Rudoft
nhân, chia nguyên hàm vi phân, đạo hàm
, ¡
8 a¤b ab 10 0.1 a b, a : b
Năm() 1320-1382 thế kỷ XV 1544 1510-1558 1525
J. Wallis
1616-1703
W. Oughtred
1631
G.W. Leibniz
1646-1716
T. Harriot W. Jones
1631 1706
L. Euler
1707-1783
»
dx, f 1 (x) a¡b
Số π cơ số e khác số phức tổng phần nguyên
học
ex ab a + ib °
E(x) A.M. Legendre 1752-1833 B f đạo hàm riêng Condorcet 1770 Bx giai thừa n! C. Kramp 1808 ký hiệu tập hợp X, Y, @, D, P G. Peano 1831-1916 Tập số tự nhiên N , hữu tỷ Q Tập các số thực R Dedekind 1858-1932 xấp xỉ ab Steinhausser 1875 Ý Ý Ñ véc-tơ PQ (?) 1930 tương đương aôb W. Ackerman 1936 Tập các số phức C Jacobson 1939 ()Trong bảng trên nếu không rõ năm phát minh thì là giai đoạn sống của tác giả.
Phạm Minh Hoàng
277
Tài liệu tham khảo [1] JEAN MICHEL CORNIL, PHILIPPE TESTUD. MAPLE, Introduction ráionnée à l'usage de l'étudiant, de l'ingénieur et du chercheur. Edition Springer Verlag, Berlin Heidenberg 1977 [2] EUGENE W.JOHNSON - Linear Algebra with Maple V University of Iowa, USA [3] JOHN DEWITT - Calculus with Maple V University of Saskatchewan, CAN. [4] ANDRE HECK - Introduction to Maple Edition Springer Verlag, Berlin Heidenberg 1977 [5] WALTER GANDER, JIRI HREBICEK Solving problems in Scientific Computing Edition Springer Verlag, Berlin Heidenberg 1977 [6] WILLIAM A.GRANVILLE. PERCEY F .SMITH, WILLIAM R.LONGLEY Elements of the Differential and Integral Calculus Ginn and Company - Yale University, USA [7] CLAUDE GOMEZ, BRUNO SALVI, PIERRE ZIMMERMANN Calcul Formel: Mode d'emploi - Edition Masson, Paris 1995 [8] ALBERT.LEVINE - Introduction à Maple - Edition Elipses, Paris 1998 [9] prolèmes de mathématiques résolus avec Maple et Mathematica Edition Ellipses, Paris 1988 [10] VINCENT BOURGES - Physique avec Maple - Edition Ellipses, Paris 1998 [11] JANE MARC FERRAND - Maths et Maple - Edition Dunod, Paris 1998 [12] J.D.ANDERSON - Fundamentals of Aerodynamics University of Maryland, Edition Mc Graw-Hill. [13] PHILIPPE DUMAS, XAVIER GOURDON Maple, Son bon usage en mathématiques Edition Springer Verlag, Berlin Heidenberg 1997 [14] JULLIEN BOK, PIERRE MOREL - Cours de Physique - Mécanique des Ondes Collection Methodes - Hermann, Paris
Tài liệu tham khảo
[15] HSUAN YEH, JOEL I.ABRAMS Principles of Mechanics of Solids and Fluids. Vol. 1 University of Pennsylvania - Mc Graw-Hill Book Company, Inc 1960 [16] JEAN MARC MONIER - Giáo trình toán - Nhà Xuất Bản Giáo Dục [17] HERVE LEHNING - Travaux pratuques avec Maple - Edition Pole. [18] R.KENT NAGLE - EDWARD B.SAFF Fundamentals of Differential Equation & Boundary Value Problems Addition Wesley Publishing Company [19] R.MONTAGNER - Résistance des Matériaux - Edition Eyrolles 1982 [20] SEBASTIEN DESREUX Physique Terminal S - Edition Bréal 1998 [21] V.M. STARZHINSKII Applied Method in the Theory Of The Nonlinear Oscillations - Mir Publishers [22] MICHEL GERADIN Mechanical Vibration & Structure Dynamics - University of Liege [23] D.KLETENIK - Problèmes de Géométrie Analytique (Traduit du russe par A.Karvovski) - Mir Publisher - Moscow 1969 [24] WALTER LEIGHTON - Ordinary Differential Equations University of Missouri - Wadsworth Publishing Company - California 1968 [25] KENNETH ROSEN - Discrete Mathematics ans Its Applications Mc Graw-Hill Edition [26] Vũ Ngọc Tước Mô hình hóa và mô phỏng bằng máy tính - 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 [28] Nguyễn Cang - Nguyễn Đăng Phất Giới thiệu tóm tắt cuộc đời và sự nghiệp các nhà toán học - Nhà Xuất Bản Trẻ [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 [30] Hà Huy Khoái - Phạm Huy Điển - Số học thuật toán Nhà Xuất Bản Đại Học Quốc Gia Hà Nội
Phạm Minh Hoàng
279
Chỉ mục Symbols $(diff) . . . . . . . . . . . . . . . . . . . . . . . . 10, 145, 149 $(seq) . . . . . . . . . . . . . . . . . . . . . . . . . 95, 119, 153 EnvExplicit . . . . . . . . . . . . . . . . . . . . . . . 65, 101 EnvHorizontalName . . . . . . . . . . . . . . . . 75, 85 EnvVerticalName . . . . . . . . . . . . . . . . . . . 75, 85 A algsubs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 alias . . . . . . . . . . . . . . 4, 25, 50, 85, 92, 170, 178 allvalues . . . . . . . . . . . . . . . 13, 38, 83, 118, 148 altitude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 amortization . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 arctan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 AreCollinear. . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 AreConcurren . . . . . . . . . . . . . . . . . . . . . . . . . . 86 AreHarmonic . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 AreOrthogonal . . . . . . . . . . . . . . . . . . . . . . . . . . 81 arrow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66, 253 arrows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 assign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48, 50 assume . . . . . . . . . . . . . . . . 37, 75, 116, 117, 119 positive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 real . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 @@ . . . . . . . . . . . . . . . . . . . . 10, 90, 128, 170, 178 axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 boxed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 framed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 B band . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 boxed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 C center . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82, 86
changevar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 charpoly . . . . . . . . . . . . . . . . . . . . . . . . . . . 19, 101 chrem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214, 215 circle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82, 235 circumcircle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 collect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 exp . . . . . . . . . . . . . . . . . . . . . . . . . . . 171, 175 radical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11, 123 coloring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 combine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 ln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 power . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 radical . . . . . . . . . . . . . . . . . . . . . . . 41, 42, 84 symbolic . . . . . . . . . . . . . . . . . . . . . . . . 192 sqrt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 symbolic . . . . . . . . . . . . . . . . . . . . 41, 42, 84 trig . . . . . . . . . . . . . . . . . . . . . . . . . . . 146, 200 concat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 cone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 conjugate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 connect . . . . . . . . . . . . . . . . . . . . . . . . 62, 63, 101 contourplot. . . . . . . . . . . . . . . . . . . . . . . . . .57, 61 contourplot3d . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 contours . . . . . . . . . . . . . . . . . . . . . . . . . 55, 57, 64 convert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 +, * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 +,* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 base . . . . . . . . . . . . . . . . . . . . . . . . . . 223, 227 binary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 fraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 listlist . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7, 91 ln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 parfrac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 PLOYGONS . . . . . . . . . . . . . . . . . . . . . . . 48 trig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 coordinates. . . . . . . . . . . . . . . . . . . . . . . . . .81, 82
280
Chỉ mục
coords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54, 57 csgn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 37 H has . . . . . . . . . . . . . . . . . . . . . . . . 9, 43, 50, 65, 82 D D . . . . . . . . . . . . . . . . . . . . . . . 16, 54, 58, 66, 145 hessian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 degrees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 I denom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 det . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 igcdex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 dfieldplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Im . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 diag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 implicitplot . . . . . . . . . . . . . . 12, 66, 73, 76, 124 Diff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 implicitplot3d. . . . . . . . . . . . . . . . . . . . . . . . . . .48 diff . . . . . . . . . . 10, 34, 49, 61, 95, 96, 117, 246 incircle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Digits . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120, 150 infinity . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57, 102 discont . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 insequence . . . . . . . . . . . . . . . . . . 12, 63, 76, 168 disk . . . . . . . . . . . . . . . . 168, 169, 199, 235, 238 Int . . . . . . . . . . . . . . . . . . . . . . . 23, 117, 119, 123 display . . . . . . . . . . 12, 54, 63, 79, 95, 147, 232 int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116, 118 distance . . . . . . . . . . . . . . . . . . . . . . . . . 70, 84, 85 interp . . . . . . . . . . . . . . . . . . . . . . . . . 99, 100, 153 dotpord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 draw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 intparts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 dsegment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Inverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 dsolve . . . . . . . . . . . . 17, 95, 102, 128, 145, 149 inverse . . . . . . . . . . . . . . . . . . . . . . . . 29, 220, 221 numeric. . . . . . . . . . . . . . .17, 109, 150, 178 irem . . . . . . . . . . . . . . . . . . . . . . . . . 113, 220, 221 irreduc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 E eigenvals . . . . . . . . . . . . . . . . . . . . . . . . 19, 56, 98 is . . . . . . . . . . . . . . . . . . . . . . . 9, 35, 37, 135, 148 eigenvects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 isolate . . . . . . . . . . . . 13, 39, 116, 118, 141, 243 Equation . . . . . . . . . . . . . . . . . . . . . . . . 75, 82, 85 isolve . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212, 215 eval . . . . . . . . . . . 14, 18, 57, 66, 76, 91, 93, 186 isprime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 209 evalc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175, 247 ithprime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 evalf . . . . . . . . . . . . . 13, 37, 41, 44--46, 65, 118 J convert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 jordan . . . . . . . . . . . . . . . . . . . . . . . . . . . 19, 29, 90 evalm . . . . . . . . . . . . . . . . . . . . . . . . 18, 90, 93, 97 L expand . . . . . . . . . . 5, 37, 42, 44, 128, 171, 200 labeldirections . . . . . . . . . . . . . . . . . . . . . . . . . 197 F labels . . . . . . . . . . . . . . . . . . . . . . 48, 61, 153, 197 factor . . . . . . . . . . . . . . . . . . . . 5, 42, 44, 49, 149 length . . . . . . . . . . . . . . . . . . . . . . . 217, 223, 224 fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 lhs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 filled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 lightmodel . . . . . . . . . . . . . . . . . . . . . . . . . . 54, 63 FindAngle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Limit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10, 102 floor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 limit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103, 117 font . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 line . . . . . . . . . . . . . . . . . . . . . . 57, 70, 75, 82, 85 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109, 154 linecolour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 fsolve . . . . . . . . . . . . . . . . . . . 13, 55, 61, 72, 246 linestyle . . . . . . . . . . . . . . . . . . . . . . . . . . . 39, 139 local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 G gcd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 M genmatrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 global . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106, 152 map . . . . . . . . . . . . . 9, 18, 25, 28, 31, 57, 65, 66 grad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56, 65 cat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 gradplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 combine . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Phạm Minh Hoàng
281
Chỉ mục
convert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 evalf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 round . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 trunc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 matrix . . . . . . . . . . . . . . . . . . . . 18, 90, 91, 93, 99 max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99, 162 median . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 midpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 mod . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 213, 224 mw, mws . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 N nextprime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 nops . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8, 62, 158 norm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 expanded . . . . . . . . . . . . . . . . . . . . . 5, 23, 43 NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 numer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 numpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 O odeplot . . . . . . . . . . . . . . 17, 151, 152, 155, 186 op . . . . . . . . . . . . . . . . . 9, 29, 30, 70, 79, 99, 115 orientation . . . . . . . . . . . . . . . . . 48, 55, 118, 121 orthocenter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 P parallelepiped. . . . . . . . . . . . . . . . . . . . . . . . . . .48 patchnogrid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 PerpenBisector. . . . . . . . . . . . . . . . . . . . . . . . . .86 phaseportrait . . . . . . . . . . . . . . . . . . . . . . . . . . 104 piecewise . . . . . . . . . . . . . . . . . . . . . . 76, 96, 133 plot . . . . . . . . . . . . . . . . . . . . . . 11, 40, 64, 76, 95 plot3d . . . . . . . . . . . . . . . . . . . 54, 58, 61, 92, 101 poinplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 point . . . . . . . . . . . . . . . . . . 48, 70, 75, 81, 83, 95 pointplot3d . . . . . . . . . . . . . . 58, 59, 62, 63, 101 polar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184, 186 polarplot . . . . . . . . . . . . . . . . . . . . . . . . . . . 12, 233 polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 positive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 prevprime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 print . . . . . . . . . . . . . . . . . . . . . . . . . . 20, 109, 110 proc . . . . . . . . . . . . . . . . . . . . . 20, 22, 23, 93, 106 R radius . . . . . . . . . . . . . . . . . . . . . . . . . 82, 118, 121 rand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8, 12 282
rationalize . . . . . . . . . . . . . . . . . . . . . . . . . 30, 192 Re . . . . . . . . . . . . . . . . . . . 40, 148, 171, 172, 247 read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 rectangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 reflect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 remove . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 43, 65 restart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 rhs . . . . . . . . . . . . . . . . . . 3, 23, 30, 38, 117, 118 RootOf . . . . . . . . . . . . . 13, 39, 45, 51, 101, 148 rotate . . . . . . . . . . . . . . . . . . . . . . . . 199, 233, 240 round . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106, 107 rowdim . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22, 221 rsolve . . . . . . . . . . . . . . . . . . . . . . . . . . . 14, 91, 94 S save . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 scaling . . . . . . . . . . . . . . . . . . . . . . . . . 12, 66, 155 select . . . . . . . . . . . 9, 28, 35, 50, 70, 82, 83, 98 seq . . . . . . . . . . . . . . . . 8, 45, 58, 73, 81, 90, 161 display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 setoptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 shading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 sign. . . . . . . . . . . . . . . . . . . . . . . . . . .35, 115, 175 simplify . . . . . . . . . . . . . . . . . . . . . . . . . . 1, 14, 23 radical, symbolic . . . . . . . . . . . . . . . . . . . 248 sqrt, symbolic . . . . . . . . . . . . . . . . . . . . . . . 72 symbolic . . . . . . . . . . . . . 25, 29--31, 35, 82 expand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 solve . . . . 6, 21, 28, 33, 41, 49, 55, 70, 94, 236 spacecurve . . . . . . . . . . . . . . . . . . . . . . . . . . 59, 64 sphere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42, 57 spline . . . . . . . . . . . . . . . . . . . . . . . . 119, 153, 159 sqrt . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 39, 40, 117 stepsize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42, 64 hidden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 point. . . . . . . . . . . . . . . . . . . . . . . . . . . .17, 95 wireframe . . . . . . . . . . . . . . . . . . . 42, 48, 57 subs . . . . . . . . 8, 19, 25, 30, 34, 41, 45, 94, 150 subsop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227, 246 symbol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 circle . . . . . . . . . . . . . . . . . . . . . . . . . . 59, 108 cross . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 diamond . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 symbolsize . . . . . . . . . . . . . . . . . . . . . . . . . 95 Phạm Minh Hoàng
Chỉ mục
T textplot . . . . . . . . . . . . . . . . . . . . 66, 78, 108, 238 thickness . . . . . . . . . . . . . . . . . . . . . . . 11, 58, 123 tickmarks . . . . . . . . . . 40, 61, 79, 100, 103, 106 time() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 title . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 trans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 transpose . . . . . . . . . . . . . . . . . . . . . . . . . . . 93, 97 transslate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 triangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 trunc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 tubeplot . . . . . . . . . . . . . . . . . . . . . . 115, 118, 119
vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82, 255 view . . . . . . . . . . . . . . . . . 80, 103, 152, 180, 240
W while . . . . . . . . . . . . . . . . . . . . . . . . 150, 154--156 with . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 combinat . . . . . . . . . . . . . . . . . . . . . . . . . . 242 geometry . . . . . . . . . . . . . . . . . . . . 70, 75, 81 goem3d . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 linalg . . . . . . . . . . . . . . . . . . . . . . . . . . 56, 192 plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 plots . . . . . . . . . . . . . . . . . . . 54, 73, 145, 154 plottools . . . . . . . . . . . . 42, 57, 78, 123, 168 U student . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 unapply . . . . . . . . . . . . 8, 31, 39, 40, 62, 81, 146 worksheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3, 21 union . . . . . . . . . . . . . . . . . . . . . . . . 152, 154, 156 Z V value . . . . . . . . . . . . . . . . . . . . . . 2, 119, 121, 122 zip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Phạm Minh Hoàng
283