Nhập môn Vật lý tính toán

Dịch từ quyển sách “Introduction to Computational Physics” của Richard Fitzpatrick, GS Trường UT Austin. Dành cho người tự học và sinh viên các trường. Không dùng cho mục đích kinh doanh.

Mục lục

Chương 1: Giới thiệu chung
Chương 2: Lập trình khoa học bằng ngôn ngữ C
Chương 3: Tích phân của các PVT (Phần 1, Phần 2)
Chương 4: Con lắc hỗn loạn (Phần 1, Phần 2)
Chương 5: Phương trình Poisson (Phần 1, Phần 2)
Chương 6: Phương trình khuếch tán
Chương 7: Phương trình sóng (Phần 1, Phần 2)
Chương 8: Chương trình tính dùng phương pháp hạt-trong-ô
Chương 9: Phương pháp Monte-Carlo (Phần 1, Phần 2)

Chương 1: Giới thiệu chung

Đối tượng bạn đọc

Tập giáo trình này được dành cho các sinh viên đại học những năm cuối đang theo học môn cùng tên.

Tài liệu tham khảo chính

Những nguồn tham khảo sau đây được tôi sử dụng thường xuyên nhất khi viết tập bài giảng này:

Lập trình C/C++:

Software engineering in C, P.A. Darnell, and P.E. Margolis (Springer-Verlag, New York NY, 1988).

The C++ programming language, 2nd edition, B. Stroustrup (Addison-Wesley, Reading MA, 1991).

Schaum’s outline: Programming with C, 2nd edition, B. Gottfried (McGraw-Hill, New York NY, 1996).

Schaum’s outline: Programming with C++, 2nd edition, J.R. Hubbard (McGraw-Hill, New York NY, 2000).

Phương pháp số và vật lý tính toán:

Computational physics, D. Potter (Wiley, New York NY, 1973).

Numerical recipes in C: the art of scientific computing, W.H. Press, S.A. Teukolsky, W.T. Vettering, and B.R. Flannery (Cambridge University Press, Cambridge UK, 1992).

Computational physics, N.J. Giordano (Prentice-Hall, Upper Saddle River NJ, 1997).

Numerical methods for physics, 2nd edition, A.L. Garcia (Prentice-Hall, Upper Saddle River NJ, 2000).

Cơ học nghiên cứu chuyển động của quả bóng chày:

The physics of baseball, R.K. Adair (Harper & Row, New York NY, 1990).

The physics of sports, A.A. Armenti, Jr., Ed. (American Institute of Physics, New York NY, 1992).

Hỗn mang:

Chaos in a computer-animated pendulum, R.L. Kautz, Am. J. Phys. 61, 407 (1993).

Nonlinear dynamics and chaos, S.H. Strogatz, (Addison-Wesley, Reading MA, 1994).

Chaos: An introduction to dynamical systems, K.T. Alligood, T.D. Sauer, and J.A. Yorke, (Springer-Verlag, New York NY, 1997).

Mục đích của khóa học

Mục đích của khóa học này nhằm cho sinh viên thấy được cách mà máy tính có thể giúp chúng ta mở rộng và khơi sâu những hiểu biết về vật lý bằng cách nâng cao đáng kể phạm vi tính toán mà chúng ta có thể thực hiện một cách thuận tiện nhất.

Triết lý của khóa học

Cách tiếp cận của tôi trong ngành học vật lý tính toán là viết những chương trình có đầy đủ tính năng bằng một ngôn ngữ lập trình khoa học bậc cao—chẳng hạn, FORTRAN hoặc C/C++. Dĩ nhiên, cũng còn nhiều cách tiếp cận khác, mỗi cái có ưu và nhược điểm riêng. Sau đây ta sẽ xét qua các cách tiếp cận; điều này cũng có ích cho việc học.

Những cách tiếp cận bằng lập trình

Về cơ bản, có ba phương pháp khả thi mà ta có thể thực hiện tính toán số trị cho các vấn đề gặp phải trong nội dung khóa học này.

