Tải bản đầy đủ (.pdf) (97 trang)

sử dụng ngôn ngữ lập trình python cài đặt các thuật toán trong học phần giải tích số trong chương trình đào tạo ngành khoa học dữ liệu của trường đại học kinh tế kỹ thuật công nghiệp

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.04 MB, 97 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>KHOA KHOA HỌC ỨNG DỤNG </b>

K THU T CÔNG NGHI P <b>ỸẬỆ</b>

Tên đề tài:

<b>TRONG CHƯƠNG TRÌNH ĐÀO TẠO NGÀNH KHOA HỌC </b>

<b>CƠNG NGHIỆP </b>

<b>Giảng viên hướng dẫn: TS. Chu Bình Minh </b>

<b>Chủ nhiệm đề</b> tài: <b>Trần B o Trung ả</b>L p DHTI13A1HN <b>ớ</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>TRONG CHƯƠNG TRÌNH ĐÀO TẠO NGÀNH KHOA HỌC </b>

<b>CÔNG NGHIỆP </b>

<b>Giảng viên hướng dẫn: TS. Chu Bình Minh </b>

<b>Chủ nhiệm đề</b> tài: <b>Trần B o Trung ả</b>L p DHTI13A1HN <b>ớ</b>

KHOA KHOA H<b>ỌC Ứ</b>NG D<b>ỤNG </b>

K THU T CÔNG NGHI P<b>ỸẬỆ </b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>HÀ NỘI 4/2023</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

2. <b>MỤC ĐÍCH, ĐỐI TƯỢNG VÀ PH M VI NGHIÊN C U CẠỨỦA ĐỀ TÀI: ... 3</b>

3. <b>PHƯƠNG PHÁP VÀ NHIỆM V C A NGHIÊN CỤ ỦỨU: ... 3</b>

4. <b>CẤU TRÚC VÀ CÁC K T QUẾẢ CỦA ĐỀ TÀI: ... 3</b>

5. <b>Ý NGHĨA CỦA ĐỀ TÀI: ... 3</b>

Chương 1. Giới thiệu về ngôn ngữ lập trình Python ... 4

1.1. T ng quan v ngơn ng l p trình Python<b>ổềữ ậ</b> ... 4

1.1.1. <b>Giớ</b>i thi u v ngôn ng l p trình Python<b>ệềữ ậ</b> ... 4

1.1.2. <b>Cài đặ</b>t Python ... 4

1.2. <b>Giớ</b>i thi u v Python lõi<b>ệề</b> ... 5

1.2.1. M t s <b>ộ ố kiể</b>u d<b>ữ liệu trong Python lõi ... 5</b>

1.2.2. M t s phép tốn và hàm thơng d<b>ộ ốụng ... 5</b>

1.2.3. <b>Hàm và thư việ ... 16</b>n1.2.4. M t s <b>ộ ố thư viện toán học ... 17</b>

1.2.5. <b>Thư việ</b>n Numpy ... 20

1.2.6. <b>Vẽ đồ thị ớ</b> v i Matplotlib ... 23

Chương 2. Sử ụng Python cài đặ d t các thu t toán trong h c ph n Gi i tích sậ ọ ầ ả ố ... 25

2.1. <b>Giớ</b>i thi u v <b>ệề giả</b>i tích s<b>ố ... 25</b>

2.2. S d<b>ử ụng Python cài đặ</b>t các thu<b>ật tốn trong chương 2 của học phần Gi i tích sảố: Gi i gả ần đúng nghiệm thực của phương trình</b>... 26

2.2.1. S d<b>ử ụng Python để cài đặt cho phương pháp tìm kiếm gia tăng </b> 26 2.2.2. S d<b>ử ụng Python để cài đặt cho phương pháp chia đôi ... 28</b>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

2.2.3. S d<b>ử ụng Python để cài đặt cho phương pháp dây cung ... 29</b>

2.2.4. S d<b>ử ụng Python để cài đặt cho phương pháp tiếp tuyến .... 32</b>

2.2.5. S d<b>ử ụng Python để cài đặt cho phương pháp lặp đơn ... 35</b>

2.3. <b>Sử ụng Python cài đặ</b> d t các thu<b>ật toán trong chương 3 của học phần Gi i tích sảố: Gi i hả ệ phương trình đại số tuyến tính </b>... 37

2.3.1. S d<b>ử ụng Python để cài đặt cho phương pháp Gauss giải hệ phương trình: ... 38</b>

2.3.2. S d<b>ử ụng Python để cài đặt cho phương pháp phân rã LU . 41</b>

2.3.3. S d ng thu t toán ph n t <b>ử ụậầử trội để ả ến phương pháp </b> c i ti

<b>Gauss và phương pháp phân rã LU ... 43</b>

2.3.4. <b>Phương pháp lặp Jacobi xấp xỉ nghi m cho h ệệ phương trình đại số tuyến tính... 47</b>

2.3.5. <b>Phương pháp lặp Gauss-Seidel xấp x nghi m cho h ỉệệphương trình đại số tuyến tính ... 49</b>

2.3.6. <b>Phương pháp lặp Gradient liên hợp xấp x nghi m cho h ỉệệphương trình đại số tuyến tính ... 50</b>

<b>phần Gi i tích sảố: Nội suy và phương pháp bình phương nhỏ nhất .... 53</b>

2.4.1. S d<b>ử ụng Python để cài đặt cho phương pháp Lagrange ... 55</b>

2.4.2. S d<b>ử ụng Python để cài đặt cho phương pháp Newton ... 56</b>

2.4.3. S d<b>ử ụng Python để cài đặt cho thuật toán Neville x p x các ấỉđiể</b>m d <b>ữ li u ... 58ệ</b>

2.4.4. S d<b>ử ụng Python để cài đặt cho phương pháp Bình phương </b>

nh nh<b>ỏ ất x p x ấỉ các điể</b>m d <b>ữ liệu bằng đa thứ ... 59</b>c

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

2.5.5. S d<b>ử ụng Python để cài đặt cho phương pháp cầu phương </b>

Gaussian x p x <b>ấỉ tích phân xác định ... 71</b>

2.5.6. <b>Xấ</b>p x tích phân kép trên mi n t giác<b>ỉềứ</b> ... 77 2.5.7. <b>Xấ</b>p x tích phân kép trên mi n tam giác<b>ỉề</b> ... 80

<b>phần Gi i tích sảố: Tính gần đúng nghiệ</b>m c<b>ủa phương trình vi phân</b> .. 82 2.6.1. S d<b>ử ụng Python để cài đặt cho phương pháp Euler xấp xỉ </b>

<b>nghiệm cho phương trình vi phân ... 84 </b>

2.6.2. S d<b>ử ụng Python để cài đặt cho phương pháp Runge-Kutta87</b>

KẾT LU N Ậ ... 92 TÀI LI U THAM KH O Ệ Ả ... 93 PHỤ L C Ụ ... 95

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>MỤC LỤC HÌNH </b>

Hình 1. 1 Quá trình hoạt động của if... trong Python ... 8

Hình 1. 2 Quá trình hoạt động của if... else... trong Python ... 9

Hình 1. 3 Quá trình hoạt động của if... elif... else... trong Python ... 10

Hình 1. 4 Quá trình hoạt động của for. loop trong Python ... 11

Hình 1. 5 Quá trình hoạt động của while loop trong Python... 12

Hình 2. 1 Hình minh họa phương pháp dây cung ... 30

Hình 2. 2 Hình minh họa phương pháp tuyến tính ... 32

Hình 2. 3 Hình minh họa phương pháp lặp đơn ... 35

Hình 2. 4 Minh họa nội suy ... 54

Hình 2. 5 Minh họa khớp đường cong ... 60

Hình 2. 6 Vị trí các điểm lấy tích phân... 81

Hình 2. 7 Sai số của phương pháp Euler ... 86

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<b>MỤC LỤC BẢNG </b>

Bảng 1. 1 Danh sách các định dạng dữ liệu trong Python ... 5

Bảng 1. 2 Danh sách các phép toán số học cơ bản trong Python ... 5

Bảng 1. 3 Danh sách các toán tử trong Python... 6

Bảng 1. 4 Danh sách các toán tử so sánh trong Python ... 7

Bảng 1. 5 Danh sách các cách ép kiểu trong Python ... 13

Bảng 1. 6 Danh sách các hàm tích hợp sẵn trong Python ... 13

Bảng 1. 7 Danh sách các hàm số học được sử dụng trong thư viện Math ... 18

Bảng 1. 8 Danh sách các hàm lượng giác được sử dụng trong thư viện Math ... 18

Bảng 1. 9 Danh sách các hàm Hypebol được sử dụng trong thư viện Math ... 18

Bảng 1. 10 Danh sách các hàm logarit được sử dụng trong thư viện Math ... 19

Bảng 1. 11 Danh sách các hằng số được sử dụng trong thư viện Math ... 19

Bảng 1. 12 Danh sách các hàm hỗ trợ tính số phức được sử dụng trong thư viện Cmath ... 20

Bảng 1. 13 Danh sách các hàm thống kê sử dụng trong Numpy ... 22

Bảng 1. 14 Danh sách các phép toán với mảng sử dụng trong Numpy ... 23

Bảng 2. 1 Tập các điểm dữ liệu ... 53

Bảng 2. 2 Hướng dẫn tuyến tính hóa một số đường cong ... 63

Bảng 2. 3 Bảng hệ số công thức sai phân trung tâm xấp xỉ đạo hàm ... 64

Bảng 2. 4 Bảng hệ số công thức sai phân tiến bậc hai xấp xỉ đạo hàm ... 65

Bảng 2. 5 Bảng hệ số công thức sai phân lui bậc hai xấp xỉ đạo hàm ... 65

Bảng 2. 6 Bảng tham chiếu của Gauss-Legendre ... 73

Bảng 2. 7 Bảngtham chiếu Gaus-Laguerre... 76

Bảng 2. 8 Bảng tham chiếu Gaus-Hermite ... 76

Bảng 2. 9 Bảng tham chiếu Gauss với Lôgarit kỳ dị ... 77

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>DANH MỤC TỪ VIẾT TẮT </b>

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>LỜI MỞ ĐẦU </b>

