Học giải tích với Julia
(jverzani.github.io)- Đây là ghi chú học tập giúp hiểu giải tích từ nhiều góc nhìn, tận dụng cú pháp dễ học của Julia và khả năng tính toán của ngôn ngữ này cho đồ thị và thí nghiệm số
- Theo dòng chảy rule of four kiểu Harvard, tài liệu cùng lúc đề cập các góc nhìn đồ thị, số, đại số và diễn giải bằng lời, nhưng với Julia chủ yếu minh họa khía cạnh đồ thị, số và một phần đại số
- Trong khi các hệ đại số máy tính như Mathematica, Maple, Sage mạnh về xử lý ký hiệu, ghi chú này đặt Julia làm công cụ trọng tâm cho tính toán số và bổ sung phần xử lý đại số khi cần
- Người học có thể chuẩn bị môi trường theo hướng dẫn cài đặt và giao diện, đồng thời dùng gói
CalculusWithJuliađể đơn giản hóa tác vụ lặp lại và các hàm dùng chung - Mỗi trang tập trung vào một khái niệm như một mục trong sách, và qua các bài tự chấm điểm ở cuối, người học có thể kiểm tra các khái niệm tính toán cần thiết để giải các bài giải tích nhập môn
Cách tiếp cận học giải tích bằng Julia
- Calculus with Julia là tập hợp ghi chú để học calculus bằng ngôn ngữ
Julia - Julia là một ngôn ngữ lập trình mã nguồn mở, và trong bộ ghi chú này, cú pháp dễ học cùng khả năng tính toán của nó được dùng như một công cụ phù hợp cho việc học giải tích
- Tài liệu chuẩn bị cho việc học cũng được cung cấp kèm theo
- Getting started with Julia: hướng dẫn cài đặt Julia và thiết lập cho người dùng
- Julia interfaces: giới thiệu nhiều cách tương tác với bản cài đặt Julia
- Từ giữa thập niên 1990, giáo dục giải tích đã có xu hướng sử dụng đồng thời nhiều góc nhìn, và “rule of four” theo kiểu Harvard hướng đến việc đưa vào càng nhiều càng tốt các yếu tố đồ thị, số, đại số và diễn giải bằng lời
- Bộ ghi chú này được xây dựng để thông qua Julia có thể khảo sát các khía cạnh đồ thị và số của giải tích, đôi khi cả khía cạnh đại số
Khác biệt với các hệ đại số máy tính
- Có nhiều ví dụ tích hợp hệ đại số máy tính như Mathematica, Maple, Sage vào việc học giải tích
- WolframAlpha cho phép gọi các chức năng của Mathematica đồng thời chấp nhận cú pháp không chính thức linh hoạt, và cũng có thể được dùng làm backend cho các tính năng của Apple Siri
- Những hệ thống này mô hình hóa tốt việc xử lý đại số và ký hiệu trong học tập, đồng thời cũng cung cấp phương tiện để thể hiện khía cạnh số
- Ngược lại, bộ ghi chú này dùng Julia chủ yếu như một công cụ tính toán số, rồi bổ sung xử lý đại số và ký hiệu trên nền đó
- Quá trình tự làm xử lý ký hiệu bằng tay có thể có ích cho việc học, nhưng các hệ đại số máy tính có thể dễ dàng tạo ra kết quả hoàn chỉnh, khiến phần luyện tập đó trở nên có vẻ trùng lặp
Phạm vi học tập và cấu trúc trang
- Mục tiêu là tiếp cận các khái niệm giải tích bằng cách tận dụng công nghệ mà không bị trói buộc vào các chi tiết máy móc của ngôn ngữ máy tính
- Cú pháp Julia được xem là không khó hơn đáng kể so với việc dùng máy tính cầm tay ở giai đoạn đầu, nhưng vẫn là một ngôn ngữ có khả năng mở rộng lớn
- Ghi chú thu gọn các khái niệm tính toán vào một tập hợp giới hạn
- Chỉ với tập hợp này cũng có thể giải được nhiều bài toán giải tích
- Tài liệu không đi sâu một cách toàn diện vào nhiều khía cạnh của lập trình
- Người học quan tâm hơn có thể khám phá sâu hơn thông qua Julia
- Trong tập hợp khái niệm tính toán giới hạn này có các toán tử giúp rút gọn phép tính giải tích thành các lời gọi hàm theo dạng
action(function, arguments...) - Với một tập nhỏ các thao tác (action) có thể kết hợp, có thể xử lý nhiều bài toán của giải tích nhập môn
- Mỗi trang được tổ chức xoay quanh một khái niệm tương đối tập trung, giống như một mục trong sách
- Cuối mỗi trang có các bài tập để tự giải, và tất cả đều có số lượng giới hạn đáp án tự chấm điểm
- Các ý tưởng được lấy từ Strang, Knill, Schey, Hass cùng cộng sự, Rogawski cùng cộng sự, Angenent, nhiều trang Wikipedia và các nguồn khác
Tài liệu đi kèm và cách chạy
- Bộ ghi chú đi kèm gói Julia
CalculusWithJulia- Cung cấp các hàm đơn giản giúp làm gọn những tác vụ phổ biến
- Tải các gói hữu ích sẽ được dùng lặp đi lặp lại
- Ghi chú được cung cấp dưới dạng sách Quarto, và có thể xem thông tin về sách Quarto tại tài liệu Quarto
- Có thể biên dịch tệp PDF bằng Quarto, nhưng cần phải khớp nhiều thành phần, kết quả không tối ưu lắm và kích thước tệp cũng khá lớn
- Có cung cấp bản PDF để tải xuống
- Có thể đóng góp thông qua liên kết “Edit this page” dưới dạng đề xuất chủ đề mới, sửa lỗi hoặc sửa lỗi chính tả, và người đóng góp được ghi nhận tại contributors
- Julia có thể được cài đặt dễ dàng bằng tiện ích
juliaup - Cũng có cung cấp liên kết tới các instance
binder.orgđể chạy Julia trên web, nhưng có giới hạn tài nguyên- Ảnh không có SymPy
- Ảnh có SymPy, thời gian tải lâu hơn
1 bình luận
Ý kiến trên Hacker News
Cá nhân tôi thấy đây là tài liệu rất phù hợp, vì con tôi sắp lên lớp 11 và chuẩn bị học SVC
Nếu tác giả đang đọc luồng này, tôi muốn biết liệu nó có phù hợp với học sinh trung học mới chỉ nhập môn Python ở mức cơ bản hay không
Quan trọng là tự giải bài và suy nghĩ về các khái niệm cơ bản hơn là bận tâm về cú pháp code; luyện bằng tay sẽ giúp nội hóa nội dung tốt hơn
Phần lập trình thì ổn, nhưng xem lướt qua thì phần giải thích toán được viết theo cách rất dễ gây rối cho người chưa biết giải tích; học sinh có thể cảm thấy mình kém toán trong khi thực ra chỉ là phần giải thích chưa đủ
Ví dụ, hình trong [1] có một đường cong đi qua một vùng tô bóng hình chữ L không có nhãn trục, rồi tiếp đó dùng phương trình tham số và nhiều phép thay thế để suy ra công thức tích phân từng phần
Ngay cả với người hiểu rõ tích phân từng phần, đây gần như là một trong những cách rối rắm nhất để suy ra hoặc giải thích công thức; nếu chưa hiểu khái niệm từ trước thì hình vẽ cũng không giúp được nhiều
Nếu từng xem các minh họa xuất sắc và giải thích rõ ràng như trong “Calculus” của James Stewart, sự tương phản sẽ rất rõ
Thông thường, phần giải thích tích phân từng phần cũng bắt đầu từ quy tắc đạo hàm của tích như tác giả, nhưng trước hết sẽ làm vài ví dụ đạo hàm tích để xây dựng trực giác về dạng nguyên hàm của kết quả, rồi tích phân hai vế và tách tích phân để suy ra công thức[2]
Cách đó rõ ràng và dễ theo dõi hơn nhiều; nếu thực sự muốn giúp học sinh, cũng nên dạy các cách như phương pháp bảng/“DI” để các em không khổ sở vì dấu khi phải tích phân từng phần nhiều lần
[1] https://jverzani.github.io/CalculusWithJuliaNotes.jl/integra...
[2] Đây là ghi chú suy luận tôi lập khi học. Nó không được viết để giải thích cho người mới bắt đầu mà chỉ là ghi chú cá nhân, nhưng vẫn dễ theo dõi hơn nhiều so với ví dụ trên https://publish.obsidian.md/uncarved/3+Resources/Public/Inte...
Vì vậy nếu phải gợi ý, tôi muốn khuyên đọc Quick Calculus của Kleppner và Ramsey
Không cuốn nào tôi từng dùng có thể sánh với cuốn này trong việc xây dựng trực giác cho các khái niệm mới tiếp xúc lần đầu
Sau khi nắm được điều đó thì sách hay nào cũng được; sách của James Stewart cũng tuyệt vời, nhưng quá dày, nên dùng như một sách tham khảo để chọn phần đọc và bài tập phù hợp thay vì bắt làm mọi bài từ trang 1
Mấu chốt là ngay từ đầu phải nắm chắc căn bản: đạo hàm, tích phân và giới hạn là gì; về điểm này Quick Calculus vượt trội
Nếu học sinh quan tâm đến lập trình, cũng có thể chọn các bài tập phù hợp từ cuốn Julia này hoặc sách tương tự để bổ sung cho Stewart; nếu muốn thì giải bằng Python cũng hoàn toàn ổn
Ở cùng độ tuổi đó, tôi cũng từng triển khai một bộ tích phân số và một bộ vi phân ký hiệu bằng Python để củng cố kiến thức giải tích; cả hai đều hữu ích và thú vị
Đặc biệt vi phân ký hiệu có cảm giác như phép màu, nhưng rốt cuộc cũng chỉ là parsing và liên tục thêm từng quy tắc đã học trong toán
Phần giải tích tôi học trong 2 năm cuối trung học, tương tự các năm trước đó, là học nhiều thuật toán thao tác ký hiệu, các bước cần một chút trực giác, cùng vài sự kiện về độ dốc và diện tích để giải bài toán có lời văn
Điều đầu tiên tôi học là quy tắc đạo hàm của x^n là n x^(n-1), một phần của thuật toán vi phân
Ở đại học, môn tương tự được gọi là giải tích học: định nghĩa nhiều khái niệm và chứng minh các tính chất của chúng
Các lớp như vậy nhìn chung theo cấu trúc ba phần: dãy và chuỗi cùng sự hội tụ về giới hạn; tính liên tục của hàm và giới hạn của hàm; đạo hàm và tích phân, và có lẽ một phần định lý Taylor
Kể từ khi Cauchy đưa nhiều định nghĩa “hiện đại” vào giáo trình, cấu trúc này về cơ bản không thay đổi nhiều; ngoại lệ rõ ràng là phần tích phân được biết đến với tên tích phân Riemann
Tôi không biết khóa này thuộc loại nào, nhưng vì nó bắt đầu bằng giới hạn nên có thể gần với loại sau hơn, và trong trường hợp đó tôi không rõ Julia hữu ích đến mức nào
Khi xét độ phù hợp, điểm cốt lõi có vẻ là nó có thể đòi hỏi độ chín toán học hơn là lập trình
Ở đây, độ chín toán học gần với khả năng xử lý các định nghĩa chính xác và khái niệm trừu tượng mà không rút ra hàng loạt kết luận sai, đồng thời theo dõi được lập luận dưới dạng chứng minh toán học
Tôi đã lướt qua vài chỗ trong cuốn sách, thấy khá thú vị và có cảm giác có thể khuyến khích trẻ học giải tích theo cách này
Tuy nhiên tôi tò mò về câu ở đoạn đầu lời nói đầu: “Julia là một ngôn ngữ lập trình mã nguồn mở có cú pháp dễ học và rất phù hợp với công việc này”
Vì sao Julia lại phù hợp hơn các ngôn ngữ khác?
Giống ký hiệu toán học chuẩn, nếu đặt một vô hướng trước biến thì sẽ được hiểu ngầm là phép nhân; ví dụ nếu x là 2 thì 3x được đánh giá là 6
Hỗ trợ Unicode cũng rất phong phú, nên các toán tử như ∈ và ∉ có thể trông hơi quá, nhưng hoạt động đúng như kỳ vọng; π được định nghĩa sẵn và thậm chí là kiểu số vô tỉ, còn √ cũng có thể dùng như toán tử, nên √2 là một biểu thức hợp lệ và trở thành một giá trị dấu phẩy động
Julia không chỉ hỗ trợ các cú pháp này mà còn cung cấp cách nhập chúng dễ dàng
Dù hơi ít liên quan hơn đến giải tích, vector và ma trận là kiểu dữ liệu hạng nhất, nên dễ nhập và dễ nhìn hơn nhiều so với Python
Đó là khác biệt giữa
m = [1 2 3; 4 5 6; 7 8 9]vàm = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]Chuyển vị được thực hiện bằng toán tử một ký tự
', tích trong có thể dùng toán tử dấu chấmm ⋅ n, vàA\bcũng hoạt động như trong MatlabNgoài ra còn hỗ trợ broadcasting, cũng có comprehension, nhưng cá nhân tôi thấy nhờ broadcasting mà ít cần comprehension hơn
Số hữu tỉ cũng được tích hợp sẵn và dùng cú pháp rất đơn giản như
1//2“Đối thủ” chính là Python vốn nổi tiếng có cú pháp toán học không tốt, hỗ trợ toán học trong thư viện chuẩn ít, hệ thống kiểu dữ liệu hạn chế và hiệu năng thực thi rất kém
Julia giải quyết các vấn đề đó, đồng thời cung cấp một ngôn ngữ tương đối dễ đọc, thường gần với ký hiệu toán học và hiệu năng cũng khá tốt
f’vàf’’Theo trải nghiệm cá nhân, cuốn “sách giải tích” hay nhất không dùng Julia mà dùng Haskell, và chỉ phụ thuộc vào thư viện để vẽ đồ thị: Learn Physics with Functional Programming
https://www.lpfp.io/
Julia được biết đến như “ngôn ngữ lập trình cho toán học”, và định hướng đó đã dẫn dắt nhiều phần trong quá trình phát triển
Một cách tường minh, nó hỗ trợ nhiều ký hiệu toán học khớp với ký hiệu viết tay hoặc LaTeX
Một cách ngầm hơn, có lẽ điều đó chỉ đến cú pháp được đơn giản hóa kiểu Python, khả năng tương tác rộng, việc dùng SymPy để đảm nhận nhiều xử lý trong hướng dẫn này, các thành phần cơ bản cho tính toán song song tích hợp sẵn, và biên dịch JIT cho phép lặp và khám phá nhanh
https://computationalthinking.mit.edu/Spring21/
Nói thật ngắn gọn thì đây là một ngôn ngữ khá giống Python ở một mức nào đó và cũng dễ viết tương tự, nhưng có cú pháp phong phú hơn nhiều để biểu đạt toán học trực tiếp
Notebook cũng phong phú hơn
Khác biệt cốt lõi là trong notebook Python bạn chạy các ô, còn notebook Julia xử lý những thứ như phụ thuộc
Nếu đổi x thành một số hoặc slider, mọi thứ phụ thuộc vào nó đều được cập nhật
Định nghĩa đồ thị rồi thêm slider là nó hoạt động ngay
Tôi cũng không phải chuyên gia Julia và chủ yếu làm việc với Python và JavaScript, nhưng trong các lớp học tương tự thì hai điểm trên thể hiện rất rõ
Thêm vào đó là hỗ trợ Unicode được dùng rất thường xuyên, và trong nhiều trường hợp có thể cố ý trông giống mã giả
Thú vị là vì muốn học ML nên gần đây tôi bắt đầu học lại toán, tức đại số tuyến tính, giải tích và thống kê
Trong lúc học nhiều nội dung, tôi cũng thử kèm các triển khai Python đơn giản; hơi xấu hổ là trước đây tôi chưa từng dùng Python
Việc có thể xoay vector và vẽ hàm bằng matplotlib khá tuyệt
Vẽ tay cũng được, nhưng không thể đẹp như vậy
Khi thiết kế một khóa như thế này thì cần hơi thận trọng
Nhìn chung, nó có khả năng thú vị nhất với những người đã biết phần nào cả giải tích lẫn lập trình, còn những người thuộc đối tượng dự kiến, tức đang học một trong hai thứ đó, có thể chưa sẵn sàng tiếp nhận kiểu lớp học này
Cá nhân tôi từng thử đưa một hệ đại số máy tính hơi lạ như Maxima hoặc Sagemath vào lớp giải tích, và phản ứng tốt nhất cũng chỉ là làng nhàng
Tôi nghĩ một phần vấn đề là sinh viên năm nhất không mấy hứng thú với việc cài phần mềm cho một môn không phải khoa học máy tính
Tuy vậy ở các lớp trình độ cao hơn một chút, nó có thể hoạt động khá tốt như một phần tùy chọn, và tôi từng có kết quả rất tốt với các dự án Python trong lớp phương trình vi phân thường
Việc Python không phải là một ngôn ngữ ngách chắc chắn cũng giúp ích
Dù vậy cuối cùng tôi nghĩ thách thức đó đáng để chấp nhận, và vẫn tốt hơn bắt họ tính mọi thứ bằng tay rồi tra giá trị trong bảng
Tài liệu tham khảo là gì, nếu có thể chia sẻ bất cứ thứ gì như ghi chú bài giảng, mã, slide, sách, v.v. thì rất tốt
Liên quan đến chuyện này, nếu dùng Emacs thì có gói Calc hỗ trợ đại số máy tính
Gần đây tôi đã công bố một giao diện giúp Calc dễ dùng hơn nhiều, và đã viết về nó ở đây
http://yummymelon.com/devnull/mathing-in-emacs-with-casual.h...
https://www.emacswiki.org/emacs/MaximaMode
Thích ý tưởng này
Tuy nhiên, sẽ tốt hơn nhiều nếu tài liệu kiểu này được xây dựng trên một thứ như MOOCulus, hoặc bắt đầu từ đó
https://ximera.osu.edu/mooculus/calculus1
Nhìn chung mình vẫn thích MOOCulus hơn
Dù vậy, giá trị mà Calculus with Julia bổ sung là rất lớn
Sẽ thật tốt nếu hai bên có thể được tích hợp với nhau theo cách nào đó
Điểm cốt lõi của MOOCulus là chất lượng bài viết tốt hơn, ít dài dòng hơn nhiều, và nhờ các bài tập tích hợp mà sinh viên theo sát nội dung một cách kỹ lưỡng
Nó cũng được dùng nhiều trong giảng dạy và đã được trau chuốt khá kỹ
Nếu fork rồi bổ sung Julia thì sẽ là một cải tiến rất lớn, và việc thêm các ví dụ ứng dụng có lẽ cũng vậy
Hơn nữa, ngay mục “Equal or Not?” đầu tiên mình bấm vào cũng có lỗi
Kết hợp Maxima và Gnuplot, cùng tài liệu đi kèm, cũng khá tốt
Mình nhớ là từng có một sách nhập môn/hướng dẫn PDF khá hoàn chỉnh về Maxima
Julia có thể là một lựa chọn thay thế hiệu quả cho người từng dùng Matlab không?
Có thể xem các khác biệt chi tiết tại https://docs.julialang.org/en/v1/manual/noteworthy-differenc...
Nó giống như đưa một ly nước đá cho người đang ở địa ngục
Mượn cách Steve Jobs từng nói về iTunes cho Windows là vậy; tất nhiên lúc đó iTunes chưa trở thành mớ hỗn độn về sau
Mình rất tôn trọng những gì Cleve Moler và Matlab đã làm được, đặc biệt là việc giúp LINPACK và EISPACK, v.v. trở nên dễ tiếp cận
Ban đầu Matlab cũng đã nỗ lực rất nhiều để vượt qua giới hạn chỉ có một kiểu dữ liệu duy nhất là ma trận
Nhưng Julia là một ngôn ngữ đa dụng hiện đại, làm việc dễ chịu hơn nhiều mà vẫn giữ gần như toàn bộ sức mạnh của Matlab
Nó nhanh hơn nhiều, nhìn chung có nhiều tính năng tốt hơn với tư cách một ngôn ngữ lập trình, và việc song song hóa cũng dễ hơn nhiều
Với tư cách người đã dùng cả hai trong công việc, mình sẽ nói rằng hiện nay nhìn chung Julia là lựa chọn tốt hơn
Tuy nhiên, các ngôn ngữ như Matlab hoặc Stata đã có một lượng khổng lồ thuật toán sẵn có được triển khai, và có thể Julia chưa có bản triển khai tương ứng
Nếu thứ bạn cần nằm trong số đó thì nhiều khi khó biện minh cho việc dùng ngôn ngữ khác
Trên thực tế, việc chuyển mã Matlab/Python/Stata sang Julia nhìn chung khá dễ
Mã Julia có thể dễ đọc hơn nhiều và có hiệu năng tốt hơn nhiều so với mã Matlab
Nếu không thì Julia cho cảm giác tốt và sẽ là một lựa chọn thay thế đầy đủ
Cú pháp có phần tương tự và cũng có nhiều tiện ích liên quan đến mảng của MATLAB
Ngoài ra, nó cung cấp một hệ thống kiểu dữ liệu tốt và xử lý lập trình đa dụng tốt hơn nhiều; chẳng hạn những thứ như vị trí đặt hàm không hành xử kỳ quặc
Khuyên bạn nên tự dùng thử
Liên kết PDF ở phần đầu trang trả về 404
“Các ghi chú này có thể được biên dịch thành tệp PDF thông qua Quarto. Vì kết quả khá lớn nên chúng tôi không cung cấp tệp để tải xuống. Độc giả quan tâm có thể tải kho lưu trữ về, khởi tạo môi trường, rồi chạy quarto trong thư mục con quarto để render thành PDF; tệp đó sẽ được tạo ra. Việc này mất một lúc”
“Tính toán là một cám dỗ cần chống lại càng lâu càng tốt”
— J.P. Boyd