Đầu tiên là ta có thể dùng một gói phần mềm toán học như Mathematica,1 Maple2 hay Matlab.3 Ưu điểm chính của các gói phần mềm này là chúng cho phép viết mã lệnh rất nhanh để giải các bài toán số trị. Nhược điểm cơ bản là chúng tạo ra mã lệnh được thực thi bằng cách thông dịch, thay vì được biên dịch. Mã lệnh khi biên dịch sẽ được chuyển trực tiếp từ ngôn ngữ bậc cao sang các chỉ thị mã lệnh của máy tính, mà theo bản chất thì không phụ thuộc vào hệ thống—chỉ có ngoại lệ là chíp Intel x86 có tập hợp chỉ thị lệnh hoàn toàn khác với chip Power-PC. Mã lệnh khi thông dịch được chuyển từ một ngôn ngữ lập trình bậc cao thành những chỉ thị mã lệnh tổng quát cũng không phụ thuộc vào hệ thống. Mỗi chỉ thị tổng quát này sau đó mới được dịch sang một tập hợp nhất định gồm các chỉ thị mã máy vốn đặc trưng cho phần cứng mà trên đó mã lệnh được chạy. Nói chung, về khía cạnh tận dụng tài nguyên của máy, các mã lệnh thông dịch không bao giờ hiệu quả được như mã lệnh biên dịch; nghĩa là mã thông dịch chạy chậm hơn nhiều so với mã biên dịch tương ứng. VÌ vậy, mặc dù Mathematica, Maple, và Matlab đều là những môi trường lí tưởng để thực hiện những tính toán tương đối nhỏ, chúng không phù hợp cho các dự án nghiên cứu thực thụ, vì mã lệnh chúng phát sinh ra thường chạy quá chậm.

Thứ hai là ta có thể tự viết các chương trình bằng một ngôn ngữ bậc cao, nhưng gọi đến các chương trình con đã được viết sẵn và biên dịch sẵn có ở các thư viện chương trình thông dụng, chẳng hạn như NAG,4 LINPACK,5ODEPACK,6 để thực hiện mọi công việc tính toán số trị. Đây là cách làm của phần nhiều các nhà nghiên cứu vật lý.

Thứ ba là ta có thể tự viết những chương trình của mình—hoàn toàn từ số không —bằng một ngôn ngữ lập trình bậc cao. Đây là cách làm được áp dụng trong khóa học này. Tôi đã quyết định không dùng các thư viện chương trình con viết sẵn, đơn giản là vì muốn sinh viên phát huy khả năng tự suy nghĩ về lập trình khoa học và các kỹ thuật số trị. Tuy nhiên, sinh viên cần phải thấy được rằng trong nhiều trường hợp, các chương trình con của thư viện viết sẵn đều cung cấp lời giải cho các bài toán số trị mà khó thể tìm ra cách làm tốt hơn.

Ngôn ngữ lập trình khoa học

Ngôn ngữ bậc cao tốt nhất phục vụ cho mục đích lập trình trong khoa học là gì? Thật không may, đây là câu hỏi gây nhiều tranh cãi. Nhiều năm qua, đã có hàng trăm ngôn ngữ lập trình bậc cao được phát triển. Tuy nhiên, chỉ có một số ít ngôn ngữ còn tồn tại với mục đích nói trên. Nhiều ngôn ngữ như Algol, Pascal, Haskell là sản phẩm cảm hứng nhất thời của các nhà khoa học máy tính. Các ngôn ngữ khác như Cobol, Lisp, Ada đều quá chuyên biệt để có thể phục vụ cho mục đích khoa học.

Chúng ta hãy xem xét các lựa chọn còn lại:

FORTRAN 77: FORTRAN là ngôn ngữ lập trình bậc cao được phát triển đầu tiên. Thực ra, nó xuất hiện trước các ngôn ngữ dưới đây đến vài thập kỉ. Trước khi có FORTRAN, tất cả việc lập trình đều được thực hiện bằng hợp ngữ máy! Ngoài ra, FORTRAN còn được thiết kế riêng cho mục đích tính toán khoa học. Thật sự là, trong những ngày đầu máy tính xuất hiện tất cảmọi việc tính toán đều mang màu sắc khoa học—nghĩa là, các nhà vật lý và toán học cũng là những nhà khoa học máy tính thực thụ! Những ưu điểm chính của FORTRAN là nó dễ hiểu, có giao diện tốt với hầu hết các thư viện chương trình con được viết sẵn (vì những thư viện này nói chung đều là mã lệnh FORTRAN được biên dịch). Các nhược điểm chính của FORTRAN đều gắn với sự cổ điển của nó so với các ngôn ngữ khác. Chẳng hạn. những câu lệnh điều khiển của FORTRAN đều tương đối sơ khai, trong khi khả năng nhập xuất dữ liệu của nó đúng là rất cổ lỗ.

FORTRAN 90: Ngôn ngữ này được mở rộng đáng kể từ FORTRAN 77 trong đó có lược đi nhiều đặc điểm bất tiện của ngôn ngữ cũ. Ngoài ra, nhiều đặc điểm “hiện đại”, như cấp phát bộ nhớ động, cũng được lần đầu tiên kèm theo trong ngôn ngữ. Đặc điểm bất lợi chủ yếu của ngôn ngữ này là thiếu một trình biên dịch có giá tiền vừa phải. Trong tương lai gần đây, không thấy rõ xu hướng cải thiện điều này.