1. T NG QUAN V TÌNH HÌNH NGHIÊN C U VÀ LÝ DO CH<b> ỔỀỨỌN ĐỀ</b> TÀI Giải tích số (hoặc Phương pháp tính) là các kỹ thuật mà theo đó các bài tốn được xây d ng sao cho chúng có thự ể được giải bằng các phép toán s h c và logic. Các phép ố ọtính này được thực hiện một cách chính xác và hiệu quả bởi các máy tính kỹ thuật số nên các kỹ thuật trong phương pháp tính rất phù h p cho vi c tính tốn b ng máy tính. ợ ệ ằTrước khi máy tính ra đời, việc thực hiện tính tốn một số lượng lớn các phép toán số h c và logic t n nhi u th i gian và nhàm chán nên Gi i tích sọ ố ề ờ ả ố chưa được quan tâm. Tuy nhiên, v i sớ ự ra đờ ủi c a máy tính k thu t s ngày càng nhanh và ph bi n, vai trò ỹ ậ ố ổ ếcủa Giải tích s trong viố ệc giải quyết các vấn đề ỹ thuật và khoa h k ọc đã trở nên quan trọng. Do vậy, Gi i tích sả ố đã trở thành m t ph n n n t ng giáo dộ ầ ề ả ục cơ bản cho m i k ỗ ỹsư, ỗ m i nhà khoa học, đặc biệt là trong Khoa học dữ liệu.

Giải tích số được gi ng cho sinh viên ngành Khoa h c dả ọ ữ liệu của trường Đạ ọc i hKinh tế – ỹ thuậ K t Công nghi p ệ [1] ớ v i thời lượng 3 tín ch . M c tiêu c a h c ph n ỉ ụ ủ ọ ầ [2]là:

Mục tiêu về ế ki n thức:

- Sinh viên hiểu được các phương pháp giả ối s các bài toán g m: x p x nghiồ ấ ỉ ệm thực của phương trình; giải hệ phương trình tuyến tính; x p xấ ỉ đường cong đi qua các điểm dữ liệu; tính gần đúng tích phân, đạo hàm; xấp xỉ nghiệm của phương trình vi phân.

- Hiểu cách s dử ụng sơ đồ khối để mô tả các thuật toán.Mục tiêu về ỹ năng: k

- Sinh viên có khả ứng dụng các phương pháp số vào gi i quy t các bài tốn ả ếchun mơn có liên quan.

Mục tiêu về đạo đức và trách nhiệm:

- Rèn luyện được tác phong làm vi c t m , nghiêm túc, chệ ỉ ỉ ủ động, tích cực, chăm chỉ, cẩn thận.

Trong tài li u h c tệ ọ ập Phương pháp tính của Trường dạy cho sinh viên các ngành Điện T– ự động hố, Điện tử, Cơ khí… các thuật tốn được cài đặt bằng ngơn ng lập ữtrình Matlab [3]. Vi c s d ng ngôn ng lệ ử ụ ữ ập trình Matlab cài đặt các thu t toán r t phù ậ ấh p cho sinh viên các chuyên ngành này vì vi c này v a giúp cho sinh viên hi u sâu ợ ệ ừ ểsắc hơn về các thu t toán, v a giúp cho sinh viên làm quen và rèn luy n kậ ừ ệ ỹ năng viết code b ng Matlab vì Matlab là ngơn ng l p trình r t quan tr ng cho sinh viên các ằ ữ ậ ấ ọngành này. Tuy nhiên, v i ngành Khoa h c dớ ọ ữ liệu thì ngơn ng ữ được s d ng ph bi n ử ụ ổ ế

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

và r t quan tr ng là ngơn ng l p trình Python nên vi c s d ng ngôn ng l p trình ấ ọ ữ ậ ệ ử ụ ữ ậMatlab đểcài đặt các thuật tốn là khơng phù hợp.

Python là ngơn ng lữ ập trình hướng đối tượng, c p cao, m nh mấ ạ ẽ, được t o ra bạ ởi Guido van Rossum với rất nhiều ưu điểm phù h p v i ngành Khoa hợ ớ ọc dữ liệ [4] như: u

- Ngơn ng l<b>ữ ập trình đơn giả</b>n, d h<b>ễ ọc: Python có cú pháp r</b>ất đơn giản, rõ ràng. Nó dễ đọc và viết hơn rất nhi u khi so sánh v i nh ng ngôn ng l p trình khác ề ớ ữ ữ ậnhư C++, Java, C#. Python làm cho việc lập trình trở nên thú vị, cho phép lập trình viên tập trung vào nh ng gi i pháp ch không ph i cú pháp. ữ ả ứ ả

<b>- Miễn phí, mã ngu n mồở: Lập trình viên có th t do s d ng và phân ph</b>ể ự ử ụ ối Python, thậm chí là dùng nó cho mục đích thương mại. Vì là mã ngu n m , l p ồ ở ậtrình viên khơng nh ng có th s d ng các ph n mữ ể ử ụ ầ ềm, chương trình được viết trong Python mà cịn có thể thay đổi mã ngu n c a nó. Python có m t c ng ồ ủ ộ ộđồng r ng l n, khơng ngừng cảộ ớ i thi n nó m i lần cập nhật. ệ ỗ

<b>- Khả năng di chuyển: </b>Các chương trình Python có thể di chuy n t n n t ng ể ừ ề ảnày sang n n t ng khác và ch y nó mà khơng có b t kề ả ạ ấ ỳ thay đổi nào. Nó ch y ạliền m ch trên h u hạ ầ ết t t cấ ả các nền tảng như Windows, macOS, Linux.

<b>- Khả năng mở rộng và có thể nhúng: Giả s m</b>ử ột ứng dụng đòi hỏ ựi s ph c t p ứ ạrất l n, l p trình viên có th d dàng k t h p các ph n code b ng C, C++ và ớ ậ ể ễ ế ợ ầ ằnh ng ngơn ng khác (có th gữ ữ ể ọi đượ ừ C) vào code Python. Điềc t u này s cung ẽcấp cho ng d ng cứ ụ ủa lập trình viên những tính năng tốt hơn cũng như khả năng scripting mà những ngơn ng l p trình khác khó có th ữ ậ ể làm được.

- Ngơn ng thông d ch c p cao:<b>ữịấ</b> Không giống như C/C++, v i Python, l p trình ớ ậviên không ph i lo l ng nh ng nhi m vả ắ ữ ệ ụ khó khăn như quản lý bộ nhớ, d n d p ọ ẹnh ng dữ ữ liệu vơ nghĩa... Khi chạy code Python, nó s tẽ ự động chuyển đổi code sang ngôn ng máy tính có th hi u. L p trình viên khơng c n lo l ng v b t k ữ ể ể ậ ầ ắ ề ấ ỳhoạt động c p th p nào. ở ấ ấ

<b>- Thư viện tiêu chuẩn lớn để giải quyết những tác vụ phổ biến: Python có một </b>

số lượng lớn thư viện tiêu chu n giúp cho cơng vi c l p trình c a l p trình viên ẩ ệ ậ ủ ậtrở nên dễ ở hơn rấth t nhiều, đơn giản vì không phải tự viế ấ ả code. t t t c

<b>- Hướng đối tượng: M i th</b>ọ ứ trong Python đều là hướng đối tượng. L p trình ậhướng đối tượng (OOP) giúp giải quyết những vấn đề phức tạp một cách trực quan. V i OOP, l p trình viên có th phân chia nh ng vớ ậ ể ữ ấn đề ph c t p thành ứ ạnh ng t p nh ữ ậ ỏ hơn bằng cách tạo ra các đối tượng.

Ngơn ng lữ ập trình Python được s d ng là ngôn ng chính, xun su t q trình ử ụ ữ ốđào tạo ngành Khoa học dữ liệu của Trường Đại học Kinh tế – Kỹ thuật Cơng nghiệp [1]. Do đó, việc sử dụng Python để cài đặt các thuật toán trong học phần Giải tích số sẽ

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

giúp cho sinh viên ngành Khoa h c dọ ữ liệu hi u sâu sể ắc hơn về thuật toán, v a giúp ừcho sinh viên rèn luyện k ỹ năng lập trình bằng ngơn ng lữ ập trình Python.

2.<b> MỤC ĐÍCH, ĐỐI TƯỢ</b>NG VÀ PH M VI NGHIÊN C U C<b>ẠỨỦA ĐỀ TÀI:</b>

- Nghiên cứu các phương pháp tính trong học phần Giải tích số. - Nghiên cứu sơ đồ khối của các thuật toán trong học phần Giải tích s . ố- Nghiên cứu ki n th c, k ế ứ ỹ thuật lập trình b ng ngôn ng Python. ằ ữ

- Dựa vào các sơ đồ kh i, s d ng ngôn ng ố ử ụ ữ Python để cài đặt cho các thuật toán.3.<b> PHƯƠNG PHÁP VÀ NHIỆ</b>M V C A NGHIÊN C<b>Ụ ỦỨU:</b>

- Phân tích các tính ch t cấ ủa sơ đồ kh i c a các thu t toán trong h c ph n Giố ủ ậ ọ ầ ải tích số.

- Tổng h p mợ ột số ế ki n thức, kỹ thuật về ngôn ng l p trình Python. ữ ậ

- S d ng ngơn ng lử ụ ữ ập trình Python cài đặt các thu t toán trong h c ph n Giậ ọ ầ ải tích số.

4.<b> CẤ</b>U TRÚC VÀ CÁC K<b>ẾT QUẢ ỦA ĐỀ TÀI:</b> C

Ngoài ph n l i mầ ờ ở đầu, k t lu n và tài li u tham khế ậ ệ ảo, đề tài được chia làm 2 chương với cấu trúc và kết qu của tả ừng chương như sau:

- Chương 1. Giới thi u v ngôn ng lệ ề ữ ập trình Python: Chương này sẽ trình bày t ng quan v ngôn ng l p trình Python và mổ ề ữ ậ ột số thư viện h ỗ trợ trong Gi i tích ảs . ố

- Chương 2. Sử ụng Python cài đặ d t các thuật toán trong học phần Giải tích số: Đây là chương chứa nội dung chính của đề tài

5.<b> Ý NGHĨA CỦA ĐỀ</b> TÀI:

Python được sử dụng rộng rãi trong lĩnh vực khoa học dữ liệu vì nó có cú pháp trực quan, tương đối dễ học và sử dụng. Ngoài ra, Python cịn có hàng trăm thư viện và Framework giúp cho vi c x lý dệ ử ữ liệu tr nên dở ễ dàng hơn nên có cộng đồng s d ng ử ụl n. M t khác, ớ ặ Giải tích s có vai trị quan tr ng trong khoa h c dố ọ ọ ữ liệu, vì nó giúp x ửlý và phân tích các dữ liệ ớu l n và ph c t p mà không th giứ ạ ể ải được b ng các công thằ ức đơn giản. Do vậy, vi c nghiên c u ngôn ngệ ứ ữ Python để cài đặt cho các phương pháp trong h c ph n Gi i tích s là r t c n thi t. Các k t qu cọ ầ ả ố ấ ầ ế ế ả ủa đề tài có th làm tài li u ể ệtham kh o cho gi ng viên và sinh viên ngành khoa h c dả ả ọ ữ liệu. Nó giúp cho người đọc hiểu sâu hơn về các phương pháp giải số cũng như rèn luyện được kỹ năng lập trình.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>Chương 1. Giới thiệu về ngôn ngữ lập trình Python </b>

1.1. T ng quan v ngơn ng l p trình Python <b>ổềữ ậ</b>

1.1.1.<b> Giới thiệ</b>u v ngơn ng l p trình Python <b>ềữ ậ</b>

Python là m t ngôn ng lộ ữ ập trình hướng đối tượng được phát tri n vào cu i nh ng ể ố ữnăm 1980 (tên Python có nguồn gốc từ loạt phim truyền hình của Anh, MontyPython’s Flying Circus) [5]. M c dù Python không n i ti ng trong gi i kặ ổ ế ớ ỹ thuật cũng như mộ ốt s ngôn ngữ khác, nhưng nó có một lượng người theo dõi đáng kể trong cộng đồng l p ậtrình. Python có thể được xem như một ngơn ng m i n i, vì nó vữ ớ ổ ẫn đang được phát triển và hoàn thi n. Hi n t i, nó là m t ngơn ngệ ệ ạ ộ ữ tuyệt vời để phát tri n các ng d ng ể ứ ụk ỹ thuật.

Các chương trình Python khơng được biên dịch thành mã máy mà được chạy bởi trình thơng dịch. Ưu điểm lớn c a ngôn ng thông dủ ữ ịch là các chương trình có thể được ki m tra và g lể ỡ ỗi nhanh chóng, cho phép người dùng t p trung nhiậ ều hơn vào các thuật toán của chương trình và ít tập trung hơn vào bản thân chương trình. Vì khơng cần biên d ch, liên k t và th c thi sau m i l n sị ế ự ỗ ầ ửa, các chương trình Python có thể được phát triển trong th i gian ngờ ắn hơn nhiều so với các chương trình Fortran hoặc C tương đương. Về nhược điểm, các chương trình thơng dịch không tạo ra các ứng dụng độc lập. Do đó, một chương trình Python chỉ có thể chạy trên các máy tính đã cài đặt trình thơng dịch Python.

Trong mơi trường học tập, Python có những ưu điểm so với một số ngơn ngữ lập trình khác là:

- Python là một phần mềm mã nguồn mở, có nghĩa là nó miễn phí.

- Python có s n cho t t c các hẵ ấ ả ệ điều hành chính (Linux, Unix, Windows, Mac OS... ). Một chương trình được vi t trên m t hế ộ ệ điều hành này ch y mà không ạcần sửa đổi trên tất cả các hệ điều hành khác.

- Python dễ học hơn và dễ đọc code hơn hầu h t các ngôn ng . ế ữ- Python và các phần m r ng c a nó rở ộ ủ ất dễ cài đặt. 1.1.2.<b> Cài đặ</b>t Python

Trình thơng d ch ị Python có thể được t i ả xu ng ố t ừ Tuy nhiên để thuận tiện cho việc cài đặt môi trường sử d ng cho cho ngôn ngữ Python sử d ng b công c Anaconda là lựa ch n ụ ụ ộ ụ ọthích h p nh t. Ngoài vi c cung c p s n các ph n m m biên d ch và hợ ấ ệ ấ ẵ ầ ề ị ỗ trợ ngườ ậi l p trình trong quá trình l p trình Python, viậ ệc cài đặt các thư viện ngoài khi s d ng ử ụAnaconda trở nên đơn giản hơn rất nhiều.

Anaconda được tải xuống từ

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

1.2.<b> Giớ</b>i thi u v Python lõi <b>ệề</b>

1.2.1.<b> Một số kiểu dữ liệ</b> u trong Python lõi

Tương tự như các loại ngôn ngữ lập trình bậc cao khác, khi khai báo một biến bất kì trong Python, ki u d u cể ữ liệ ủa nó sẽ được tự động định d ng. ạ

Chia lấy dư % <small>print(4 % 3) # 1</small>

Chia lấy nguyên // <small>print(8 // 5) # 1</small>

Số mũ ** <small>print(8 ** 5) # 32768</small>

<small>B ng 1. 2 Danh sách các phép toán s hảố ọc cơ bản trong Python</small>

<b>Các toán tử gán: </b>

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

Tương tự với vòng lặp xác định, break và continue cũng có cơng dụng tác động vào vòng l p ặ

- Break: dùng để dừng tồn bộ q trình chạy vịng lặp

- Continue: dùng để dừng vòng lặp hiện tại và chuyển sang vịng lặp tiếp theo Vịng lặp khơng xác định cũng sử dụng else tương tự như vòng lặp xác định. Else sẽ được thực thi nếu như vòng lặp hồn tất được chu trình lặp trong suốt chuỗi lặp. Tuy nhiên nếu vòng lặp bị dừng giữa chừng bằng break, các câu lệnh trong else sẽ không được tiến hành

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<small>#('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')</small>

<small>str = 'abcdefgh'</small>

<small>print(set(str)) </small>

<small>#{'d', 'g', 'e', 'h', 'f', 'c', 'a', 'b'}</small>

list() <sub>Chuyển đổi thành list </sub>

<small>str = 'abcdefgh'</small>

<small>print(list(str)) </small>

<small>#['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']</small>

dict() <sub>Chuyển đổi tuple thành từ điển </sub>

<small>tup = (( , ) ,('a'1'f', ), ('g', )) print(dict(tup)) </small>

<small>#{'a': 1, 'f': 2, 'g': 3}</small>

string() Chuyển đổi thành kiểu chuỗi

<small>tup = (( , ) ,('a'1'f', ), ('g', )) print(str(tup)) </small>

<small>#(('a', 1), ('f', 2), ('g', 3))</small>

complex() <sup>Chuyển đổi số thực thành số </sup>phức

<small>print(complex( ,1 2)) </small>

ASCII tương đương

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Tập tin là m t t p h p liên tộ ậ ợ ục các Byte được s dử ụng để lưu trữ ữ liệu. Dữ liệu dnày được tổ chức theo một định dạng cụ thể và có thể lưu trữ bất cứ th gì, từ tứ ệp văn bản đơn giản đến các chương trình thực thi ph c tứ ạp. Khi máy tính x ử lý, các tệp này s ẽđược biên d ch sang dạng nh ị ịphân 0 và 1 đểđọc ghi và thực thi các chương trình.

- Folder path: Vị trí thư mục trên hệ thống, các thư mục nhỏ được tách nhau bởi d u g ch chéo (/) ấ ạ

- File name: Tên của tệp tin

- Extension: Cuối đường d n ch ẫ ỉ định định d ng cạ ủa tập tin (.txt, .csv, .pdf,....) Ví dụ:

<b>Đóng mở tệp tin b ng Python: ằ</b>

Khi làm vi c v i t p tin, việ ớ ệ ệc đầu tiên là m tở ệp tin đó. Python sẽ ử ụ s d ng hàm open() nh n vào mậ ột đối số là chuỗi ký tự đường d n cẫ ủa tệp tin

<small>file = open('E:\PythonTeachingLab\test.txt') </small>

Việc quan tr ng b t bu c ph i nh sau khi m m t tọ ắ ộ ả ớ ở ộ ệp tin là đóng tệp tin đó lại. Trong nhiều trường h p, khi h y b m t câu l nh hay mợ ủ ỏ ộ ệ ột chương trình, tệp tin s t ẽ ựđộng đóng lại, tuy nhiên chúng ta không xác định chắc chắn được điều này sẽ xảy ra. Do vậy để đảm b o an toàn, khơng xả ảy ra các trường h p ngồi ý mu n, chúng ta phợ ố ải chắc chắn tệp tin sẽ được đóng lại bằng khối lệnh try-finally

<small>reader = open('E:\PythonTeachingLab\test.txt') </small>

<small>try: </small>

<small> # kh i l nh xố ệử lýfinally: reader.close() </small>

Một cách khác để đả m b o tả ệp tin được đóng hồn tồn là sử ụ d ng câu l nh with: ệ<small>with open('E:\PythonTeachingLab\test.txt') as reader: </small>

<small> # kh i l nh xố ệử lý</small>

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

With s tẽ ự động đóng tập tin đang sử ụng khi chương trình thốt khỏ d i kh i l nh ố ệx ử lý có trong nó

Ngồi ra có th s d ng thêm mể ử ụ ột đố ố thứ hai đểi s quyết định cách tệp tin được m (mode): ở

<small>with open('E:\PythonTeachingLab\test.txt','r') as reader: # kh i l nh xố ệử lý</small>

Có nhiều l a ch n khác nhau cho mode khi m mự ọ ở ột tệp tin: - ‘r’: mở để đọc tệp tin (mặc định)

- ‘w’: mở ghi t p tin (t p s b để ệ ệ ẽ ị ghi đè)

- ‘rb’ hoặc ‘wb’: mở dưới dạng nhị phân (đọc và ghi dướ ạng byte) i d

<b>Đọc và ghi tệp tin b ng Python: ằ</b>

Có ba phương pháp đọc nội dung tệp tin có thể dùng trên Python:

- .read(size=-1): nếu khơng có đối s truy n vào ho c truy n vào -1, t p tin s ố ề ặ ề ệ ẽđược đ c toàn bộ ọ

- .readline(size=-1): đọc t ng dòng v i sừ ớ ố lượng ký tự là đối số truyền vào. Nó đọc hết dịng r i quay tr lồ ở ại ban đầu. Nếu khơng có đối số truyền vào hoặc truyền vào là -1 thì c dịng s ả ẽ được đọc.

- .readlines(): đọc tất cả các dòng chưa đọc trong tệp tin rồi g i vử ề dưới dạng list Có 2 phương pháp để ghi t p tin b ng Python: ệ ằ

- .write(): ghi m t chu i ký t vào t p tin ộ ỗ ự ệ

- .writelines(): ghi các chu i ký t vào tỗ ự ệp tin, người dùng ph i t thêm các ký ả ựhi u k t thúc vào cu i mệ ế ố ỗi chuỗi

1.2.2.10. Xử lý ngoạ ệi l :

Khi m t l i x y ra trong quá trình th c hi n mộ ỗ ả ự ệ ột chương trình, một ngo i l s ạ ệ ẽđược đưa ra và chương trình sẽ dừng lại. Có thể bắt gặp các trường hợp ngoại lệ bằng các câu lệnh try và except:

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<small> <Kh i lố ệnh thực thi> </small>