C: Ngôn ngữ này ban đầu được các nhà khoa học máy tính phát triển để viết các hệ điều hành. Thật ra, tất cả những hệ điều hành nguồn gốc UNIX đều được viết bằng C. Do đó C là một ngôn ngữ rất mạnh và linh hoạt. Trong số những ưu điểm cơ bản của nó, phải kể đến cấu trúc lệnh điều khiển tốt và khả năng nhập xuất dữ liệu tuyệt vời. Nhược điểm lớn của C là ở chỗ nó không được viết riêng dành cho nghiên cứu khoa học, nên thiếu mất một số đặc điểm khoa học quan trọng như phép tính số phức. Dù C là một ngôn ngữ lập trình bậc cao, nó gồm nhiều đặc điểm cấp thấp so với các ngôn ngữ khác, ví dụ như con trỏ. (Điều này không đáng ngạc nhiên, vì ban đầu C được thiết kế để viết các hệ điều hành.) Những đặc điểm cấp thấp của C—đặc biệt là tinh sơ khai trong việc triển khai ma trận—đôi khi làm cho việc lập trình khoa học khó hơn so với mức cần thiết, và chắc chắn sẽ dễ gây lỗi khi lập trình. Nhưng mặt khác, các đặc điểm này giúp cho lập trình viên viết được mã lệnh cực kì hiệu quả. Vì nói chung, tính hiệu quả là điều đáng quan tâm nhất trong lĩnh vực tính toán khoa học nên những đặc điểm cấp thấp của C xét ra lại có lợi.

C++: Ngôn ngữ này được mở rộng từ C nhằm mục đích cho phép lập trình hướng đối tượng. Đây là một cách lập trình hoàn toàn khác so với phương pháp lập trình theo thủ tục thông dụng: nó đặc biệt phù hợp với những dự án lớn có liên quan đến nhiều người tham gia viết những đoạn mã lệnh riêng. Tuy vậy, việc lập trình hướng đối tượng sẽ làm phát sinh một khối lượng công việc lớn và không cần thiết, bên cạnh mục đích lập trình trực tiếp do từng cá nhân đảm nhiệm mà khóa học này hướng đến. Tuy vậy cũng cần lưu ý rằng C++ cũng có một số phần mở rộng rất có ích so với C, mà không liên quan đến hướng đối tượng.

Trong số các ngôn ngữ trên, ta có thể loại trừ ngay C++, vì hướng đối tượng là đặc điểm phức tạp không cần thiết (ít nhất là với mục đích hiện tại), và FORTRAN 90, vì thiếu mất một trình biên dịch có giá tiền vừa phải. Những lựa chọn còn lại là FORTRAN 77 và C. Cá nhân tôi chọn C (kết hợp với một số đặc điểm hữu ích của C++ mà không liên quan đến hướng đối tượng) cho khóa học này, đơn giản vì cảm thấy những đặc điểm cũ của FORTRAN 77 gây nhiều bất tiện khi dạy cho sinh viên trong giai đoạn đầu thế kỉ 21 này.

Advertisements

13 phản hồi

Filed under Vật lý tính toán

13 responses to “Nhập môn Vật lý tính toán

  1. Pingback: Chương 2: Lập trình khoa học bằng ngôn ngữ C | Blog của Chiến

  2. Pingback: Chương 5: Phương trình Poisson (Phần 1) | Blog của Chiến

  3. Pingback: Chương 3: Tích phân của các PVT (Phần 1) | Blog của Chiến

  4. Pingback: Chương 4: Con lắc hỗn loạn (Phần 1) | Blog của Chiến

  5. Pingback: Chương 5: Phương trình Poisson (Phần 2) | Blog của Chiến

  6. Pingback: Chương 6: Phương trình khuếch tán | Blog của Chiến

  7. Pingback: Chương 7: Phương trình sóng (Phần 1) | Blog của Chiến

  8. Pingback: Chương 7: Phương trình sóng (Phần 2) | Blog của Chiến

  9. Pingback: Chương 8: Chương trình tính dùng phương pháp hạt-trong-ô | Blog của Chiến

  10. Pingback: Chương 9: Các phương pháp Monte-Carlo (Phần 1) | Blog của Chiến

  11. Pingback: Chương 9: Các phương pháp Monte-Carlo (Phần 2) | Blog của Chiến

  12. Pingback: Chương 4: Con lắc hỗn loạn (Phần 2) | Blog của Chiến

  13. Pingback: Chương 3: Tích phân của các PVT (Phần 2) | Blog của Chiến

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s