- try: khối lệnh cho phép thực thi thử- except: khối lệnh giúp x ửlý khi lỗi xảy ra - else: khối lệnh th c thi khi không x y ra l i ự ả ỗ

- finally: khối lệnh th c thi sau khi quá trình ch y th hoàn t t ự ạ ử ấ

ERROR là tên c a m t ngo i l Python tích h p s n (built-in Python exception). ủ ộ ạ ệ ợ ẵNếu error ngo i l không g p, kh i các l nh trong khạ ệ ặ ố ệ ối try được thực thi, ngượ ạc l i các l nh trong khệ ối EXCEPT được th c thi. T t c các ngo i l có thự ấ ả ạ ệ ể được phát hi n b ng ệ ằcách bỏ qua ERROR khỏi câu lệnh EXCEPT.

1.2.3.<b> Hàm và thư việ</b>n 1.2.3.1. Hàm (Function)

Hàm là một khối lệnh chỉ được thực thi khi gọi đến nó. Người dùng có thể truyền dữ liệu vào hàm thơng qua các tham số và hàm cũng có thể trả về các kết quả mà nó xử lý thành cơng.

Khai báo một hàm sử dụng def: <small>def <Tên hàm>(<tham số>): <Kh i lố ệnh thực thi> </small>

Để thực thi hàm, ta cần gọi đúng tên của hàm đã được khai báo Ví dụ 1:

<small>def my_function(): print("Đây là hàm") my_function() </small>

Truyền dữ liệu vào hàm thơng qua tham số Ví dụ 2:

<small>def my_function(ho, ten): print(ho + " " + ten) my_function("Smith", "John")</small>Hàm với tham số mặc địnhVí dụ 3:

<small>def my_function(ho ="Smith", ten = "John"): print(ho + " " + ten) </small>

<small>my_function() </small>

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

1.2.3.2. Hàm Lambda

Trong Python, hàm vô danh là hàm được định nghĩa mà khơng có tên. Nếu các hàm bình thường được định nghĩa bằng cách sử dụng từ khóa def, thì hàm vô danh được định nghĩa bằng cách sử dụng từ khóa lambda. Vì lý do đó mà hàm vơ danh cịn được g i là hàm Lambda. ọ

<small>lambda <tham số>: <l nh th c thi> ệự</small>

Hàm Lambda có th có nhi u tham sể ề ố nhưng chỉ có 1 bi u th c. Bi u th c sể ứ ể ứ ẽ được đánh giá và trả về. Hàm Lambda có thể được sử dụng ở bất cứ nơi nào đối tượng hàm được yêu cầu.

1.2.3.3. Thư viện

Thư viện trong Python là tập hợp các module được viết sẵn để giúp cho việc lập trình Python tr nên dở ễ dàng hơn và nhanh chóng hơn. Các thư viện này cung c p các ấhàm, lớp và phương thức được định nghĩa sẵn để thực hi n các tác v cệ ụ ụ thể ừ đó , tgiảm thiểu th i gian và công sờ ức cần thiế ểt đ phát tri n mể ột ứng d ng. ụ

Python có nhiều thư viện ph biổ ến như NumPy, Pandas, Matplotlib, Scikit-learn, TensorFlow, Django, Flask, và nhiều thư viện khác n a. Mữ ỗi thư viện có các tính năng, chức năng và ứng dụng khác nhau, phục vụ cho các mục đích khác nhau của lập trình viên.

1.2.4.<b> Một số thư việ</b>n toán h c <b>ọ</b>

1.2.4.1. Thư viện Math

Một số phép toán phức tạp như cos, sin, tan, cotan hay logarit,... cần phải sử dụng thư viện Math để tiến hành

Để sử dụng các hàm của thư viện, ta khai báo thư viện Math trước khi tiến hành lập trình:

gần nhất <sup>math.floor(</sup><sup>1.001</sup><sup>) </sup><sup># returns 1 </sup>math.factorial() Trả về giai thừa của một số <sup>math.factorial(</sup><sup>10</sup><sup>) </sup><sup># returns </sup>

<small>3628800</small>

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

math.gcd() <sup>Trả về ước chung lớn nhất của </sup>

hai số nguyên <sup>math.gcd( ,</sup><sup>10 125</sup><sup>) </sup><sup># returns 5 </sup>math.trunc() <sup>Trả về phần nguyên của một </sup>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

Các hàm lũy thừa và logarit:

inf Trả về một dấu phẩy động vô cực dương

nan Trả về giá trị NaN dấu phẩy động (Không phải là Số) pi Trả về Pi (3.1415...)

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

1.2.5.1. Giới thiệu về Numpy

Numpy là một thư viện lõi ph c v cho khoa h c máy tính c a Python, hụ ụ ọ ủ ỗ trợ cho vi c tính tốn các m ng nhi u chiệ ả ề ều, có kích thướ ớc l n với các hàm đã đượ ối ưu áp c td ng lên các m ng nhi u chiụ ả ề ều đó. Numpy đặc bi t h u ích khi th c hi n các hàm liên ệ ữ ự ệquan tới Đại Số Tuy n Tính ế

Thực hiện cài đặt numpy bằng anaconda, trên terminal chỉ cần gõ lệnh:

<small>conda install numpy</small>

Để sử dụng các hàm của thư viện, ta khai báo thư viện Numpy trước khi tiến hành lập trình:

<small>import numpy as np </small>1.2.5.2. T o m t m ng ạ ộ ả

Numpy được sử dụng để làm việc với mảng, nó có thể tạo mảng với nhiều chiều. Mảng được tạo bởi Numpy có định dạng là ndarray

Khai báo mảng 0 chiều: <small>arr = np.array(42 , dtype = int) </small>Khai báo mảng 1 chiều:

<small>arr = np.array([ , 1 2 3 4 5, , , ] , dtype = int) </small>Khai bảo mảng 2 chiều:

<small>arr = np.array([[1, ], [45 6, ]] , dtype = int) </small>Khai báo mảng 3 chiều:

<small>arr2 = np.array(([(2 0 6,4, , ), ( , ,4 75,6)], [(0 2 1,3, , ), ( , ,9 45,6)], [(5 6 4,8, , ), ( , ,1 46,8)]), dtype = int) </small>

Ngồi ra có thể khởi tạo mảng với một số hàm có sẵn

- np.zeros((3,4), dtype = int): Tạo mảng hai chiều các phần tử 0 với kích thước 3x4.

- np.ones((2,3,4), dtype = int): Tạo mảng 3 chiều các phần tử 1 với kích thước 2x3x4.

- np.arange(1,7,2): Tạo mảng với các phần tử từ 1 6 với bước nhảy là 2.- - np.full((2,3),5): Tạo mảng 2 chiều các phần tử 5 với kích thước 2x3. - np.eye(4, dtype=int): Tạo ma trận đơn vị với kích thước là 4x4.

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

- np.random.random((2,3)): Tạo ma trận các phần tử ngẫu nhiên với kích thước 2x3.

Khi một mảng được khai báo, nó sẽ đi kèm với các giá trị: - dtype: Kiểu dữ liệu của phần tử trong mảng.

- shape: Kích thước của mảng. - size: Số phần tử trong mảng. - ndim: Số chiều của mảng.

1.2.5.3. Truy cập và thay đổi ph n t trong m ng ầ ử ả

Các phần tử trong mảng được đánh số ừ t 0 trở đi, để truy cập đến các phần t ử đó ta s d ng: ử ụ

- arr[i]: Truy cập tới phần tử thứ i của mảng 1 chiều. - arr1[i,j]: Truy cập tới phần tử hàng i, cột j của mảng 2 chiều. - arr2[n,i,j]: Truy cập tới phần tử chiều n, hàng i, cột j của mảng 3 chiều. - arr[a:b]: Truy cập tới các phần tử từ a đến b 1 trong mảng 1 chiều. -

- arr1[:,:i]: Truy cập tới phần tử từ cột 0 đến cột i 1, của tất cả các hàng trong mảng 2 chiều.

Lấy giá trị lớn nhất của mảng arr

<small>arr = np.array([ , 1 3 4 5 6, , , ], dtype=int) </small>

<small>print("Giá trị lớn nhất của mảng arr là:", np.max(arr)) </small>

<small>#Giá trị lớn nhất của mảng arr là: 6</small>

arr.min() hoặc np.min(arr)

Lấy giá trị nhỏ nhất của mảng arr.

<small>arr = np.array([ , 1 3 4 5 6, , , ], dtype=int) </small>

<small>print("Giá trị nhỏ nhất của mảng arr là:", np.min(arr)) </small>

<small>#Giá trị nhỏ nhất của mảng arr là: 1</small>

arr.sum() hoặc np.sum(arr)

Tổng tất cả các phần tử trong mảng arr

<small>arr = np.array([ , 1 3 4 5 6, , , ], dtype=int) </small>

<small>print("Tổng tất cả các phần tử của mảng arr là:", np.sum(arr)) </small>

<small>#Tổng tất cả các phần tử của mảng arr </small>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

<small>là: 19</small>

arr.mean() hoặc np.mean(arr)

Trung bình cộng của tất cả các phần tử trong mảng arr

<small>arr = np.array([ , 1 3 4 5 6, , , ], dtype=int) </small>

<small>print("Trung bình cộng tất cả các phần tử của mảng arr là:", np.mean(arr)) </small>

<small>#Trung bình cộng tất cả các phần tử của mảng arr là: 3.8</small>

np.median(arr) <sub>Trả về giá trị trung vị </sub>của mảng arr

<small>arr = np.array([1 3 4 5 6, , , , ], dtype=int) </small>

<small>print("Giá trị trung vị của mảng arr là:", np.median(arr)) </small>

<small>#Giá trị trung vị của mảng arr là: 4.0</small>

<small>B ng 1. 13 Danh sách các hàm th ng kê sảốử d ng trong Numpyụ</small>Một số phép toán với mảng

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

* <sub>Nhân một số với </sub>mảng

<small>a = np.array([ , ,2 1 3,4,5], dtype = int) print(a*3) </small>

<small>print(arr/a) </small>

<small>#[0.5 3. 1.33333333 1.25 1.2 ]</small>

np.linalg.matrix_rank(arr)

Tính hạng của ma trận

<small>print(np.linalg.matrix_rank(a)) </small>

<small>B ng 1. 14 Danh sách các phép toán v i m ng s d ng trong Numpyảớảử ụ</small>1.2.6.<b> Vẽ đồ thị ớ</b> v i Matplotlib

1.2.6.1. Giới thiệu về Matplotlib

Như chúng ta đã biế Python đượt c sử dụng nhiều nhất trong lĩnh vực phân tích dữ liệu, mà trong khoa h c dọ ữ ệu, vi c trli ệ ực quan hóa thơng qua các đồ ị, bith ểu đồ giúp cho chúng ta hiểu được các m i quan h trong dố ệ ữ liệu dễ dàng hơn rất nhi u. ềMatplotlib là một thư viện sử dụng để vẽ các đồ thị trong Python, chính vì v y nó là ậthư viện cực phổ biến của Python.

Khai báo thư viện Matplotlib: <small>import matplotlib.pyplot asplt</small>

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

1.2.6.2. Phân cấp đối tượng trong Matplotlib

Phân cấp ở đây nghĩa là kiểu cấu trúc cây các đối tượng Matplotlib tr v t plot(). ả ề ừĐối tượng Figure là nơi chứa đồ họa Matplotlib, nó có thể chứa các đối tượng Axes. Dưới Axes là hệ thống phân cấp các đối tượng nhỏ hơn như các đường thẳng, các textbox... Hầu h t các ph n t cế ầ ử ủa đồ thị đều có thể tương tác như đối tượng trong Python.

<small>plt.plot([1, , ])fig, _ = plt.subplots() </small>

Trong đoạn code trên, hai biến được tạo ra với plt.subplots(), biến đầu tiên là fig chứa Figure, biến th hai _ ch a nh ng thứ ứ ữ ứ khác. Đây là cấu trúc Tuple trong Python do plt.subplots() cũng trả về kiểu Tuple. Do c u trúc phân c p hình cây, n u ấ ấ ế muốn truy xuất đến ph n t ầ ử đánh dấu ch ng h n: ẳ ạ

<small>one_tick = fig.axes[0].yaxis.get_major_ticks()[0] </small>

Biến fig là instance c a l p Figure ch a bên trong nhiủ ớ ứ ều các đối tượng Axes. Mỗi Axes có m t yaxis và xaxis và chúng l i ch a m t t p các major_sticks và chúng ta l y ộ ạ ứ ộ ậ ấcái đầu tiên.

Phương thức plot() có 3 tham số <small>plot(x, y, format)</small>: - Tham số x là danh sách các tọa độ trục x - Tham số y là danh sách các tọa độ trục y - format định dạng đồ thị

<small>plt.plot([ ,0 1,2 3 4, ,],[ , , ,1 2 3 4,10], 'go-') </small>

Ngồi ra cịn có một số nh dđị ạng khác như sau:

- 'r* ' các điểm hình ngơi sao màu đỏ, đường nối các điểm dạng --.

--- 'bD---.' các điểm hình kim cương màu xanh dương, đường nối các điểm dạng -. - 'g^-' các điểm hình tam giác hướng lên màu xanh lá, đường nối các điểm dạng -. Nếu không muốn các điểm nố ới v i nhau, có th b nh dể ỏ đị ạng đường thẳng đi, ví dụ 'go-' s thành 'go'ẽ

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<b>Chương 2. Sử dụng Python cài đặt các thuật tốn trong học phần Giải tích số </b>

2.1.<b> Giớ</b>i thi u v <b>ệề giả</b>i tích s <b>ố</b>

Giải tích s là m t nhánh c a toán h c giúp gi i các bài tốn mà khơng thố ộ ủ ọ ả ể tìm đượ ờc l i giải chính xác bằng các cơng c tốn hụ ọc thơng thường. Giải tích s dựa trên ốvi c x p xệ ấ ỉ các đại lượng liên t c bụ ằng các đại lượng r i r c và s d ng các thu t tốn ờ ạ ử ụ ậđể tính tốn các kết quả gần đúng. Giải tích số có nhiều ứng dụng trong các lĩnh vực như khoa học máy tính, kỹ thuật, vật lý, hóa học, sinh học, tài chính, v.v. Gi i tích s ả ốbao g m nhi u chồ ề ủ đề khác nhau, như phương pháp tìm nghiệm của phương trình, phương pháp giải hệ phương trình tuyến tính và phi tuyến, phương pháp nội suy và ngoại suy, phương pháp tích phân và vi phân số, phương pháp giải phương trình vi phân thường và vi phân riêng biệt, v.v. Mỗi phương pháp đều có những ưu và nhược điểm riêng, cũng như những điều kiện áp dụng khác nhau. Để sử dụng hiệu quả các phương pháp tính, người ta cần biết cách lựa chọn và thiết kế các thuật tốn thích hợp cho t ng bài tốn cừ ụ thể. Ngoài ra, người ta cũng cần đánh giá được sai số và độ ổn định c a các kết quả gủ ần đúng. Giải tích số là một lĩnh vực đang phát triển liên tục và có nhi u thách th c m i. Nó yêu cề ứ ớ ầu người h c có ki n th c n n t ng v ng ch c v ọ ế ứ ề ả ữ ắ ềgiải tích, đạ ố tuyếi s n tính và l p trình. Gi i tích s là m t cơng c quan tr ng và hậ ả ố ộ ụ ọ ữu ích cho vi c mơ hình hóa và gi i quy t các bài toán th c t trong nhi u ngành khoa hệ ả ế ự ế ề ọc k ỹ thuật.

Giải tích s có vai trị quan tr ng trong khoa h c dố ọ ọ ữ liệu, vì nó giúp x lý và phân ửtích các dữ liệ ớu l n và ph c t p mà không th giứ ạ ể ải được b ng các công thằ ức đơn giản. Giải tích số cũng giúp tạo ra các mơ hình và d báo t các dự ừ ữ liệu, cũng như kiểm tra và đánh giá các giả thuyết khoa học. Một số ứng dụng của giải tích số trong khoa học d u là ữ liệ

▪ Trong máy h c, gi i tích s giúp tọ ả ố ối ưu hóa các hàm mất mát, hu n luy n các ấ ệmơ hình như mạng nơ-ron, phân loại và phân cụm dữ liệu, v.v.;

▪ Trong th ng kê, gi i tích số ả ố giúp ước lượng các tham s , kiố ểm định các gi ảthuyết, tính tốn các xác su t và kho ng tin c y, v.v.; ấ ả ậ

▪ Trong trí tu nhân t o, gi i tích s giúp gi i quy t các bài tốn tìm ki m, l p k ệ ạ ả ố ả ế ế ậ ếhoạch, suy luận logic, học tăng cường, v.v.

Nội dung c a h c ph n Gi i tích sủ ọ ầ ả ố trong chương trình đào tạo đạ ọi h c ngành Khoa h c dọ ữ liệu tại trường Đại h c Kinh t -Kọ ế ỹ thuật Công nghi p gệ ồm có sáu chương. Chương 1 giới thiệu tổng quan về sai số, cách viết xấp xỉ cũng như sai số phát sinh trong q trình tính tốn. Năm chương cịn lại đề ập đến 5 lĩnh vự c c cụ thể trong tốn

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

h c tính tốn. Mọ ục đích của chương này sẽ ử ụ s d ng ngơn ng lữ ập trình Python cài đặt các thuật toán trong các chương 2, 3, 4, 5, 6 của học phần Giải tích s . Vi c này s giúp ố ệ ẽcác em sinh viên có th rèn luy n kể ệ ỹ năng lập trình cũng như hiểu các thu t tốn này ậmột cách sâu sắc hơn.

2.2. S d<b>ử ụng Python cài đặ</b>t các thu<b>ật toán trong chương </b>2 <b>của h c phọần </b>

<b>Giải tích số</b>: <b>Giả ần đúng nghiệ</b>i g m th c c<b>ựủa phương trình </b>

Chương 2 học phần Giải tích số đề cập đến việc xấp xỉ nghiệm thực cho phương trình, đây là cơ sở để giải quyết nhiều bài toán trong kinh tế và kỹ thuật. Hầu hết các phương trình đều khơng có cơng thức giải tích để tính nghiệm đúng. Hơn nữa, ngay cả khi một vài phương trình có cơng thức tính nghiệm đúng thì quá trình tính tốn các cơng th c này s phát sinh sai s do quy tròn ho c do tính tốn nên k t quứ ẽ ố ặ ế ả cuối cùng s là giá tr gẽ ị ần đúng của nghi m. Do v y, vi c xây d ng thuệ ậ ệ ự ật tốn để tính nghi m gệ ần đúng cho mỗi phương trình là rất cần thiết.

Các phương pháp xấp xỉ nghiệm cho phương trình được chia làm 2 lớp là các phương pháp khoảng và các phương pháp mở. Nếu đã biết một khoảng chứa nghiệm của phương trình thì các phương pháp khoảng sẽ tìm được khoảng con đủ nhỏ chứa nghiệm. Các phương pháp khoảng được gi i thiớ ệu trong chương trình Giải tích số là phương pháp Tìm kiếm gia tăng và phương pháp Chia đôi. Các phương pháp khoảng có ưu điểm đơn giản nhưng độ chính các và tính ổn định khơng cao. Do vậy, các phương pháp khoảng thường được sử dụng để ải sơ bộ gi cho bài tốn tìm nghiệm xấp xỉ cho phương trình để tìm khoảng đủ nh mà hàm sỏ ố thoả mãn m t vài tính ch t c n ộ ấ ầthiết. Khi đó, các phương mở sẽ ếp t c th c hi n ph n vi c còn lti ụ ự ệ ầ ệ ại. Các phương pháp mở là nhóm các phương pháp tận dụng dáng điệu của đường cong để đưa ra công thức l p x p x nghi m cho h p lý. Do v y, n u so vặ ấ ỉ ệ ợ ậ ế ới các phương pháp khoảng thì các phương pháp mở có độ chính xác cao hơn. Ba phương pháp mở được giới thiệu trong chương trình là phương pháp Dây cung, phương pháp Tiếp tuyến và phương pháp Lặp đơn.

2.2.1. S d<b> ử ụng Python để cài đặt cho phương pháp tìm kiếm gia tăng</b>

Xét phương trình

𝑓(𝑥) = 0, 𝑥 ∈ 𝑎, 𝑏 .[ ]

Giả sử ta biết phương trình có nghiệm 𝛼 ∈ [𝑎, 𝑏] nhưng độ dài đoạ [𝑎, 𝑏] chưa đủ n nhỏ. Phương pháp Tìm kiếm gia tăng sẽ giúp tìm một đoạn con có chiều dài đủ nhỏ Δ<sub>𝑥</sub>của [𝑎, 𝑏] chứa nghiệm của phương trình. Các bước được thực hiện như sau:

Phương pháp Tìm kiếm gia tăng.

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

Input: 𝑓(𝑥), 𝑎, 𝑏, Δ<small>𝑥</small>. Output: [𝑥<sub>1</sub>, 𝑥 ] <sub>2</sub> chứa nghiệm.Khởi tạo 𝑥<sub>1</sub>≔ 𝑎.

Bước 1. Tính 𝑥 ≔ 𝑥<sub>2</sub> <sub>1</sub>+ Δ<sub>𝑥</sub>. Bước 2.

1. Nếu 𝑥 > 𝑏<sub>2</sub> . Thuật toán dừng (vì kho ng tìm kiếm vượt ra ngồi [𝑎, 𝑏]). ả2. Nếu 𝑥 ≤ 𝑏<small>2</small> . Tính 𝑓(𝑥<small>1</small>)𝑓(𝑥 ). <small>2</small>

a. Nếu 𝑓(𝑥<small>1</small>) (𝑓 𝑥<small>2</small>) ≤ 0thì dừng thu t toán. Kậ ết luận 𝛼 ∈ [𝑥<small>1</small>, 𝑥<small>2</small>]. b. Nế 𝑓(𝑥u <small>1</small>) (𝑓 𝑥<small>2</small>) > 0 thì 𝑥1 ≔ 𝑥<small>2</small>và quay lại Bước 1.

Hàm trong chương trình sau thực hiện tìm khoảng [𝑥 , 𝑥<sub>1</sub> <sub>2</sub>] với các tham số đầu vào là hàm 𝑓(𝑥), cận dưới, c n trên ậ 𝑎, 𝑏 và s gia ố 𝑑𝑥.

<small> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 </small>

<small>## module rootsearch</small>

<small>''' x1,x2 = rootsearch(f,a,b,dx).</small>

<small> Searches the interval (a,b) in increments dx for the bounds (x1,x2) of the smallest root of f(x). Returns x1 = x2 = None if no roots were detected.'''</small>

<small>from numpy import sign def rootsearch(f,a,b,dx): x1 a; f1 f(a)== x2 a dx; f2 f(x2)= += while sign(f1) == sign(f2): x1 if>= b: return None None, x1 x2; f1 f2== x2 x1 dx; f2 f(x2)=+= else: </small>

<small>def (x): freturn x**3 - 10.0* **2 + x 5.0x1,x2 =rootsearch(f,0.0 100.0 0.2) ,,print('Khoang chua nghiem =[',x1,',',x2,']') </small>Kết quả là:

<small>Khoang chua nghiem =[ 0.6 , 0.8 ]</small>

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

Phương pháp tìm kiếm gia tăng có ưu điểm đơn giản nhưng độ chính xác thấp vì có sai số khơng q Δ<small>𝑥</small>. Nếu Δ<small>𝑥</small>lớn thì sai số sẽ lớn và có thể bỏ sót nghiệm. Ngược lại,nếu Δ<small>𝑥</small> nhỏ thìq trình tìm kiếm sẽ tốn nhiều thời gian. Phương pháp Chia đôi được trình bày sau đây sẽ có độ chính xác và hiệu quả cao hơn.

2.2.2. S d<b> ử ụng Python để cài đặt cho phương pháp chia đơi</b>

Xét phương trình

𝑓(𝑥) = 0, 𝑥 ∈ 𝑎, 𝑏[ ]

Giả sử phương trình có nghi m ệ 𝛼 ∈ [𝑎, 𝑏] nhưng độ dài đoạ [𝑎, 𝑏] chưa đủn nhỏ. Phương pháp chia đôi sẽ giúp tìm khoảng con của [𝑎, 𝑏] có chứa nghiệm bằng cách lặp l i viạ ệc chia đôi liên tiếp kho ng ch a nghiả ứ ệm đã biết. Sau m i l n lỗ ầ ặp, độ dài của kho ng ch a nghi m s giả ứ ệ ẽ ảm đi một n a. Quá trình l p s d ng lử ặ ẽ ừ ại đến khi tìm được đoạn con đủ nhỏ. Thường thì quá trình lặp sẽ dừng sau khi tìm được khoảng con có độdài nhỏ hơn sai số cho trước (ký hi u ệ 𝜀, hoặc tol). Q trình tính tốn cụ thể được minh hoạ bằng thuật toán sau.

Phương pháp chia đôi. Input: 𝑓(𝑥), 𝑎, 𝑏, 𝑡𝑜𝑙.

Output: Nghiệm xấp xỉ (𝑥<small>1</small>+ 𝑥<small>2</small>)/2. Khởi tạo: 𝑥<small>1</small>= 𝑎; 𝑥 = 𝑏. <small>2</small>Bước 1. Tính 𝑥 = (𝑥<small>31</small>+ 𝑥<small>2</small>)/2 Bước 2. Tính 𝑓(𝑥<sub>1</sub>)𝑓(𝑥<small>3</small>).

1. N u ế 𝑓(𝑥<sub>1</sub>) (𝑓 𝑥<small>3</small>) ≤ 0 𝑥: <sub>2</sub>≔ 𝑥<small>3</small>. 2. Ngược lại: 𝑥 ≔ 𝑥<small>13</small>. Bước 3. Tính 𝐸𝑟𝑟 = 𝑥 − 𝑥<small>21</small>.

1. N u ế 𝐸𝑟𝑟 ≤ 𝑡𝑜𝑙: Dừng thuật toán. Kết luận nghiệm xấp xỉ (𝑥<small>1</small>+ 𝑥<small>2</small>)/2. 2. Ngược lại: Quay lại Bước 1.

Hàm bisection(f,x1,x2,switch=0,tol=1.0e-9)cho nghi m x p x ệ ấ ỉ

bằng phương pháp chia đôi với 𝑓, 𝑥<small>1</small>, 𝑥<small>2</small> là hàm và các tham số cho trước. Sai số tol mặc định là 10<small>−9</small>. Switch = 1 nếu khơng tìm được nghiệm.

Chương trình Python: <small> 1 </small>

<small> 2 3 4 5 6 7 </small>

<small>## module bisection</small>

<small>''' root = bisection(f,x1,x2,switch=0,tol=1.0e-9). Finds a root of f(x) = 0 by bisection. The root must be bracketed in (x1,x2). Setting switch = 1 returns root = None if f(x) increases upon bisection.'''</small>

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<small> 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 </small>

<small>import math import error from numpy import sign </small>

<small>def bisection(f,x1,x2,switch ,tol=1=1.0e-9): f1 f(x1)=</small>

<small> f1 if== 0.0: return x1 f2 f(x2)= f2 if== 0.0: return x2 sign(f1) if== sign(f2): error.err('Root is not bracketed') </small>

<small> n =int(math ceil(math log(..abs(x2 x1) tol) math log(-//.2.0))) for i inrange(n):</small>

<small> x3 = 0.5*(x1 x2); f3 +=f(x3) (switch if== 1 ) and (abs(f3) >abs(f1)) \ and (abs(f3) >abs(f2)):</small>

<small> return None f3 if== 0.0: return x3</small>

<small> ifsign(f2)!= sign(f3): x1 x3; f1 f3== else: x2 x3; f2 f3==</small>

<small> return (x1 x2)+/2.0 </small>

Do m i l n lỗ ầ ặp độ dài đoạn ch a nghi m sứ ệ ẽ giảm m t n a nên sau ộ ử 𝑛 lần lặp thì độ dài đoạn chứa nghiệm sẽ giảm 2<small>𝑛</small> lần so với độ dài đoạn [𝑎, 𝑏] ban đầu. Do đó, ta có sai số tuyệt đối của phương pháp được tính bởi

|𝑥<sub>2</sub>− 𝑥<small>1</small>| ≤<sup>𝑏 − 𝑎</sup>2<small>𝑛</small> .

Phương pháp ây cung có độ chính xác thấp nhưng rất ổn định và thực hiện tính Dtốn mà không yêu cầu điều kiện về hàm số. Do vậy, phương pháp chia đôi thường được áp dụng để xấp xỉ nghiệm khi ta chưa có nhiều thông tin về dáng điệu của hàm số hoặc thực hiện bước giải sơ bộ. Tức là tìm khoảng con đủ nhỏ để hàm số thoả mãn một số điều kiện mà các phương pháp chính xác cao yêu cầu.

2.2.3. S d<b> ử ụng Python để cài đặt cho phương pháp dây cung</b>

Để có được cơng thức xấp x nghiệm có độ chính xác cao, các phương pháp phải ỉt n dậ ụng dáng điệu c a hàm ủ 𝑓(𝑥) để đưa ra công thức lặp cho phù hợp. Các phương pháp này được gọi là các phương pháp mở. Chương trình Giải tích số giới thiệu ba phương pháp mở là phương pháp dây cung, phương pháp tiếp tuyến và phương pháp

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

lặp đơn. Trong ba phương pháp này, phương pháp dây cung và phương pháp tiếp tuyến sẽ hội tụ nếu phương trình thoả mãn hai giả thiết sau:

(𝑔𝑡1 :) T n t i nghiồ ạ ệm 𝛼 ∈[𝑎, 𝑏]; (𝑔𝑡2 :) 𝑓<small>′</small>, 𝑓′′ không đổi dấu trên [𝑎, 𝑏].

Các giả thiết (gt1) và (gt2) là các điều kiện tương đối chặt cho mỗi bài toán trong thực tế. Để giải quyết vấn đề này, các phương pháp khoảng được sử dụng kết hợp với các phương pháp mở. Quá trình giải thường sẽ được chia thành hai giai đoạn liên tiếp. Giai đoạn đầu thực hiện giải sơ bộ bằng các phương pháp khoảng để tìm được khoảng chứa nghiệm đủ nhỏ mà các (gt1) và (gt2) thỏa mãn. Giai đoạn tiếp theo sẽ sử dụng các phương pháp mở để xấp xỉ nghiệm cho phương trình với độ chính xác cao. Mục này sẽ trình bày phương pháp dây cung xấp xỉ nghiệm cho phương trình cũng như chương trình Python cài đặt cho thuật tốn.

Giả sử phương trình thoả mãn (gt1) và (gt2) với 𝑓<small>′</small>(𝑥) > 0, 𝑓<small>′′</small>( ) > 0, ∀𝑥 ∈ [𝑎, 𝑏] 𝑥(minh hoạ như Hình 2.1). Ta th y nghiấ ệm 𝛼 ủa phương trình là giao củ c a cung AB với Ox. Ý tưởng của phương pháp dây cung là nghiệm đúng , là giao của dây cung Ab, sẽ 𝛼được xấp xỉ bởi 𝑥<sub>1</sub> là giao của dây cung AB. Do dây cung AB là đường thẳng là đa thức bậc nhất nên việc tìm 𝑥<sub>1</sub> s dẽ ễ hơn rất nhi u so v i vi c tìm . ề ớ ệ 𝛼 Cụ thể, với 𝑥<small>0</small>= 𝑎 ta có

<small>Hình 2. 1 Hình minh họa phương pháp dây cung</small>

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

“phía trong” cung AB, do vậy nếu hàm số lõm (𝑓<small>′′</small>(𝑥) > 0) thì điểm cố định phả ằi n m bên trên 𝑂𝑥 và ngược l i. Tạ ừ đó suy ra tung độ ủa điể c m cố định và 𝑓 (𝑥)′′ phải cùng d u, t c là ấ ứ 𝑓(𝑥<small>𝐹𝑖𝑥</small>)𝑓<small>′′</small>(𝑥<sub>𝐹𝑖𝑥</sub>)> 0. Ta sẽ kiểm tra điều kiện này để chọn 𝑥<small>𝐹𝑖𝑥</small> m t trong ộhai số 𝑎, 𝑏. Số còn lại sẽ gán cho giá trị ban đầu . Thuật tốn tìm dây cung cụ thể như 𝑥<sub>0</sub>sau.

Phương pháp dây cung. Input: 𝑓(𝑥), 𝑓<small>′</small>(𝑥) ′′, 𝑓 (𝑥), 𝑎, 𝑏, 𝑡𝑜𝑙. Output: Nghiệm xấp xỉ 𝑥<small>1</small>. Bước 1. Tính 𝑓(𝑎). 𝑓′′(𝑎).

1. N u ế 𝑓(𝑎). 𝑓<small>′′</small>( ) > 0: 𝑥𝑎 <small>𝐹𝑖𝑥</small>≔ 𝑎; 𝑥 ≔ 𝑏<small>0</small> ; 2. Ngược lại 𝑥<small>𝐹𝑖𝑥</small>≔ 𝑏, 𝑥 ≔ 𝑎<small>0</small> . Bước 2. Tính

𝑥<small>1</small>= 𝑥<small>0</small>− <sup>𝑓(𝑥</sup><sup>0</sup><sup>)</sup>

𝑓(𝑥<small>𝐹𝑖𝑥</small>)− 𝑓 𝑥( <sub>0</sub>)(𝑥<small>𝐹𝑖𝑥</small>− 𝑥<small>0</small>) Bước 3. Tính 𝐸𝑟𝑟 = |𝑥<small>1</small>− 𝑥<small>0</small>|.

1. N u ế 𝐸𝑟𝑟 ≤ 𝑡𝑜𝑙: Dừng thuật toán. Nghiệm xấp xỉ 𝑥<sub>1</sub>. 2. Ngược lại: 𝑥 ≔ 𝑥<small>01</small>, quay lại Bước 2.

Sai s cố ủa phương pháp dây cung sau 𝑛 lần lặp được xác định ởi công thứcb|𝑥<sub>1</sub>− 𝛼| ≤<sup>𝑀 − 𝑚</sup>

𝑚 |𝑥<small>1</small>− 𝑥<sub>0</sub>|, 𝑚 = min

<small>[𝑎,𝑏]</small>|𝑓<small>′</small>| , 𝑀 = max<small>[𝑎,𝑏]</small>|𝑓<small>′</small>|.

Tức là, sai s cố ủa bước l p thặ ứ 𝑛 ẽ đượ s c tính b ng tích c a m t h ng sằ ủ ộ ằ ố (𝑀 −𝑚)/𝑚 với độ chênh v i vòng lớ ặp trước. Tuy nhiên, vi c nhân vệ ới hằng số (𝑀 − 𝑚)/𝑚không ảnh hưởng nhiều đến công thức đánh giá sai số nên thường được bỏ đi cho đơn giản trong quá trình chạy số. Khi đó sai số sẽ được đánh giá bởi độ chênh giữa hai lần lặp liên tiếp |𝑥<sub>1</sub>− 𝑥<sub>0</sub>| và thuật toán sẽ dừng khi độ chênh này nhỏ hơn sai số cho phép. Ý nghĩa của việc này là khi sai lệch giữa hai lần lặp quá nhỏ thì nên dừng thuật tốn vì nếu có lặp thêm nữa thì nghiệm xấp xỉ của vịng lặp sau cũng sẽ không tốt lên được nhiều.

Hàm <small>linearMethod(f,df,ddf,a,b,tol=1.0e-9) </small>sau đây sẽ thực hi n vi c tìm ệ ệ

nghi m x p x cệ ấ ỉ ủa phương trình 𝑓(𝑥) = 0 ằng phương pháp dây cung. Trong đó các btham số 𝑓, 𝑑𝑓 𝑑𝑑𝑓, tương ứng là 𝑓(𝑥), 𝑓′(𝑥) và 𝑓′′(𝑥) 𝑎, 𝑏. là cận dưới, c n trên là ậ 𝑡𝑜𝑙là sai số cho phép được mặc định là 10<small>−9</small>.

Chương trình Python:

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

32<small> 1 </small>

<small> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 </small>

<small>## module linearMethod</small>

<small>''' root = linearMethod(f,df,ddf,a,b,tol=1.0e-9). Finds a root of f(x) = 0 by combining the Linear-Method'''</small>

<small>deflinearMethod(f,df,ddf,a,b,tol=1.0e-9): importerror </small>

<small> fromnumpyimport sign fa f(a)=</small>

<small> fa if== 0.0: return a fb f(b)= fb if== 0.0: return b </small>

<small> sign(fa) if== sign(fb): error.err('Root is not bracketed') ddfa ddf(a)=</small>

<small> sign(fa) if== sign(ddfa): xFix a; x0==b else: xFix b; x0==a </small>

<small> for i inrange( ):30</small>

<small> x1 x0= -f(x0) (xFix x0) (f(xFix) f(x0))*-/ if abs(x1 x0)-< tol: return x1 else: x1 x0=</small>

<small> print('Too many iterations in Linear-Method') </small>

2.2.4. S d<b> ử ụng Python để cài đặt cho phương pháp tiế</b>p tuy n <b>ế</b>

Xét phương trình 𝑓(𝑥) = 0, 𝑥 ∈ [𝑎, 𝑏] thỏa mãn (gt1) và (gt2). Giả sử 𝑓<sup>′</sup>(𝑥) >0, 𝑓<small>′′</small>(𝑥)> 0, ∀𝑥 ∈ [𝑎, 𝑏] như Hình 2.2. Ý tưởng của phương pháp tiếp tuyến là nghiệm đúng 𝛼, là giao c a cung AB v i trủ ớ ục 𝑂𝑥, sẽ được xấp xỉ bởi nghiệm gần đúng 𝑥<small>1</small>, giao của tiếp tuyến với đồ thị tại (𝑥<sub>0</sub>, 𝑓 𝑥( )), 𝑥 chọn trước. Do tiếp tuyến là đa <small>00</small>thức bậc nhất nên việc tính 𝑥<small>1</small> sẽ đơn giản hơn rất nhiều so với việc tính . 𝛼 Việc tính

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

toán cụ thể như sau.

Gọi (𝑑 )<sub>1</sub> là đường thẳng tiếp tuy n với đồ thị c a hàm s tế ủ ố i 𝐴(𝑥 , 𝑓 𝑥 .ạ <sub>0</sub> ( <sub>0</sub>)) Ta có( )𝑑<small>1</small>: 𝑦 = 𝑓<small>′</small>( )(𝑥<small>0</small> 𝑥 − 𝑥<small>0</small>) + 𝑓 𝑥( <small>0</small>).

Cho 𝑦 = 0 ta sẽ tìm được 𝑥<sub>1</sub>, là giao điểm của (𝑑 ) v<sub>1</sub> ới 𝑂𝑥𝑥<sub>1</sub>= 𝑥<sub>0</sub>−<sup>𝑓(𝑥</sup><sup>0</sup><sup>)</sup>

𝑓<small>′</small>(𝑥<sub>0</sub>)<sup>. </sup>

Để nhận được nghiệm xấp xỉ tốt hơn, quá trình tương tự sẽ lặp lại với việc xây dựng phương trình tiếp tuyến tại 𝐴 (𝑥<sub>1</sub> <sub>1</sub>, 𝑓 𝑥( )). Ta thấy rằng việc chọn giá trị ban đầu <sub>1</sub>𝑥<small>0</small> là rất quan trọng. Nếu đồ thị hàm số lõm (𝑓<small>′′</small>(𝑥) > 0) thì điểm 𝐴 (𝑥 , 𝑓 𝑥 )<sub>0</sub> <sub>0</sub> ( <sub>0</sub>) phải n m trên ằ 𝑂𝑥 để bảo đảm 𝑥<small>1</small> ở giữa 𝛼 và 𝑥 và ngược lại, nến đồ thị hàm số lồi <small>0</small>(𝑓<small>′′</small>(𝑥) < 0) thì 𝐴(𝑥 , 𝑓 𝑥<small>0</small> ( <sub>0</sub>)) phải ở bên dưới 𝑂𝑥, t c là ứ 𝑓(𝑥<small>0</small>) và 𝑓′′(𝑥) luôn cùng dấu. Do vậy, giá trị ban đầu 𝑥<small>0</small> phải thỏa mãn điều kiện 𝑓(𝑥<small>0</small>)𝑓<small>′′</small>(𝑥<sub>0</sub>) > 0.

Sai số của phương pháp tiếp tuyến được đánh giá bởi |𝑥<sub>1</sub>− 𝛼| ≤ <sup>𝑀</sup><sub>2𝑚</sub>(𝑥<small>1</small>− 𝑥<small>0</small>)<small>2</small>, 𝑚 = min

<small>[𝑎,𝑏]</small>|𝑓<small>′</small>| , 𝑀 = max<small>[𝑎,𝑏]</small>|𝑓<small>′′</small>|.

Do vi c không nhân v i h ng sệ ớ ằ ố 𝑀/(2𝑚) không ảnh hưởng nhiều đến sai số nên trong tính tốn thường được bỏ đi và chỉ tính sai số bằng (𝑥<small>1</small>− 𝑥<sub>0</sub>)<small>2</small>. Thuật toán sẽ dừng khi sai số này nhỏ hơn sai số cho phép. Q trình tính tốn được minh họa ằng bthuật toán sau.

<b>Phương pháp tiếp tuyến. </b>

Input: 𝑓(𝑥), 𝑓<small>′</small>(𝑥) ′′, 𝑓 (𝑥), 𝑎, 𝑏, 𝑡𝑜𝑙. Output: Nghiệm xấp xỉ 𝑥<small>1</small>. Bước 1. Tính 𝑓(𝑎). 𝑓′′(𝑎).

1. N u ế 𝑓(𝑎). 𝑓<small>′′</small>( ) > 0: 𝑥 ≔ 𝑎𝑎 <small>0</small> ; 2. Ngược lại 𝑥 ≔ 𝑏<sub>0</sub> . Bước 2. Tính

𝑥<small>1</small>= 𝑥<small>0</small>−<sup>𝑓(𝑥</sup><small>0)𝑓′(𝑥0)</small>. Bước 3. Tính 𝐸𝑟𝑟 = 𝑥| <sub>1</sub>− 𝑥<small>0</small>|<small>2</small>.

1. Nếu 𝐸𝑟𝑟 ≤ 𝑡𝑜𝑙: Dừng thuật toán. Nghiệm xấp xỉ 𝑥<small>1</small>. 2. Ngược lại: 𝑥 ≔ 𝑥<sub>0</sub> <sub>1</sub>, quay lại Bước 2.

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

Hàm <small>newtonRaphson(f,df,ddf,a,b,tol=1.0e-9)</small> s tính nghi m x p x cẽ ệ ấ ỉ ủa phương trình 𝑓(𝑥) = 0 với 𝑓, 𝑑𝑓 𝑑𝑑𝑓, tương ứng là 𝑓(𝑥), 𝑓′(𝑥) và 𝑓 (𝑥)′′ . 𝑎, 𝑏 là cận dưới và cận trên; 𝑡𝑜𝑙 là sai số cho phép với mặc định là 10<small>−9</small>.

Chương trình Python: <small> 1 </small>

<small> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 </small>

<small>## module newtonRaphson</small>

<small>''' root = newtonRaphson(f,df,ddf,a,b,tol=1.0e-9). Finds a root of f(x) = 0 by combining the Newton-Raphson'''</small>

<small>defnewtonRaphson(f,df,ddf,a,b,tol=1.0e-9): importerror </small>

<small> fromnumpyimport sign fa f(a)=</small>

<small> fa if== 0.0: return a fb f(b)= fb if== 0.0: return b </small>

<small> sign(fa) if== sign(fb): error.err('Root is not bracketed') ddfa ddf(a)=</small>

<small> sign(fa) if== sign(ddfa): x0=a else: x0=b </small>

<small> for i inrange( ):30 delta=f(x0) df(x0)/ x1 x0= -delta ifdelta**2< tol: return x1 else: x1 x0=</small>

<small> print('Too many iterations in Newton-Raphson') </small>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

2.2.5. S d<b> ử ụng Python để cài đặ</b>t cho <b>phương pháp lặp đơn</b>

Thông thường khi một ánh xạ tác động vào một phần tử sẽ sinh ra giá trị hàm khác với đố ối s . N u l p ánh xế ặ ạ ấy một cách đệ qui, nghĩa là lấy giá trị hàm làm đố ối s cho l n l p ti p theo thì chúng ta th y m t cách tr c quan r ng ánh x nh y theo các ầ ặ ế ấ ộ ự ằ ạ ảgiá tr m i. N u có m t ph n tị ớ ế ộ ầ ử mà được ánh x t i chính nó s làm ánh x không di ạ ớ ẽ ạchuyển được. Phần tử đó được gọi là điểm bất động của ánh xạ. Ví dụ, 𝛼 là điểm bất động c a hàm s 𝜑(𝑥) ủ ố nếu

𝛼 = 𝜑(𝛼) .Ta cũng thấy

𝛼 = 𝜑(𝜑(𝛼))= 𝜑(𝜑(𝜑(𝛼)))= ⋯

Tìm điểm bất động cho một hàm số là một bài tốn quan trọng trong giải tích. Có một số phương pháp để ấ x p xỉ điểm bất động, tuy nhiên, n u hàm ế 𝜑(𝑥) có tính chất

|𝜑<small>′</small>(𝑥)| ≤ 𝑞 < 1, ∀∈ [𝑎, 𝑏] thì việc x p x ấ ỉ điểm bất động 𝛼 được thực hiện đơn giả như sau

Chọn 𝑥<sub>0</sub> tùy ý thuộc [𝑎, 𝑏] rồi tính 𝑥<small>1</small>= 𝜑 𝑥( <sub>0</sub>), 𝑥 = 𝜑 𝑥 ,<small>2</small> ( <sub>1</sub>)

… 𝑥 = 𝜑 𝑥<sub>𝑛</sub> ( <sub>𝑛−1 </sub>) .Ta thấy 𝑥 → 𝛼<sub>𝑛</sub> vì

|𝑥<small>𝑛</small>− 𝛼| = 𝜑(𝑥| <small>𝑛−1</small>) − 𝜑(𝛼)|≤ 𝑞 𝑥| <small>𝑛−1</small>− 𝛼 = 𝑞| |𝜑(𝑥<small>𝑛−2</small>) − 𝜑(𝛼)|≤ 𝑞<small>2</small>|𝑥<small>𝑛−2</small>− 𝛼|≤ ⋯ ≤ 𝑞 𝑥 − 𝛼 → 0, 𝑛 → ∞.<small>𝑛</small>| <sub>0</sub> |

Nếu ta biến đổi phương trình 𝑓(𝑥) = 0 ề ạ v d ng 𝑥 = 𝜑(𝑥) và là nghi m c𝛼 ệ ủa phương trình 𝑓(𝑥) = 0 thì 𝛼 cũng là nghiệm của phương trình 𝑥 = 𝜑(𝑥), tức là là 𝛼điểm bất động của hàm 𝜑(𝑥). Dựa vào việc xấp x ỉ điểm bất động, phương pháp xấp xỉnghiệm cho phương trình 𝑓(𝑥) = 0, 𝑥 ∈ [𝑎, 𝑏] được thực hiện như sau.

Phương pháp lặp đơn.

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

Input: 𝑓(𝑥), 𝑎, 𝑏, 𝑡𝑜𝑙. Output: Nghiệm xấp xỉ 𝑥<small>1</small>.

Bước 1. Đưa phương trình 𝑓(𝑥) = 0 về dạng 𝑥 = 𝜑(𝑥). Đặt 𝑞 = max<small>[𝑎,𝑏]</small>|𝜑<small>′</small>| Bước 2. Chọn 𝑥<small>0</small> tùy ý thuộc [𝑎, 𝑏].

Bước 3. Tính

𝑥 = 𝜑(𝑥 ).<small>10</small>Bước 4. Tính 𝐸𝑟𝑟 = 𝑞 𝑥 − 𝑥| <sub>1</sub> <sub>0</sub>|/(1 − 𝑞).

1. N u ế 𝐸𝑟𝑟 ≤ 𝑡𝑜𝑙: Dừng thuật toán. Nghiệm xấp xỉ 𝑥<sub>1</sub>. 2. Ngược lại: 𝑥 ≔ 𝑥<sub>0</sub> <sub>1</sub>, quay lại Bước 2.

Hàm <small>iterativeMethod(phi,q,x0,tol=1.0e-9)</small>s tính nghiẽ ệm xấp x cỉ ủa phương

trình 𝑓(𝑥) = 0 vớ 𝑝ℎ𝑖 i tương ứng là 𝜑(𝑥) 𝑞, 𝑥, <small>0</small> nh p t bàn phím và ậ ừ 𝑡𝑜𝑙 là sai số cho phép với mặc định là 10<small>−9</small>.

Chương trình Python: <small> 1 </small>

<small> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 </small>

<small> q if>= 1.0: print('Iterative-Method does not converge') else: </small>

<small> for i inrange( ):30 x1=phi(x0) Err q= *abs(x1 x0) ( q)-/ 1- Err tol: if<return x1 else: x0 x1=</small>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

<small>17 print('Too many iterations in Iterative-Method') </small>

2.3.<b> Sử ụng Python cài đặ</b> d t các thu<b>ật toán trong chương </b>3 <b>của h c phọần </b>

<b>Giải tích số</b>: <b>Giả ệ phương trình đạ ố</b>i h i s tuy<b>ến tính </b>

Tuyến tính hóa là một khái niệm quan trọng trong toán học. Về cơ bản, bài tốn có tính chất tuyến tính là bài tốn mà chúng ta có thể nắm bắt được những tính chất cơ bản của nó. Do vậy, việc tuyến tính hóa một bài tốn sẽ giúp tiếp cận và giải quyết bài

hệ phương trình dễ giải nhất, nên trên thực tế, hầu hết các lĩnh vực của khoa học hiện đại đều chứa những mơ hình trong đó các phương trình được xấp xỉ bằng các hệ phương trình đại số tuyến tính. Việc tìm nghiệm của các hệ phương trình sẽ giúp cho việc phát triển lý thuyết cũng như ứng dụng của những lĩnh vực này trong thực tế.

Hệ phương trình đại số tuyến tính có nhiều ứng dụng trong kỹ thuật và kinh tế. Ví dụ, trong kỹ thuật, hệ phương trình đại số tuyến tính có thể được sử dụng để mơ hình hóa các mạch điện, các hệ thống cơ khí, các hệ thống điều khiển hoặc các hệ thống tối ưu. Trong kinh tế, hệ phương trình đại số tuyến tính có thể được sử dụng để phân tích

phương trình đại số tuyến tính cũng có thể được sử dụng để giải quyết các bài toán phân bổ nguồn lực, bài toán vận chuyển hoặc bài toán lập kế hoạch sản xuất. Tuy nhiên, hệ phương trình đại số tuyến tính có vai trị đặc biệt trong khoa học dữ liệu, ví dụ như

▪ Linear programming: là một kỹ thuật tối ưu hóa phổ biến, sử dụng hệ phương trình đại số tuyến tính để tìm ra giá trị nhỏ nhất hoặc lớn nhất của một hàm mục

giải quyết các bài toán về phân bổ nguồn lực, lập kế hoạch sản xuất, vận chuyển hàng hóa, quản lý rủi ro hoặc phân tích dữ liệu

▪ Phân tích thành phần chính (PCA): là một kỹ thuật giảm chiều dữ liệu, sử dụng hệ phương trình đại số tuyến tính để tìm ra các vectơ riêng và giá trị riêng của ma trận hiệp phương sai của dữ liệu, và chọn ra các vectơ riêng có giá trị riêng

để nén ảnh, phát hiện gương mặt, phân loại văn bản hoặc phân tích thành phần chính.

▪ Phân tích nhân tố (FA): là một kỹ thuật khám phá cấu trúc của dữ liệu, sử dụng hệ phương trình đại số tuyến tính để tìm ra các biến ẩn (factors) ảnh hưởng đến

</div>

×