Luận văn Bài toán biên với phương pháp bắn bội

Luận văn: Trình bày các phương pháp bắn trong trường hợp tổng quát. - Trình bày cụ thể, chi tiết, có thuật toán các phương pháp bắn đơn, phương pháp bắn bội cho bài toán biên thường cấp hai với điều kiện biên tách được. - Có các thử nghiệm số cần thiết, rõ ràng, có mã lệnh để minh họa cho các phương pháp bắn

pdf77 trang | Chia sẻ: maiphuongtl | Lượt xem: 1889 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Luận văn Bài toán biên với phương pháp bắn bội, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
= 400y + 400 cos2(pix) + 2pi2 cos(2pix), y(0) = y(1) = 0. Bài toán biên này có nghiệm chính xác là (1.38) y = e−20 1 + e−20 · e20x + 1 1 + e−20 · e−20x − cos2(pix). Nghiệm chính xác được thể hiện bởi đồ thị dưới đây. Chú ý rằng max 0≤x≤1 |y(x)| ≈ 0.77, y(0) = y(1) = 0, y(0.5) = 0.907998593370× 10−4. Hình 1.2: Nghiệm chính xác của (1.37). Để ý rằng bài toán trên sẽ gây những khó khăn nhất định đối với các phương pháp: 3Phần này chúng tôi trình bày theo mục 7.6,[6]. 24 1. Phương trình thuần nhất tương ứng với bài toán này là y′′ = 400y có nghiệm dạng y = ce±20x. Nghiệm này tăng hoặc giảm theo hàm mũ, do đó sẽ gây khó khăn cho phương pháp bắn đơn. 2. Các đạo hàm y(i)(x), i = 1, 2, . . . của nghiệm chính xác (1.38) rất lớn tại x ≈ 0 và x ≈ 1, do đó, sai số trong các phương pháp sai phân hay biến phân đều lớn. Kết quả thu được của từng phương pháp như sau: Với phương pháp bắn đơn Ta lấy các giá trị ban đầu của nghiêm chính xác y(0) = 0, y′(0) = −20 · 1− e −20 1 + e−20 = −19.9999999176 . . . Sau một phép lặp với sai số tương đối ≤ 3.2 · 10−11, thu được sai số thể hiện bởi bảng dưới đây, với các kí hiệu ∆y(x) = y˜(x) − y(x) và εy(x) = (y˜(x)− y(x))/y(x). Với phương pháp bắn bội Để hạn chế tác động của hàm mũ, ta chọn số điểm chia m lớn, m = 21 và 0 = x1 < x2 < · · · < x21 = 1, xk = k − 1 20 . Sai số thu được sau ba lần lặp như sau: 25 Hình 1.3: Sai số của phương pháp bắn đơn. Hình 1.4: Sai số của phương pháp bắn bội. 26 Với phương pháp sai phân hữu hạn Sử dụng phương pháp sai phân với bước h = 1 n+1 , thu được sai số tương ứng ∆y = maxi |∆y(xi)|, xi = ih. Bước h giảm một nửa, dẫn tới sai số giảm đi 14 . Như vậy, để đạt được sai số ∆y ≈ 5× 10−12 của phương pháp bắn bội, ta cần chọn h ≈ 10−6! Hình 1.5: Sai số của phương pháp sai phân. Với phương pháp biến phân Ta chọn không gian Sp∆ các hàm spline lập phương tương ứng với cách chia đều: ∆ : 0 = x0 < x1 < · · · < xn = 1, xi = ih, h = 1 n . Thu được sai số lớn nhất ∆y = ‖uS − y‖∞ như sau: Hình 1.6: Sai số của phương pháp biến phân. 27 Muốn thu được kết quả tốt như phương pháp bắn bội (∆y ≈ 5 × 10−12), ta cần chọn h ≈ 10−4. Khi đó, để tính toán các ma trận ta cần thực hiện 4× 104 phép lặp trong mỗi bước! Những kết quả đưa ra ở trên đã làm rõ tính ưu việt của phương pháp bắn bội, ngay cả đối với các bài toán biên tuyến tính tách được. Ở đây, các phương pháp sai phân và biến phân đều khả thi (khi yêu cầu về độ chính xác không cao). Để đạt được cùng độ chính xác, phương pháp sai phân cần tính toán với các hệ phương trình lớn hơn phương pháp biến phân. Muốn giải các bài toán biên phi tuyến có nghiệm tăng giảm theo hàm mũ chỉ có một phương pháp duy nhất có hiệu quả, đó là phương pháp bắn bội và những biến thể của nó. 28 Chương 2 Phương pháp bắn đơn, phương pháp bắn bội và các thuật toán Chương này trình bày kĩ lưỡng nội dung các phương pháp bắn cho các dạng bài toán cụ thể. Với phương pháp bắn đơn, chúng tôi chia thành hai trường hợp: bài toán biên tuyến tính và bài toán biên tổng quát. Đối với phương pháp bắn bội, ngoài nội dung và thuật toán của phương pháp, chúng tôi đề cập đến một vấn đề quan trọng, đó là kĩ thuật chọn điểm chia. Để giải các bài toán giá trị ban đầu phát sinh trong các phương pháp, chúng tôi đều sử dụng phương pháp Runge-Kutta 4 nấc với bước lặp h = 0.001. 2.1 Phương pháp bắn đơn 2.1.1 Phương pháp bắn đơn giải bài toán biên tuyến tính Bài toán biên tuyến tính là bài toán có dạng (2.1) y′′ = p(x)y′ + q(x)y + r(x), a ≤ x ≤ b, y(a) = α, y(b) = β. 29 Để giải bài toán này bằng phương pháp bắn đơn, trước hết ta xét hai bài toán giá trị ban đầu, đó là y′′ = p(x)y′ + q(x)y + r(x), a ≤ x ≤ b, y(a) = α, y′(a) = 0.(2.2) y′′ = p(x)y′ + q(x)y, a ≤ x ≤ b, y(a) = 0, y′(a) = 1.(2.3) Giả sử y1(x), y2(x) lần lượt là nghiệm của các bài toán (2.2), (2.3), khi đó nghiệm y(x) của bài toán biên tuyến tính (2.1) cho bởi công thức (2.4) y(x) := y1(x) + β − y1(b) y2(b) · y2(x). Thật vậy, ta có y′(x) := y′1(x) + β − y1(b) y2(b) · y′2(x), do đó y′′(x) := y′′1(x) + β − y1(b) y2(b) · y′′2(x). Vậy y′′(x) = p(x)y′1(x) + q(x)y1(x) + r(x) + β − y1(b) y2(b) · [p(x)y′2(x) + q(x)y2(x)] = p(x) [ y′1(x) + β − y1(b) y2(b) · y′2(x) ] + q(x) [ y1(x) + β − y1(b) y2(b) · y2(x) ] + r(x) = p(x)y′(x) + q(x)y(x) + r(x). Hơn nữa, y(a) :=y1(a) + β − y1(b) y2(b) · y2(a) = α + β − y1(b) y2(b) · 0 = α, y(b) :=y1(b) + β − y1(b) y2(b) · y2(b) = y1(b) + β − y1(b) = β. 30 Như vậy bài toán biên tuyến tính (2.1) dễ dàng được giải quyết bằng cách giải các bài toán giá trị ban đầu (đã đầy đủ các điều kiện ban đầu) (2.2), (2.3) và tính theo công thức (2.4). Phương pháp trên khá đơn giản, hiệu quả, và chỉ sử dụng ý tưởng của phương pháp bắn đơn - đó là đưa về các bài toán giá trị ban đầu tương ứng. Tuy nhiên, ta cũng có thể sử dụng phương pháp bắn đơn để giải bài toán (2.1) cũng bằng cách đưa về giải các bài toán giá trị ban đầu tương ứng y′′ =p(x)y′ + q(x)y + r(x), a ≤ x ≤ b, y(a) = α, y′(a) = s1; y′′ =p(x)y′ + q(x)y + r(x), a ≤ x ≤ b, y(a) = α, y′(a) = s2. Ở đây, ta đã chọn các giá trị ban đầu y′(a) cho cả hai bài toán lần lượt là s1 và s2 (chọn ngẫu nhiên). Sau khi giải hai bài toán trên, thu được các nghiệm số lần lượt là y1(x), y2(x), do tính chất tuyến tính của bài toán nên thay cho việc sử dụng phương pháp lặp Newton để tìm giá trị đúng s¯ cho y′(a) thì ta chọn (2.5) s¯ := s1 + s2 − s1 y2(b)− y1(b) · (β − y1(b)). Do đó, với bài toán biên tuyến tính dạng (2.1), ta sẽ bỏ qua bước lặp tìm s¯. Về thực chất thì ở đây ta lập được nghiệm y(x) của (2.1) từ các nghiệm y1(x), y2(x) theo công thức (2.6) y(x) = s2 − s¯ s2 − s1 · y1(x) + s¯− s1 s2 − s1 · y2(x). Dễ dàng kiểm tra được y(x) thỏa mãn phương trình vi phân trong (2.1). Để y(b) = β thì vế phải của (2.6) bằng β khi x = b. Từ đó ta rút ra được giá trị của s¯ như trong (2.5). 31 Thuật toán của phương pháp này khá đơn giản nên chúng tôi không đưa ra, ví dụ cụ thể được trình bày ở Chương 3. 2.1.2 Phương pháp bắn đơn giải bài toán biên tổng quát Để minh họa cho phương pháp bắn đơn, ta giải bài toán biên sau: (2.7) y′′ = f(x, y, y′), a ≤ x ≤ b, y(a) = α, y(b) = β. Trước hết, ta đưa bài toán về bài toán giá trị ban đầu tương ứng (2.8) y′′ = f(x, y, y′), a ≤ x ≤ b, y(a) = α, y′(a) = s trong đó tham số s ban đầu cần được xác định. Ta cần tìm giá trị s sao cho |y(b, s)− β| < TOL, với y(x, s) là nghiệm của bài toán (2.8) và sai số cho phép TOL được chọn trước; tức là tìm nghiệm (xấp xỉ) s của phương trình y(b, s)− β = 0. Công việc này có thể thực hiện bởi phương pháp cắt1 hoặc phương pháp lặp Newton. Phương pháp cắt khá đơn giản, muốn thực hiện phương pháp này, ta chỉ cần hai giá trị s(0), s(1) ban đầu của s và lặp theo công thức s(k) = s(k−1) − (y(b, s (k−1))− β)(s(k−1) − s(k−2)) y(b, s(k−1))− y(b, s(k−2)) , k = 2, 3, . . . 1Secant method. 32 Ta có thể chọn các giá trị s(0), s(1) như sau: s(0) = β − α b− a , s (1) = s(0) + β − y(b, s(0)) b− a . Tuy nhiên, để hội tụ tốt hơn, ta nên sử dụng phương pháp lặp Newton, tức là lặp theo công thức (2.9) s(k) = s(k−1) − y(b, s (k−1))− β ∂y ∂s (b, s(k−1)) . Như vậy, ta cần chọn một giá trị s(0) ban đầu, và trong mỗi bước lặp cần tính y(b, s(k−1)) và ∂y ∂s (b, s(k−1)). Để tính y(b, s(k−1)), ta giải bài toán giá trị ban đầu (2.8) với s = s(k−1); để tính ∂y ∂s (b, s(k−1)), chú ý rằng không xác định được cụ thể hàm y(x, s) (bằng các phương pháp số), do đó việc tính trực tiếp ∂y ∂s là không thể! Thay vào đó, ta đặt w(x) := w(x, s) = ∂y ∂s (x, s). Khi đó w′′(x) = ∂y′′ ∂s (x, s) = ∂f ∂s (x, y(x, s), y′(x, s)) = ∂f ∂x (x, y(x, s), y′(x, s)) ∂x ∂s + ∂f ∂y (x, y(x, s), y′(x, s)) ∂y ∂s (x, s)+ + ∂f ∂y′ (x, y(x, s), y′(x, s)) ∂y′ ∂s (x, s) = ∂f ∂y (x, y(x, s), y′(x, s)) · w(x, s) + ∂f ∂y′ (x, y(x, s), y′(x, s)) · w′(x, s). Hơn nữa, từ các điều kiện ban đầu của bài toán (2.8) ta có ∂y ∂s (a, s) = 0, ∂y′ ∂s (a, s) = 1. 33 Do đó, hàm w(x) thỏa mãn bài toán giá trị ban đầu (2.10) w′′ = fy(x, y, y′) · w + fy′(x, y, y′) · w′, a ≤ x ≤ b, w(a) = 0, w′(a) = 1, với fy, fy′ là các đạo hàm riêng theo y và y ′ của hàm f(x, y, y′). Khi hàm w được xác định như trên thì công thức lặp Newton (2.9) trở thành (2.11) s(k) = s(k−1) − y(b, s (k−1))− β w(b, s(k−1)) . Với phương pháp lặp này, ta cũng nên chọn giá trị s(0) = β−α b−a . Thuật toán như sau: Thuật toán 2.1. Phương pháp bắn đơn với phép lặp Newton 1. Nhập giá trị ban đầu z[1] và sai số cho phép TOL. 2. Ở bước lặp thứ i, giải các bài toán (2.8), (2.10) với các điều kiện ban đầu lần lượt là y(a) = α, y′(a) = z[i] và w(a) = 0, w′(a) = 1. Nhận được các giá trị yz[i](b) và w(b). 3. Tính z[i+1] = z[i] − yz[i] − β w(b) . 4. Kiểm tra điều kiện |yz[i+1] − β| < TOL. Nếu thỏa mãn, dừng thuật toán. Nếu không, tăng i, quay lại lặp từ bước 2. 34 2.1.3 Khó khăn khi thực hiện phương pháp bắn đơn Phương pháp bắn đơn khá hữu hiệu trong đa số các bài toán biên. Tuy nhiên, phương pháp này có những khó khăn nhất định. Ta xét bài toán (2.12) y′′ = 100 · y, y(0) = 1, y(3) = e−30. Dễ thấy nghiệm chính xác của bài toán có dạng y(x) = c1 · e10x + c2 · e−10x, với các điều kiện biên đã cho thì nghiệm chính xác là y(x) = e−10x. Khi thực hiện phương pháp bắn đơn, ta cần xét bài toán giá trị ban đầu tương ứng, đó là (2.13) y′′ = 100 · y, y(0) = 1, y′(0) = s. Nghiệm của (2.13) là y(x, s) = 10 + s 20 · e10x + 10− s 20 · e−10x. Bước tiếp theo là tìm không điểm của hàm F (s) = y(3, s)− e−30. Ta có F (s) = 10 + s 20 · e30 + 10− s 20 · e−30 − e−30 = 10 + s 20 · e30 + ( 10− s 20 − 1 ) · e−30 = 10 + s 20 · (e30 + e−30) . Do đó, không điểm chính xác của F (s) là s = −10 (thật ra ta có thể tính được giá trị này rất nhanh gọn: s = y′(1) = −10). 35 Bây giờ giả sử trong phương pháp bắn đơn ta có một giá trị s¯ ≈ s, s¯ = s(1 + 10−10) = −10(1 + 10−10). Khi đó y(3, s¯) = 10 + s¯ 20 · e30 + 10− s¯ 20 · e−30 − e−30 = −10 −9 20 · e30 + ( 1 + 10−9 20 ) · e−30 ≈ −534.3237265. Như vậy là với sai số rất nhỏ của s = y′(0), giá trị của nghiệm số tại điểm biên x = 3 rất xa giá trị đúng. Vì thế, phương pháp bắn đơn không hội tụ được. Nhận xét 2.1. Biên b càng lớn thì phương pháp bắn đơn càng khó khăn hơn. Chẳng hạn với ví dụ giải bài toán biên y′′ = 100 · y, y(0) = 1, y(3) = 10. Nếu thực hiện tính toán với 10 chữ số trên Maple thì phương pháp bắn đơn hoàn toàn vô hiệu, nhưng tăng lên tính toán với 15 chữ số thì phương pháp này lại hội tụ bình thường, để tạo ra khó khăn trong trường hợp này, chúng tôi thay biên b = 4, tức là đi giải bài toán y′′ = 100 · y, y(0) = 1, y(4) = 10. Khi đó, dù tính toán với 15 chữ số nhưng phương pháp bắn đơn vẫn không thể hội tụ. Trong khi đó phương pháp bắn bội vẫn hội tụ bình thường khi thực hiện tính toán với 10 chữ số. Một khó khăn khác của phương pháp bắn đơn là khi gặp bài toán có điểm kì 36 dị, xét bài toán biên thứ hai sau: (2.14) y′′ = λ · sinhλy, y(0) = 0, y(1) = 1 (λ là một tham số cố định). Muốn sử dụng phương pháp bắn đơn thì ta cần chọn y′(0) = s. Khi xét bài toán giá trị ban đầu tương ứng với (2.14) với λ = 5, y(0) = 0, y′(0) = s, thì nghiệm y(x, s) tìm được phụ thuộc rất nhiều vào s. Với s = 0.1, 0.2, . . . thì việc tính toán bị gián đoạn trước khi điều kiện biên phải (x = 1) đạt được, thực tế là y(x, s) có một điểm kì dị xs ≤ 1 (phụ thuộc vào s). Từ y′′ = λ · sinhλy lấy tích phân hai vế ta được (2.15) (y′)2 2 = coshλy + C. Các điều kiện y(0) = 0, y′(0) = s xác định hằng số của nguyên hàm C = s2 2 − 1. Lấy tích phân (2.15) ta được x = 1 λ · ∫ λy 0 dη√ s2 + 2 cosh η − 2 . Khi đó điểm kì dị cho bởi xs = 1 λ · ∫ ∞ 0 dη√ s2 + 2 cosh η − 2 . 37 Để tính xấp xỉ tích phân này, ta phân tích ∫ ∞ 0 = ∫ ε 0 + ∫ ∞ ε , với ε bất kỳ, và xấp tỉ từng tích phân bộ phận riêng rẽ. Ta được ∫ ε 0 dη√ s2 + 2 cosh η − 2 = ∫ ε 0 dη√ s2 + η2 + η4/12 + · · · ≤ ∫ ε 0 dη√ s2 + η2 = ln  ε |s| + √ 1 + ε2 s2  , và ∫ ∞ ε dη√ s2 + 2 cosh η − 2 = ∫ ∞ ε dη√ s2 + 4 sinh(η/2) ≤ ∫ ∞ ε dη 2 sinh(η/2) = − ln(tanh(ε/4)). Vậy ta có xs ≤ 1 λ · ln  ε|s| + √ 1 + ε 2 s2 tanh(ε/4)  =: H(ε, s). Với mọi ε > 0, giá trị H(ε, s) là một cận trên của xs, do đó trong trường hợp riêng ta có xs ≤ H( √ |s|, s), ∀s 6= 0. Ta có thể xác định giới hạn của H( √|s|, s) khi s→ 0. Khi |s| nhỏ, ta có tanh (√|s| 4 ) = √|s| 4 , 1√|s| + √ 1 + 1 |s| = 2√|s| , do đó, khi s→ 0 thì ta được (2.16) xs ≤ H( √ |s|, s) = 1 λ · ln ( 2/ √|s|√|s|/4 ) = 1 λ · ln 8|s| . 38 Với phương pháp bắn đơn, ta cần đạt được điều kiện biên phải x = 1, khi đó |s| cần được chọn đủ lớn sao cho 1 ≤ 1 λ · ln 8|s| , tức là |s| ≤ 8e−λ. Chẳng hạn với λ = 5, ta có (2.17) |s| ≤ 0.05. Như vậy, với λ = 5, ta cần chọn các giá trị s ban đầu thỏa mãn (2.17) thì mới không gặp điểm kì dị trong [0, 1] (người ta đã tính được rằng trong trường hợp này, tìm được s = 4.57504614× 10−2 và điểm kì dị là xs ≈ 1.0326 . . .2). 2.2 Phương pháp bắn bội 2.2.1 Mô tả thuật toán Trong phần này, chúng tôi trình bày cách giải bài toán biên dạng (2.18) y′′ = f(x, y, y′), y(a) = α, y(b) = β bằng phương pháp bắn bội. Trước hết, ta đưa phương trình vi phân cấp hai trên về dạng hệ hai phương trình cấp một, với cách đặt z = y′, ta có hệ (2.19) y¯′ =  y z  ′ =  z f(x, y, z)  = f¯(x, y¯). Tiếp theo, ta chia nhỏ đoạn [a, b] bởi các điểm a = x1 < x2 < · · · < xm = b, thông thường ta sẽ chia đều, tức là xi = a+ b−a m−1 · (i− 1). Chọn một xấp xỉ ban 2Xem trong mục 7.3.4, [6]. 39 đầu s0 cho s. Lúc này s ∈ R2m×1 và (2.20) s2i−1,1 = y(xi), s2i,1 = z(xi), (i = 1, . . . ,m) trong tất cả các lần bắn. Bởi các điều kiện biên trong (2.18) nên s01,1 = α, s02m−1,1 = β, các giá trị s 0 i,1 còn lại chọn ngẫu nhiên (không quá xa các giá trị biên α, β). Khi đã có ma trận s0 ban đầu, ta tiến hành giải m − 1 bài toán giá trị ban đầu (2.19), (2.20) trên các đoạn [xi, xi+1], i = 1, . . . ,m − 1 và lập được ma trận cột F (s) theo công thức (1.20). Để tìm được s mới nhờ công thức Newton (1.21), ta cần tính thêm ma trận Jacobian ở (1.22) với các ma trận Jacobian A,B,Gk (k = 1, . . . ,m− 1) cho bởi công thức (1.23). Với bài toán biên cụ thể dạng (2.18) thì ta lập được các ma trận A =  1 0 0 0  , B =  0 0 1 0  . Các ma trận Gk (k = 1, . . . ,m− 1) là giá trị tại xk+1 của nghiệm các bài toán giá trị ban đầu trên các đoạn [xk, xk+1] sau: (2.21) G′k(x) = J(x, y¯) ·Gk(x), Gk(xk) = I, x ∈ [xk, xk+1], với J(x, y¯) = ∂f¯(x,y¯) ∂y¯ là ma trận Jacobian của hàm f¯ trong (2.19), tức là J(x, y¯) =  0 1 ∂f ∂y ∂f ∂z  . 40 Thật vậy, ta có Gi(x) =  ∂y∂s2i−1,1 ∂y∂s2i,1 ∂z ∂s2i−1,1 ∂z ∂s2i,1  , do đó G′i(x) =  ∂2y∂x∂s2i−1,1 ∂2y∂x∂s2i,1 ∂2z ∂x∂s2i−1,1 ∂2z ∂x∂s2i,1  =  ∂z∂s2i−1,1 ∂z∂s2i,1 ∂f ∂s2i−1,1 ∂f ∂s2i,1  =  0 1 ∂f ∂y ∂f ∂z  ·  ∂y∂s2i−1,1 ∂y∂s2i,1 ∂z ∂s2i−1,1 ∂z ∂s2i,1  = J(x, y¯) ·Gk(x); ngoài ra Gi(xi) =  ∂y(xi)∂s2i−1,1 ∂y(xi)∂s2i,1 ∂z(xi) ∂s2i−1,1 ∂z(xi) ∂s2i,1  =  ∂s2i−1,1∂s2i−1,1 ∂s2i−1,1∂s2i,1 ∂s2i,1 ∂s2i−1,1 ∂s2i,1 ∂s2i,1  =  1 0 0 1  = I. Do đó, các ma trận Gk hoàn toàn tính được nhờ phương pháp Runge-Kutta. Thuật toán phương pháp bắn bội trong trường hợp này như sau: Thuật toán 2.2. Phương pháp bắn bội 1. Nhập giá trị ban đầu s0 và các điểm chia a = x1 < x2 < · · · < xm = b. 2. Cho biến l chạy đến khi hội tụ (hoặc đến một giá trị cho trước), thực hiện (a) Cho i = 1, 2, . . . ,m− 1 lần lượt, giải các bài toán giá trị ban đầu y¯′i(x; s l i) = f¯(x, y¯i(x; s l i)), y¯i(xi; s l i) = s l i, x ∈ [xi, xi+1]; G′i(x) = J(x, y¯i) ·Gi(x), Gi(xi) = I, x ∈ [xi, xi+1]. Tính các giá trị y¯i(xi+1; s l i), Gi(xi+1). 41 (b) Lập các ma trận F (s) và DF (s). (c) Tìm ma trận sl+1 mới từ hệ tuyến tính sl+1 = sl − [DF (s)]−1 · F (s). (d) Tăng l, quay lại lặp từ (a). 3. Dừng. 2.2.2 Kĩ thuật chọn điểm chia Như đã đề cập trong các mục trước, thông thường trong một phương pháp bắn bội, ta chia đoạn [a, b] thành các đoạn bằng nhau - tùy theo số điểm chia. Tuy nhiên, khi gặp những bài toán có nghiệm tăng giảm mạnh, không đều (trên [a, b]) theo các hàm mũ thì vấn đề chọn điểm chia không còn theo ý muốn chủ quan của ta nữa. Việc chia đều như thường lệ có thể dẫn đến sự phân kỳ trong các phép lặp. Khi gặp những trường hợp như vậy, ta có thể thực hiện theo cách sau. Chọn một quĩ đạo ban đầu η(x), tức là một hàm thỏa mãn các điều kiện biên η(a) = α, η(b) = β. Việc chọn các điểm chia xk, k = 1, . . . ,m cho bài toán biên dạng (2.18) được tiến hành theo thuật toán như sau: Thuật toán 2.3. Chọn điểm chia trong phương pháp bắn bội 1. Đặt x1 := a. Chọn tham số ε. 2. Khi đã có điểm chia xi (xi < b), giải bài toán giá trị ban đầu y′′ = f(x, y), y(xi) = η(xi), y′(xi) = η′(xi) 42 trên đoạn [xi, b]. Nếu tìm được giá trị x = ξ đầu tiên, sao cho |y(ξ)| ≥ ε · |η(ξ)| thì chuyển sang bước 3, nếu không tìm được thì chuyển sang bước 4. 3. Tăng i, đặt xi := ξ. Quay lại lặp từ bước 2. 4. Tăng i, đặt xi := b. Dừng. Thuật toán trên dừng khi điểm chia cuối cùng được chọn là b và số các điểm chia (tính cả hai đầu biên a, b) là m = i. Tham số ε trong thuật toán là hằng số chọn trước (ε > 1), nhằm mục đích giới hạn sự gia tăng của nghiệm so với quĩ đạo η(x). Thông thường ta chọn ε = 1.5 hoặc ε = 2. Để hội tụ tốt hơn, ta chọn ma trận s0 ban đầu có các thành phần tương ứng là các giá trị tại các điểm chia xk của η(x) và η ′(x). Nhận xét 2.2. Với cách chọn điểm chia như trong Thuật toán 2.3 thì ta không biết trước được số điểm chia xk (ở đây là i điểm). Do đó, có thể dẫn đến việc phải tính toán các ma trận s, F (s), DF (s) với số chiều rất lớn. Ví dụ cụ thể cho cách chọn điểm chia này được trình bày trong Chương 3. 43 Chương 3 Thử nghiệm số Trong chương này, chúng tôi sẽ trình bày kết quả của các ví dụ cụ thể cho các phương pháp trong Chương 2. Các thuật toán được viết với Maple 13 và chạy trên máy tính với hệ điều hành Window 7 RMT, bộ xử lí Intel Core Duo T2450 (2.0GHz, 533MHz FSB, 2MB L2 cache), 1GB DDR2. Ngoài ra, chúng tôi luôn dùng kí hiệu ∆y để chỉ sai số giữa nghiệm số tìm được và nghiệm chính xác tại giá trị biên b và việc tính toán trong Maple đều được thực hiện với 15 chữ số. 3.1 Phương pháp bắn đơn 3.1.1 Phương pháp bắn đơn giải bài toán biên tuyến tính Bài toán 3.1. Giải bài toán biên y′′ = −2 x · y′ + 2 x2 · y + sin(lnx) x2 , 1 ≤ x ≤ 2, y(1) = 1, y(2) = 1. Theo Định lí 1.3, bài toán biên tuyến tính này có nghiệm duy nhất. Máy tính 44 dễ dàng đưa ra nghiệm chính xác y(x) = [ 5 14 + 4 35 · cos ( 1 2 · ln 2 )2 + 12 35 · sin ( 1 2 · ln 2 ) cos ( 1 2 · ln 2 )] · x + [ 26 35 − 4 35 · cos ( 1 2 · ln 2 )2 − 12 35 · sin ( 1 2 · ln 2 ) · cos ( 1 2 · ln 2 )] · 1 x2 − 1 5 · cos ( 1 2 · lnx )2 − 3 5 · sin ( 1 2 · lnx ) · cos ( 1 2 · lnx ) + 1 10 . Mã giải bài toán được trình bày chi tiết trong phần Phụ lục. Giá trị khuyến khích sử dụng cho s(0) là β−α b−a = 0, tuy nhiên, trong chương trình, chúng tôi chọn hai giá trị dydx1 = s1 = −10., dydx2 = s2 = 1000 (tức là khá xa giá trị trên) cho hai lần bắn đầu. Lần bắn thứ nhất tìm được y¯(2) ≈ −4.368 612 273 02981, lần thứ hai tìm được y¯(2) ≈ 584.798 054 393 566. Từ hai giá trị này, lặp theo công thức (2.5), ta tìm được dydx3 = s¯ = −.796 664 67480. Giá trị đúng của y′(1) khi giải bằng Maple là y′(1) = −.796 664 67480 4881, tức là sai số ở đây khoảng 4.881 × 10−12. Kết quả của lần bắn thứ ba, cũng là nghiệm số của bài toán cùng sự so sánh với nghiệm chính xác thể hiện bởi bảng và hình vẽ sau đây: 45 x y¯(x) y(x) |y¯(x)− y(x)| 1. 1. 1. 0. 1.1 0.936312887619932 0.936312887619427 5.051× 10−13 1.2 0.898195951595713 0.898195951594798 9.159× 10−13 1.3 0.878648636269740 0.878648636268479 1.2608× 10−12 1.4 0.872991141202922 0.872991141201360 1.5626× 10−12 1.5 0.877984813827041 0.877984813825210 1.831× 10−12 1.6 0.891321032187032 0.891321032184951 2.081× 10−12 1.7 0.911311539591083 0.911311539588767 2.316× 10−12 1.8 0.936693949106570 0.936693949104028 2.542× 10−12 1.9 0.966505686499255 0.966505686496498 2.757× 10−12 2. 1.00000000000296 1. 2.960× 10−12 Hình 3.1: Nghiệm số của Bài toán 3.1. 46 3.1.2 Phương pháp bắn đơn giải bài toán biên tổng quát Bài toán 3.2. Giải bài toán biên y′′ = 3 2 · y2, y(0) = 4, y(1) = 1. Bài toán giá trị ban đầu tương ứng là (3.1) y′′ = 3 2 · y2, y(0) = 4, y′(0) = s. Bằng một thuật toán đơn giản1 ta có thể vẽ được (gần đúng) đồ thị hàm F (s) = y(1, s)− 1 như sau: Hình 3.2: Đồ thị hàm F (s) = y(1, s)− 1. Dựa vào đồ thị hàm F (s) ta thấy hàm này có hai không điểm: s¯1 nằm trong khoảng (−10, 0) và s¯2 nằm trong khoảng (−40,−30). Do đó, bài toán này có hai nghiệm và việc chọn giá trị s(0) ban đầu cho phép lặp sẽ quyết định sự hội 1Cho s nhận các giá trị nguyên từ −100 đến 20, giải bài toán (3.1), tìm được F (s) = y(1, s)− 1. 47 tụ của phương pháp cũng như nghiệm của bài toán. Giá trị được khuyến khích sử dụng là s(0) = β−α b−a = −1 gần s¯1 hơn, tất nhiên sẽ làm phương pháp hội tụ đến nghiệm ứng với s¯1. Chúng tôi đã thử (với các giá trị s (0) nguyên) và thấy rằng khi s(0) nhận các giá trị trong [−13, 8] và [−189,−17] thì phép lặp sẽ lần lượt đưa s tới giá trị s¯1 và s¯2 sau không quá 20 bước với sai số ∆y ≤ 10−9 (đối với nghiệm thứ nhất2), ngoài các giá trị trên thì phương pháp bắn đơn không hội tụ. Mã giải bài toán được trình bày chi tiết trong phần Phụ lục. Nghiệm chính xác thứ nhất của bài toán là y(x) = 4 (x+1)2 . Để thu được nghiệm số thứ nhất y¯1(x), chúng tôi đã chọn giá trị dydx = s (0) = β−α b−a = −1, sau 14 bước lặp thu được giá trị dydx = −8.000 000 000 00429 (giá trị đúng là s¯1 = −8.) với sai số ∆y = 1.× 10−14. Kết quả như sau: x y¯1(x) y(x) |y¯1(x)− y(x)| 0. 4. 4. 0. 0.1 3.30578512396740 3.30578512396694 4.6× 10−13 0.2 22.77777777777837 2.77777777777778 5.9× 10−13 0.3 2.36686390532608 2.36686390532544 6.4× 10−13 0.4 2.04081632653115 2.04081632653061 5.4× 10−13 0.5 1.77777777777826 1.77777777777778 4.8× 10−13 0.6 1.56250000000037 1.56250000000000 3.7× 10−13 0.7 1.38408304498297 1.38408304498270 2.7× 10−13 0.8 1.23456790123476 1.23456790123457 1.9× 10−13 0.9 1.10803324099733 1.10803324099723 1.0× 10−13 1. 1.00000000000001 1. 1.× 10−14 2Do điều kiện, chúng tôi chưa tìm được nghiệm chính xác thứ 2 để so sánh. 48 Nghiệm số được thể hiện bởi đồ thị: Nghiệm thứ hai tìm được với thuật toán Hình 3.3: Nghiệm số thứ nhất với cách chọn dydx = −1. tương tự khi chọn tham số dydx = −189, sau 12 bước lặp thu được dydx = −35.858 548 825 1651 (giá trị đúng là s¯2 = −35.858 548 72783) và nghiệm số với xấp xỉ ∆y = 1.221× 10−11, cụ thể như sau: x y¯2(x) x y¯2(x) 0.1 0.47890945888243 0.6 -10.4101929312365 0.2 -3.00811455179185 0.7 -8.69758286532646 0.3 -6.33099864039525 0.8 -5.86089534467250 0.4 -9.03857176759085 0.9 -2.49161417087611 0.5 -10.5362262087227 1. 1.00000000001221 Đồ thị của nghiệm số thứ hai được thể hiện trong Hình 3.4. 3Giá trị này chúng tôi tham khảo trong [6]. 49 Hình 3.4: Nghiệm số thứ hai với cách chọn dydx = −189. 3.2 Phương pháp bắn bội 3.2.1 Phương pháp bắn bội giải bài toán biên tuyến tính Bài toán 3.3. Giải bài toán biên y′′ = 100 · y, y(0) = 1, y(4) = 10. Bài toán này đã được đề cập đến trong Nhận xét 2.1, trong khi phương pháp bắn đơn không hội tụ thì phương pháp bắn bội lại khả thi. Với bài toán này và các điểm biên như trên thì chỉ cần chia [0, 4] thành hai đoạn 0 = x1 < x2 = 2 < x3 = 4. Chúng tôi đã thử giải bài toán với m lần lượt bằng 3, 5 và 11, tức là chia [0, 4] lần lượt thành 2 đoạn, 4 đoạn và 10 đoạn (đều nhau). Ma trận s0 ban đầu có các thành phần đều bằng 0 (ngoại trừ hai vị trí nhận giá trị là α và β đã trình bày trong Chương 2). Với cả ba cách chia thì thuật toán đều hội tụ sau 3 bước lặp, thời gian tính toán lần lượt là 62.260, 62.275 và 19.734 giây, thu được các 50 ma trận F (s) tương ứng là m = 3, F (s) ∈ R6×1 m = 5, F (s) ∈ R10×1 m = 11, F (s) ∈ R22×1 [−2.06115362584580× 10−8] [−1.0345512× 10−12] [−2.3× 10−15] [−2.06115362584589× 10−7] [−8.594004× 10−12] [−2.4× 10−14] [−2.× 10−13] [7.548485× 10−16] [−1.281× 10−15] [−2.× 10−12] [−7.082534227036× 10−9] [−1.283× 10−14] [0.] [−1.8× 10−17] [1.1699× 10−16] [5.× 10−13] [−7.0785446× 10−10] [1.1718× 10−15] [−1.× 10−14] [2.38× 10−19] [−7.2571× 10−9] [2.42× 10−18] [0.] [4.49× 10−20] [−1.× 10−14] [4.49× 10−19] [−1.4× 10−19] [−1.4× 10−18] [−4.8× 10−18] [−4.7× 10−17] [−3.0× 10−16] [−3.0× 10−15] [0.] [0.] [−1.× 10−14] [3.× 10−13] [0.] [−1.× 10−14] Trong phần Phụ lục, chúng tôi trình bày mã giải bài toán với cách chia [0, 4] thành 4 đoạn bằng nhau. Sai số của các nghiệm số thu được so với nghiệm chính xác (sau 3 bước lặp đối với cả 3 cách chia) được thể hiện bởi bảng sau: 51 x m = 3 m = 5 m = 11 0. 0. 0. 0. 0.2 2.2745× 10−11 2.27446860867208× 10−11 2.2745× 10−11 0.4 6.1545× 10−12 6.15448047716976× 10−12 6.1568× 10−12 0.6 1.23271× 10−12 1.23271091568458× 10−12 1.24966× 10−12 0.8 9.8877× 10−14 9.8877344509058× 10−14 2.25528× 10−13 1. 8.976102× 10−13 1.36941003115983× 10−13 3.81681× 10−14 1.2 6.90820413× 10−12 9.705495694021× 10−14 6.19626× 10−15 1.4 5.1089912001× 10−11 8.747103396334× 10−13 9.78449× 10−16 1.6 3.77513303120× 10−10 6.485621867910× 10−12 1.52063× 10−16 1.8 2.7894680698319× 10−9 4.792578456932× 10−11 2.81148× 10−17 2. 3.753654× 10−17 3.541275152328× 10−10 3.752514× 10−17 2.2 2.27082108× 10−16 4.7937375649× 10−11 2.27020108× 10−16 2.4 1.4881672090× 10−15 6.57224386× 10−12 1.4878272090× 10−15 2.6 9.62115193668× 10−15 1.51610842× 10−12 9.61867193668× 10−15 2.8 6.0935289305980× 10−14 4.8455193× 10−12 6.0922289305980× 10−14 3. 3.75218770311598× 10−13 3.5017138× 10−11 3.75116770311598× 10−13 3.2 2.21812583445091× 10−12 2.57186× 10−12 2.21758583445091× 10−12 3.4 1.22928860915685× 10−11 1.16428× 10−11 1.22912860915685× 10−11 3.6 6.05607680477170× 10−11 6.0462× 10−11 6.05447680477170× 10−11 3.8 2.23779968608672× 10−10 2.2369× 10−10 2.23689968608672× 10−10 4. 4.99995751645745× 10−13 1.× 10−14 1.00042483542553× 10−14 Ta thấy rằng sai số thu được không hơn kém nhau nhiều, tức là nghiệm số với cách chia thành hai khoảng cũng đã đủ tốt. Nghiệm số thu được (ứng vơi trường hợp chia 2 đoạn) được vẽ trong Hình 3.5. 3.2.2 Chọn điểm chia trong phương pháp bắn bội Để minh họa cho phần này, ta tìm các điểm chia cho bài toán sau: 52 Hình 3.5: Nghiệm số của Bài toán 3.3 khi m = 3. Bài toán 3.4. Giải bài toán biên y′′ = 5 · sinh 5y, y(0) = 0, y(1) = 1. Một quĩ đạo ban đầu rất đơn giản mà ta có thể chọn là η(x) := x (dễ thấy η(0) = 0 và η(1) = 1). Quá trình lặp tìm các điểm chia được thực hiện theo Thuật toán 2.3 với tham số ε = 1.5. Kết quả thu được số điểm chia m = 10, bao gồm các điểm 0., 0.30, 0.46, 0.59, 0.69, 0.77, 0.84, 0.90, 0.96, 1.. Đồ thị của y(x) khi thực hiện thuật toán được thể hiện trong Hình 3.6. Như vậy, với 10 điểm chia như trên thì ta cần chia [0, 1] thành 9 đoạn nhỏ. Tuy nhiên, ta có thể chọn một quĩ đạo ban đầu thuận lợi hơn, đó là nghiệm của bài toán biên tuyến tính hóa tương ứng y′′ = 5 · 5y, y(0) = 0, y(1) = 1, 53 Hình 3.6: Tìm điểm chia với η(x) = x, ε = 1.5. tức là chọn quĩ đạo η(x) := sinh 5x sinh 5 . Khi đó, thực hiện theo Thuật toán 2.3 với tham số ε = 1.5 ta thu được 4 điểm chia 0., 0.01, 0.93, 1., với đồ thị như sau Hình 3.7: Tìm điểm chia với η(x) = sinh 5x sinh 5 , ε = 1.5. 54 Vậy ta chỉ cần chia [0, 1] thành 3 đoạn tương ứng. Mã chương trình chọn điểm chia được trình bày cụ thể trong phần Phụ lục cho trường hợp η(x) = x, ε = 1.5. 3.2.3 Phương pháp bắn bội giải bài toán biên phi tuyến Ở mục này, chúng tôi trình bày các kết quả khi giải Bài toán 3.4: y′′ = 5 · sinh 5y, y(0) = 0, y(1) = 1. Như đã trình bày trong Chương 2, ta gặp khó khăn khi giải bài toán này bằng phương pháp bắn đơn do gặp các điểm kì dị khi chọn tham số ban đầu không thích hợp. Chúng tôi đã thử với các tham số ban đầu khác nhau và thấy rằng phương pháp bắn đơn vẫn khả thi với cách chọn 0.0273 ≤ dydx ≤ 0.0555, (chú ý rằng dydx là tham số ban đầu cho y′(0) và chúng tôi chỉ thử đến 4 chữ số thập phân), ngoài đoạn trên thì phương pháp bắn đơn phân kì. Phương pháp bắn bội được tiến hành với cả hai cách chọn điểm chia như đã trình bày ở mục trước. Ma trận s0 ban đầu nhận các giá trị cho bởi các hàm η(x) và η′(x) tại các điểm xk tương ứng. Lưu ý rằng, các hàm η(x) trong hai trường hợp là khác nhau. Kết quả sơ bộ như sau: • Với phương pháp bắn đơn, chúng tôi chọn tham số ban đầu dxdy = 0.0555, sau 20 phép lặp thu được sai số ∆y = 1. × 10−14. Thời gian tính toán là 2.590 giây. 55 • Với phương pháp bắn bội khi m = 10, sau 9 lần lặp với thời gian 55.459 giây, thu được sai số ∆y = 1.× 10−15. • Với phương pháp bắn bội khi m = 4, sau 9 lần lặp với thời gian 124.255 giây, thu được sai số ∆y = 0. Kết quả cụ thể của cả 3 trường hợp, cũng như đồ thị của nghiệm số được thể hiện bởi bảng và hình dưới.4 x PP bắn đơn với PP bắn bội với PP bắn bội với dydx = 0.0555 m = 10 m = 4 0. 0. 0. −1.0423518× 10−26 0.1 0.0047681444029047 0.0047680693588778 0.0047680754650201 0.2 0.0107535620203101 0.0107533928862528 0.0107534066579327 0.3 0.0194855622849382 0.0194852560869635 0.0194852810460201 0.4 0.0332009698298467 0.0332004489367797 0.0332004910264379 0.5 0.0554381960244252 0.554373274986313 0.554373963204647 0.6 0.0920457049193030 0.0920442618892492 0.0920443723803809 0.7 0.153163639469341 0.153161226918596 0.153161393186859 0.8 0.258220428541319 0.258216276280155 0.258216487705740 0.9 0.455067867731265 0.455059828892592 0.455060028158277 1. 1.00000000000001 0.999999999999999 1. 4Chúng tôi không tìm được nghiệm chính xác của bài toán biên phi tuyến này để so sánh. Ngay cả Maple 13 cũng chưa giải được. 56 Hình 3.8: Nghiệm của Bài toán 3.4 với PP bắn đơn. Hình 3.9: Nghiệm của Bài toán 3.4 với PP bắn bội khi m = 10. 57 Kết luận Quá trình nghiên cứu đề tài chúng tôi đã thu được các kết quả nhất định. Cụ thể, chúng tôi đã đưa ra được cái nhìn khái quát về bài toán biên cũng như các phương pháp giải bài toán biên, tập chung vào các phương pháp bắn: phương pháp bắn đơn và phương pháp bắn bội. Với hai phương pháp này, chúng tôi đã nêu lên được thuật toán, cũng như xây dựng thành công các thuật toán và chương trình giải một số bài toán biên cụ thể trong môi trường Maple. Chúng tôi tin rằng những kết quả nghiên cứu của luận văn là một tài liệu tham khảo bổ ích cho sinh viên, học viên - những ai tìm hiểu về bài toán biên. Do điều kiện về thời gian cũng như sự hiểu biết của tác giả còn có hạn, nên luận văn còn nhiều hạn chế. Tác giả mong muốn nhận được những ý kiến đóng góp, nhận xét, phê bình của các thầy cô, các bạn đồng nghiệp và những người quan tâm để bổ sung hoàn thiện đề tài cũng như nhận thức của tác giả. 58 Tài liệu tham khảo [1] Uri M. Ascher and Linda R. Petzold, Computer methods for ordinary dif- ferential equations and differential-algebraic equations, SIAM, 1998. [2] Burden R.L. and Faires J.D., Numerical analysis, Brooks Cole, seventh edition, 2001. [3] K.L. Chow and W.H. Enright, Distributed parallel shooting for boundary value ordinary differential equations, Department of Computer Science, University of Toronto. [4] Raymond Holsapple, Ram Venkararaman and David Doman, A modi- fied simple shooting method for solving two-point boundary-value problems, Proceedings of the IEEE Aerospace Conference, Big Sky, MT, March 2003. [5] Herbert B. Keller, Numerical methods for two-point boundary value prob- lems, Blaisdell, 1968. [6] J. Stoer and R. Bulirsch, Introduction to numerical analysis, Springer- Verlag, New York, third edition, January 2002. 59 Phụ lục: Mã giải các ví dụ trong luận văn Phương pháp bắn đơn tuyến tính Mã giải Bài toán 3.1 như sau: 1 > r e s t a r t ; > /∗ Tinh toan vo i 15 chu so ∗/ Dig i t s :=15: 4 > /∗ Giai ba i toan bang Maple 13 bo i l enh d so l v e ∗/ ode := d i f f ( g ( x ) , x , x)=−2/x∗( d i f f ( g ( x ) , x))+2/x^2∗g (x ) +s i n ( ln (x ) )/ x^2: 7 bcs :=g (1)=1 , g (2)=1: exact :=unapply ( rhs ( dso lve ({ bcs , ode } ) ) , x ) ; dexact :=unapply ( d i f f ( exact ( x ) , x ) , x ) : 10 /∗ Tinh g ia t r i cua dao ham nghiem chinh xac t a i b ien a ∗/ e v a l f ( dexact ( 1 ) ) ; 13 > /∗ Cac dieu k ien b ien ∗/ a :=1 . : alpha :=1 . : b :=2 . : beta :=1 . : 16 > /∗ Cac xap x i cho y ’ (1) trong 2 lan ban dau ∗/ dydx1:=−10: dydx2 :=1000: > /∗ Cac ham f1 , f2 l a cac thanh phan cua f ( x , y , y ’ ) ∗/ 19 f 1 :=(x , y , z)−>z : 60 f 2 :=(x , y , z)−>−2/x∗z+2/x^2∗y+s in ( ln (x ) )/ x^2: > /∗ Buoc nhay trong thua t toan Runge Kutta ∗/ 22 h :=0 .001 : i i :=round ( ( b−a )/h ) : > x1 [ 0 ] := a : y1 [ 0 ] := alpha : z1 [ 0 ] := dydx1 : 25 > /∗ Giai ba i toan GTBD bang PP Runge Kutta ∗/ for i from 0 to i i −1 do 28 x1 [ i +1]:=x1 [ i ]+h ; k1y:= f1 ( x1 [ i ] , y1 [ i ] , z1 [ i ] ) ; k1z := f2 ( x1 [ i ] , y1 [ i ] , z1 [ i ] ) ; 31 k2y:= f1 ( x1 [ i ]+(1/2)∗h , y1 [ i ]+(1/2)∗ k1y∗h , z1 [ i ]+(1/2)∗ k1z∗h ) ; k2z := f2 ( x1 [ i ]+(1/2)∗h , y1 [ i ]+(1/2)∗ k1y∗h , z1 [ i ]+(1/2)∗ k1z∗h ) ; k3y:= f1 ( x1 [ i ]+(1/2)∗h , y1 [ i ]+(1/2)∗ k2y∗h , z1 [ i ]+(1/2)∗ k2z∗h ) ; 34 k3z := f2 ( x1 [ i ]+(1/2)∗h , y1 [ i ]+(1/2)∗ k2y∗h , z1 [ i ]+(1/2)∗ k2z∗h ) ; k4y:= f1 ( x1 [ i ]+h , y1 [ i ]+k3y∗h , z1 [ i ]+k3z∗h ) ; k4z := f2 ( x1 [ i ]+h , y1 [ i ]+k3y∗h , z1 [ i ]+k3z∗h ) ; 37 y1 [ i +1]:=y1 [ i ]+(1/6∗( k1y+2∗k2y+2∗k3y+k4y ) )∗h ; z1 [ i +1]:=z1 [ i ]+(1/6∗( k1z+2∗k2z+2∗k3z+k4z ) )∗h ; 40 end do : > /∗ Tap hop so l i e u thu duoc ∗/ data1 := [ [ a , alpha ] , [ b , beta ] ] : 43 data2 :=[ seq ( [ x1 [ i ] , y1 [ i ] ] , i = 0 . . i i ) ] : > /∗ The hien lan ban thu nhat t ren do t h i ∗/ plot ( [ data1 , data2 ] , x=a . . b , c o l o r =[BLACK,GREEN] , 46 s t y l e =[POINT,LINE ] , t h i c kne s s =2, symbol s i ze =15, symbol=CIRCLE, legend =["Cac␣diem␣bien " , "Lan␣ban␣thu␣1" ] , t i t l e ="Phuong␣Phap␣Ban␣Don" ) ; 49 /∗ Lan ban thu 2 ∗/ > x2 [ 0 ] := a : y2 [ 0 ] := alpha : z2 [ 0 ] := dydx2 : 52 > for i from 0 to i i −1 do x2 [ i +1]:=x2 [ i ]+h ; 61 k1y:= f1 ( x2 [ i ] , y2 [ i ] , z2 [ i ] ) ; 55 k1z := f2 ( x2 [ i ] , y2 [ i ] , z2 [ i ] ) ; k2y:= f1 ( x2 [ i ]+(1/2)∗h , y2 [ i ]+(1/2)∗ k1y∗h , z2 [ i ]+(1/2)∗ k1z∗h ) ; k2z := f2 ( x2 [ i ]+(1/2)∗h , y2 [ i ]+(1/2)∗ k1y∗h , z2 [ i ]+(1/2)∗ k1z∗h ) ; 58 k3y:= f1 ( x2 [ i ]+(1/2)∗h , y2 [ i ]+(1/2)∗ k2y∗h , z2 [ i ]+(1/2)∗ k2z∗h ) ; k3z := f2 ( x2 [ i ]+(1/2)∗h , y2 [ i ]+(1/2)∗ k2y∗h , z2 [ i ]+(1/2)∗ k2z∗h ) ; k4y:= f1 ( x2 [ i ]+h , y2 [ i ]+k3y∗h , z2 [ i ]+k3z∗h ) ; 61 k4z := f2 ( x2 [ i ]+h , y2 [ i ]+k3y∗h , z2 [ i ]+k3z∗h ) ; y2 [ i +1]:=y2 [ i ]+(1/6∗( k1y+2∗k2y+2∗k3y+k4y ) )∗h ; 64 z2 [ i +1]:=z2 [ i ]+(1/6∗( k1z+2∗k2z+2∗k3z+k4z ) )∗h end do ; > /∗ Tap hop so l i e u thu duoc ∗/ 67 data3 :=[ seq ( [ x2 [ i ] , y2 [ i ] ] , i =0. . i i ) ] ; > /∗ The hien 2 lan ban ∗/ plot ( [ data1 , data2 , data3 ] , x=a . . b , 70 c o l o r =[BLACK,GREEN,YELLOW] , s t y l e =[POINT,LINE ,LINE ] , t h i c kne s s =2, symbol s i ze =15, symbol=CIRCLE, 73 l egend=["Cac␣diem␣bien " , "Lan␣ban␣thu␣1" , "Lan␣ban␣thu␣2" ] , t i t l e="Phuong␣Phap␣Ban␣Don" ) ; 76 > /∗ Lap y ’ (1) cho lan ban thu 3 ∗/ dydx3 :=(dydx1−dydx2 )∗ ( beta−y2 [ i i ] ) / ( y1 [ i i ]−y2 [ i i ] ) +dydx2 ; 79 /∗ Lan ban thu 3 ∗/ > x3 [ 0 ] := a : y3 [ 0 ] := alpha : z3 [ 0 ] := dydx3 : 82 > for i from 0 to i i −1 do x3 [ i +1]:=x3 [ i ]+h ; k1y:= f1 ( x3 [ i ] , y3 [ i ] , z3 [ i ] ) ; 85 k1z := f2 ( x3 [ i ] , y3 [ i ] , z3 [ i ] ) ; k2y:= f1 ( x3 [ i ]+(1/2)∗h , y3 [ i ]+(1/2)∗ k1y∗h , z3 [ i ]+(1/2)∗ k1z∗h ) ; k2z := f2 ( x3 [ i ]+(1/2)∗h , y3 [ i ]+(1/2)∗ k1y∗h , z3 [ i ]+(1/2)∗ k1z∗h ) ; 62 88 k3y:= f1 ( x3 [ i ]+(1/2)∗h , y3 [ i ]+(1/2)∗ k2y∗h , z3 [ i ]+(1/2)∗ k2z∗h ) ; k3z := f2 ( x3 [ i ]+(1/2)∗h , y3 [ i ]+(1/2)∗ k2y∗h , z3 [ i ]+(1/2)∗ k2z∗h ) ; k4y:= f1 ( x3 [ i ]+h , y3 [ i ]+k3y∗h , z3 [ i ]+k3z∗h ) ; 91 k4z := f2 ( x3 [ i ]+h , y3 [ i ]+k3y∗h , z3 [ i ]+k3z∗h ) ; y3 [ i +1]:=y3 [ i ]+(1/6∗( k1y+2∗k2y+2∗k3y+k4y ) )∗h ; 94 z3 [ i +1]:=z3 [ i ]+(1/6∗( k1z+2∗k2z+2∗k3z+k4z ) )∗h ; end do ; 97 > /∗ Tap hop so l i e u thu duoc ∗/ data4 :=[ seq ( [ x3 [ i ] , y3 [ i ] ] , i =0. . i i ) ] ; > /∗ The hien ca 3 lan ban ∗/ 100 plot ( [ data1 , data2 , data3 , data4 ] , x=a . . b , c o l o r =[BLACK,GREEN,YELLOW,RED] , s t y l e =[POINT,LINE ,LINE ,LINE ] , 103 t h i c kne s s =2, symbol s i ze =15, symbol=CIRCLE, legend=["Cac␣diem␣bien " , "Lan␣ban␣thu␣1" , "Lan␣ban␣thu␣2" , "Lan␣ban␣thu␣3" ] , 106 t i t l e="Phuong␣Phap␣Ban␣Don" ) ; /∗ So sanh ke t qua thu duoc vo i nghiem chinh xac ∗/ 109 > for i from 0 by 100 to i i do print ( x3 [ i ] , e v a l f ( y3 [ i ] ) , e v a l f ( exact ( x3 [ i ] ) , e v a l f ( abs ( exact ( x3 [ i ])−y3 [ i ] ) ) ) : 112 end do ; Phương pháp bắn đơn tổng quát Mã giải Bài toán 3.2 như sau: > r e s t a r t ; 2 > /∗ Tinh toan vo i 15 chu so ∗/ Dig i t s :=15: > /∗ Tim nghiem chinh xac bang lenh d so l v e ∗/ 63 5 ode := d i f f ( q (x ) , x , x )=(3/2)∗q (x )^2 : bcs :=q(0)=4 ,q (1)=1: g:=unapply ( rhs ( dso lve ({ bcs , ode } ) ) , x ) : 8 dg:=unapply ( d i f f ( g ( x ) , x ) , x ) : > /∗ Cac g ia t r i b ien ∗/ a :=0: alpha :=4: 11 b :=1: beta :=1: > /∗ Lap ham f ( x , y ) gom 2 thanh phan f1 , f2 ∗/ f 1 :=(x , y , z−>z : 14 f 2 :=(x , y , z )−>(3/2)∗y^2: > /∗ Lap ham t inh w, chu y : f_y∗w+f_y ’∗w’=3∗y∗w ∗/ f 3 :=(x , yi ,w, u)−>u : 17 f 4 :=(x , yi ,w, u)−>3∗y i ∗w: > /∗ Buoc nhay trong PP Runge Kutta ∗/ h :=0 .001 : 20 i i :=round ( ( b−a )/h ) : /∗ Chu y : i i =1000 ∗/ > /∗ Xap x i ban dau cho y ’( a ) ∗/ dydx :=( beta−alpha )/ (b−a ) : 23 > /∗ Bien k dem so lan lap ∗/ k :=0: e p s i l o n :=1: 26 > /∗ Bat dau vong lap tim dydx ∗/ /∗ Phep lap se dung kh i s a i so e p s i l o n dat 10^(−15) hoac so buoc lap k dat 20 ∗/ 29 while eps i l on >10^(−15) and k<20 do x [ 0 ] := a : y [ 0 ] := alpha : z [ 0 ] := dydx ; w[ 0 ] := 0 : u [ 0 ] := 1 : 32 for i from 0 to i i −1 do x [ i +1]:=x [ i ]+h ; k1y:= f1 (x [ i ] , y [ i ] , z [ i ] ) ; 35 k1z := f2 (x [ i ] , y [ i ] , z [ i ] ) ; k2y:= f1 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k1y∗h , z [ i ]+(1/2)∗ k1z∗h ) ; k2z := f2 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k1y∗h , z [ i ]+(1/2)∗ k1z∗h ) ; 38 k3y:= f1 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k2y∗h , z [ i ]+(1/2)∗ k2z∗h ) ; 64 k3z := f2 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k2y∗h , z [ i ]+(1/2)∗ k2z∗h ) ; k4y:= f1 (x [ i ]+h , y [ i ]+k3y∗h , z [ i ]+k3z∗h ) ; 41 k4z := f2 (x [ i ]+h , y [ i ]+k3y∗h , z [ i ]+k3z∗h ) ; y [ i +1]:=y [ i ]+(1/6∗( k1y+2∗k2y+2∗k3y+k4y ) )∗h ; z [ i +1]:=z [ i ]+(1/6∗( k1z+2∗k2z+2∗k3z+k4z ) )∗h ; 44 k1w:= f3 (x [ i ] , y [ i ] , w[ i ] , u [ i ] ) ; k1u:= f4 (x [ i ] , y [ i ] , w[ i ] , u [ i ] ) ; 47 k2w:= f3 (x [ i ]+(1/2)∗h , y [ i ] ,w[ i ]+(1/2)∗k1w∗h , u [ i ]+(1/2)∗ k1u∗h ) ; k2u:= f4 (x [ i ]+(1/2)∗h , y [ i ] ,w[ i ]+(1/2)∗k1w∗h , u [ i ]+(1/2)∗ k1u∗h ) ; k3w:= f3 (x [ i ]+(1/2)∗h , y [ i ] ,w[ i ]+(1/2)∗k2w∗h , u [ i ]+(1/2)∗ k2u∗h ) ; 50 k3u:= f4 (x [ i ]+(1/2)∗h , y [ i ] ,w[ i ]+(1/2)∗k2w∗h , u [ i ]+(1/2)∗ k2u∗h ) ; k4w:= f3 (x [ i ]+h , y [ i ] ,w[ i ]+k3w∗h , u [ i ]+k3u∗h ) ; k4u:= f4 (x [ i ]+h , y [ i ] ,w[ i ]+k3w∗h , u [ i ]+k3u∗h ) ; 53 w[ i +1]:=w[ i ]+(1/6∗(k1w+2∗k2w+2∗k3w+k4w))∗h ; u [ i +1]:=u [ i ]+(1/6∗( k1u+2∗k2u+2∗k3u+k4u ) )∗h ; end do ; 56 /∗ Tinh sa i so e p s i l o n va lap dydx moi bang Phuong phap lap Newton ∗/ ep s i l o n :=| y [ i i ]−beta | ; 59 dydx:=dydx−(y [ i i ]−beta )/w[ i i ] ; k:=k+1: end do : /∗ Ket thuc vong lap , da tim duoc dydx dung ∗/ 62 > /∗ Tap hop so l i e u thu duoc ∗/ data1 := [ [ a , alpha ] , [ b , beta ] ] ; data2 :=[ seq ( [ x [ i ] , y [ i ] ] , i =0. . i i ) ] ; 65 > /∗ The hien nghiem so thu nhat t ren do t h i ∗/ plot ( [ data1 , data2 ] , x=a . . b , c o l o r =[BLACK,GREEN] , s t y l e =[POINT,LINE ] , t h i c kne s s =2, symbol s i ze =15, symbol=CIRCLE, 68 l egend=["Cac␣diem␣bien " , "Nghiem␣ so ␣thu␣nhat" ] , t i t l e="Phuong␣Phap␣Ban␣Don" ) ; > /∗ Lap bang so sanh ∗/ 71 for i from 0 by 100 to i i do print ( x [ i ] , e v a l f ( y [ i ] ) , e v a l f ( g ( x [ i ] ) ) , 65 e v a l f ( abs ( y [ i ]−g (x [ i ] ) ) ) ) : 74 end do ; Phương pháp bắn bội Mã giải Bài toán 3.3 như sau: 1 > r e s t a r t ; >/∗ Tinh toan vo i 15 chu so ∗/ Dig i t s :=15: 4 > /∗ Tim nghiem chinh xac bang lenh d so l v e ∗/ ode := d i f f ( r ( x ) , x , x)=100∗ r ( x ) : bcs := r (0)=1 , r (4)=10: 7 exact :=unapply ( rhs ( dso lve ({ bcs , ode } ) ) , x ) : > /∗ Dat ham t inh t h o i g ian chay ∗/ tg :=time ( ) ; 10 > /∗ Cac dieu k ien b ien ∗/ a:= 0 . : alpha :=1 . : b :=4 . : beta :=10 . : > /∗ Lap cac ma tran ∗/ 13 A:=Matrix ( [ [ 1 , 0 ] , [ 0 , 0 ] ] ) : B:=Matrix ( [ [ 0 , 0 ] , [ 1 , 0 ] ] ) : K:=Matrix ( [ [ − 1 , 0 ] , [ 0 , − 1 ] ] ) : 16 L:=Matrix ( [ [ 0 , 0 ] , [ 0 , 0 ] ] ) : DF:=Matrix ( 1 0 ) : /∗ Ma tran F ban dau co cac phan tu deu bang 1 ∗/ 19 F:=Matrix (10 ,1 , f i l l =1): s :=Matrix ( 1 0 , 1 ) : s (1 ,1) := alpha : s (9 ,1) := beta : 22 > /∗ Cac diem chia ∗/ t [ 1 ] : = 0 . : t [ 2 ] : = 1 . : t [ 3 ] : = 2 . : t [ 4 ] : = 3 . : t [ 5 ] : = 4 . : > /∗ Buoc nhay trong PP Runge Kutta ∗/ 25 h := 0 . 0 0 1 : > /∗ Lap cac ham cua y va w ∗/ f 1 :=(x , y , z)−>z : 66 28 f 2 :=(x , y , z)−>100∗y : f 3 :=(x , yi ,w, u)−>u : f4 :=(x , yi ,w, u)−>100∗w: 31 > /∗ Dem so buoc lap ∗/ l := 0 : > /∗ Bat dau vong lap ∗/ 34 while l < 3 do for j from 1 to 4 do k [ j ] :=0 ; 37 ep s i l o n :=1; dydx [ j ] := s (2∗ j , 1 ) ; while eps i l on >10^(−15) and k [ j ]<20 do 40 i i :=round ( ( t [ j ]− t [ 1 ] ) / h ) ; x [ i i ] := t [ j ] ; y [ i i ] := s (2∗ j −1 ,1) ; z [ i i ] := dydx [ j ] ; w[ i i ] :=0 ; u [ i i ] :=1 ; 43 for i from round ( ( t [ j ]− t [ 1 ] ) / h) to round ( ( t [ j+1]−t [ 1 ] ) / h)−1 do x [ i +1]:=x [ i ]+h ; 46 k1y:= f1 (x [ i ] , y [ i ] , z [ i ] ) ; k1z := f2 (x [ i ] , y [ i ] , z [ i ] ) ; k2y:= f1 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k1y∗h , z [ i ]+(1/2)∗ k1z∗h ) ; 49 k2z := f2 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k1y∗h , z [ i ]+(1/2)∗ k1z∗h ) ; k3y:= f1 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k2y∗h , z [ i ]+(1/2)∗ k2z∗h ) ; k3z := f2 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k2y∗h , z [ i ]+(1/2)∗ k2z∗h ) ; 52 k4y:= f1 (x [ i ]+h , y [ i ]+k3y∗h , z [ i ]+k3z∗h ) ; k4z := f2 (x [ i ]+h , y [ i ]+k3y∗h , z [ i ]+k3z∗h ) ; y [ i +1]:=y [ i ]+(1/6∗( k1y+2∗k2y+2∗k3y+k4y ) )∗h ; 55 z [ i +1]:=z [ i ]+(1/6∗( k1z+2∗k2z+2∗k3z+k4z ) )∗h ; k1w:= f3 (x [ i ] , y [ i ] ,w[ i ] , u [ i ] ) ; 58 k1u =f4 (x [ i ] , y [ i ] ,w[ i ] , u [ i ] ) ; k2w:= f3 (x [ i ]+(1/2)∗h , y [ i ] ,w[ i ]+(1/2)∗k1w∗h , u [ i ]+(1/2)∗ k1u∗h ) ; 61 k2u:= f4 (x [ i ]+(1/2)∗h , y [ i ] ,w[ i ]+(1/2)∗k1w∗h , 67 u [ i ]+(1/2)∗ k1u∗h ) ; k3w:= f3 (x [ i ]+(1/2)∗h , y [ i ] ,w[ i ]+(1/2)∗k2w∗h , 64 u [ i ]+(1/2)∗ k2u∗h ) ; k3u:= f4 (x [ i ]+(1/2)∗h , y [ i ] ,w[ i ]+(1/2)∗k2w∗h , u [ i ]+(1/2)∗ k2u∗h ) ; 67 k4w:= f3 (x [ i ]+h , y [ i ] ,w[ i ]+k3w∗h , u [ i ]+k3u∗h ) ; k4u:= f4 (x [ i ]+h , y [ i ] ,w[ i ]+k3w∗h , u [ i ]+k3u∗h ) ; w[ i +1]:=w[ i ]+(1/6∗(k1w+2∗k2w+2∗k3w+k4w))∗h ; 70 u [ i +1]:=u [ i ]+(1/6∗( k1u+2∗k2u+2∗k3u+k4u ) )∗h ; end do : /∗ Ket thuc vong lap FOR doi vo i b ien i ∗/ 73 j j :=round ( ( t [ j+1]−t [ 1 ] ) / h ) ; e p s i l o n :=abs (y [ j j ]− s (2∗ j +1 ,1)) ; dydx [ j ] := dydx [ j ]−(y [ j j ]− s (2∗ j +1 ,1))/w[ j j ] ; 76 k [ j ] :=k [ j ]+1: end do : /∗ Ket thuc vong lap WHILE ∗/ /∗ Lap ham F ∗/ 79 F(2∗ j −1 ,1):=y [ j j ]− s (2∗ j +1 ,1) ; F(2∗ j , 1 ) := z [ j j ]− s (2∗ j +2 ,1) ; F(9 ,1) :=y [0]− alpha ; 82 F(10 ,1) :=y [ j j ]−beta ; /∗ Gan l a i cac g ia t r i cho ma tran s ∗/ s (2∗ j , 1 ) := dydx [ j ] : 85 /∗ Tim cac ma tran G[ k ] nho PP Runge Kutta ∗/ g1 :=(x , a , b , c , d)−>c : g2 :=(x , a , b , c , d)−>d : 88 g3 :=(x , a , b , c , d)−>100∗a : g4 :=(x , a , b , c , d)−>100∗b : i i i :=round ( t [ j ] / h ) ; 91 x [ i i i ] := t [ j ] : a [ i i i ] :=1 : b [ i i i ] :=0 : c [ i i i ] :=0 : d [ i i i ] :=1 ; for i from round ( ( t [ j ]− t [ 1 ] ) / h) to 94 round ( ( t [ j+1]−t [ 1 ] ) / h)−1 do x [ i +1]:=x [ i ]+h ; 68 k1a:=g1 (x [ i ] , a [ i ] , b [ i ] , c [ i ] , d [ i ] ) ; 97 k1b:=g2 (x [ i ] , a [ i ] , b [ i ] , c [ i ] , d [ i ] ) ; k1c :=g3 (x [ i ] , a [ i ] , b [ i ] , c [ i ] , d [ i ] ) ; k1d:=g4 (x [ i ] , a [ i ] , b [ i ] , c [ i ] , d [ i ] ) ; 100 k2a:=g1 (x [ i ]+(1/2)∗h , a [ i ]+(1/2)∗ k1a∗h , b [ i ]+ (1/2)∗ k1b∗h , c [ i ]+(1/2)∗ k1c∗h , d [ i ]+(1/2)∗ k1d∗h ) ; k2b:=g2 (x [ i ]+(1/2)∗h , a [ i ]+(1/2)∗ k1a∗h , b [ i ]+ 103 (1/2)∗ k1b∗h , c [ i ]+(1/2)∗ k1c∗h , d [ i ]+(1/2)∗ k1d∗h ) ; k2c :=g3 (x [ i ]+(1/2)∗h , a [ i ]+(1/2)∗ k1a∗h , b [ i ]+ (1/2)∗ k1b∗h , c [ i ]+(1/2)∗ k1c∗h , d [ i ]+(1/2)∗ k1d∗h ) ; 106 k2d:=g4 (x [ i ]+(1/2)∗h , a [ i ]+(1/2)∗ k1a∗h , b [ i ]+ (1/2)∗ k1b∗h , c [ i ]+(1/2)∗ k1c∗h , d [ i ]+(1/2)∗ k1d∗h ) ; k3a :=g1 (x [ i ]+(1/2)∗h , a [ i ]+(1/2)∗ k2a∗h , b [ i ]+ 109 (1/2)∗ k2b∗h , c [ i ]+(1/2)∗ k2c∗h , d [ i ]+(1/2)∗ k2d∗h ) ; k3b:=g2 (x [ i ]+(1/2)∗h , a [ i ]+(1/2)∗ k2a∗h , b [ i ]+ (1/2)∗ k2b∗h , c [ i ]+(1/2)∗ k2c∗h , d [ i ]+(1/2)∗ k2d∗h ) ; 112 k3c :=g3 (x [ i ]+(1/2)∗h , a [ i ]+(1/2)∗ k2a∗h , b [ i ]+ (1/2)∗ k2b∗h , c [ i ]+(1/2)∗ k2c∗h , d [ i ]+(1/2)∗ k2d∗h ) ; k3d:=g4 (x [ i ]+(1/2)∗h , a [ i ]+(1/2)∗ k2a∗h , b [ i ]+ 115 (1/2)∗ k2b∗h , c [ i ]+(1/2)∗ k2c∗h , d [ i ]+(1/2)∗ k2d∗h ) ; k4a :=g1 (x [ i ]+h , a [ i ]+k3a∗h , b [ i ]+k3b∗h , c [ i ]+k3c∗h , d [ i ]+k3d∗h ) ; 118 k4b:=g2 (x [ i ]+h , a [ i ]+k3a∗h , b [ i ]+k3b∗h , c [ i ]+k3c∗h , d [ i ]+k3d∗h ) ; k4c :=g3 (x [ i ]+h , a [ i ]+k3a∗h , b [ i ]+k3b∗h , 121 c [ i ]+k3c∗h , d [ i ]+k3d∗h ) ; k4d:=g4 (x [ i ]+h , a [ i ]+k3a∗h , b [ i ]+k3b∗h , c [ i ]+k3c∗h , d [ i ]+k3d∗h ) ; 124 a [ i +1]:=a [ i ]+(1/6∗( k1a+2∗k2a+2∗k3a+k4a ) )∗h ; b [ i +1]:=b [ i ]+(1/6∗( k1b+2∗k2b+2∗k3b+k4b ) )∗h ; c [ i +1]:=c [ i ]+(1/6∗( k1c+2∗k2c+2∗k3c+k4c ) )∗h ; 127 d [ i +1]:=d [ i ]+(1/6∗( k1d+2∗k2d+2∗k3d+k4d ) )∗h ; end do : /∗ Ket thuc vong lap FOR doi vo i b ien i ∗/ 69 130 j j j :=round ( ( t [ j+1]−t [ 1 ] ) / h ) ; G[ j ] :=Matrix ( [ [ a [ j j j ] , b [ j j j ] ] , [ c [ j j j ] , d [ j j j ] ] ] ) : end do : /∗ Ket thuc vong lap FOR doi vo i b ien j ∗/ 133 /∗ Lap ma tran DF ∗/ DF:=Matrix ( [ [G[ 1 ] ,K,L ,L ,L ] , [ L ,G[ 2 ] ,K,L ,L ] , [ L , L ,G[ 3 ] ,K,L ] , [ L , L , L ,G[ 4 ] ,K] , [A,L ,L , L ,B ] ] ) ; 136 /∗ Lap theo cong thuc Newton tim s moi ∗/ s :=s−(DF)^(−1).F : /∗ Gan l a i g ia t r i cho s ∗/ 139 s (9 ,1) := beta ; l := l+1 end do : /∗ Ket thuc vong lap WHILE doi vo i b ien l ∗/ 142 > /∗ Xem cac ke t qua thu duoc ∗/ DF; s ,F ; 145 > /∗ Xem tho i g ian chay ∗/ time ()− tg ; > /∗ Tao ke t qua va so sanh vo i nghiem chinh xac ∗/ 148 for i from 0 by 200 to 4000 do print ( x [ i ] , e v a l f ( y [ i ] ) , e v a l f ( abs (y [ i ]− exact ( x [ i ] ) ) ) ) : end do ; 151 > /∗ Tap hop so l i e u thu duoc ∗/ data1 : = [ [ 0 , 1 ] , [ 4 , 1 0 ] ] ; data2 :=[ seq ( [ x [50∗ i ] , y [50∗ i ] ] , i = 0 . . 8 0 ) ] ; 154 > /∗ Ve nghiem so thu duoc t ren do t h i ∗/ plot ( [ data1 , data2 ] , x=0. .4 , c o l o r =[BLACK,RED] , s t y l e =[POINT,LINE ] , t h i c kne s s =2, symbol s i ze =15, 157 symbol=CIRCLE, legend=["Cac␣diem␣bien " , "Nghiem␣ so " ] , t i t l e="Phuong␣Phap␣Ban␣Boi" ) ; Kỹ thuật chọn điểm chia Mã chương trình chọn điểm chia cho Bài toán 3.4 như sau: 70 1 > r e s t a r t ; > /∗ Cac diem bien ∗/ a :=0 . : alpha :=0 . : 4 b :=1 . : beta :=1 . : > /∗ Lap cac ham f ∗/ f 1 :=(x , y , z)−>z : 7 f 2 :=(x , y , z)−>5∗ s inh (5∗y ) : > /∗ Buoc nhay kh i chon diem ∗/ h := 0 . 0 1 : 10 > /∗ Qui dao ban dau ∗/ eta :=x−>x : deta :=unapply ( d i f f ( eta ( x ) , x ) , x ) : 13 > /∗ Cac tham so ban dau ∗/ x [ 0 ] := a : y [ 0 ] := alpha : z [ 0 ] := ( beta−alpha )/ (b−a ) : k :=0: 16 ep s i l o n :=1 . 5 : i :=0: j :=0: 19 t [ j ] := a : > /∗ Lap tim cac diem chia ∗/ while i ∗h < b do 22 x [ i +1]:=x [ i ]+h ; k1y:= f1 (x [ i ] , y [ i ] , z [ i ] ) ; k1z := f2 (x [ i ] , y [ i ] , z [ i ] ) ; 25 k2y:= f1 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k1y∗h , z [ i ]+(1/2)∗ k1z∗h ) ; k2z := f2 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k1y∗h , z [ i ]+(1/2)∗ k1z∗h ) ; k3y:= f1 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k2y∗h , z [ i ]+(1/2)∗ k2z∗h ) ; 28 k3z := f2 (x [ i ]+(1/2)∗h , y [ i ]+(1/2)∗ k2y∗h , z [ i ]+(1/2)∗ k2z∗h ) ; k4y:= f1 (x [ i ]+h , y [ i ]+k3y∗h , z [ i ]+k3z∗h ) ; k4z := f2 (x [ i ]+h , y [ i ]+k3y∗h , z [ i ]+k3z∗h ) ; 31 y [ i +1]:=y [ i ]+(1/6∗( k1y+2∗k2y+2∗k3y+k4y ) )∗h ; z [ i +1]:=z [ i ]+(1/6∗( k1z+2∗k2z+2∗k3z+k4z ) )∗h ; 34 i f abs (y [ i +1]) >= ep s i l o n ∗abs ( eta (x [ i +1])) then 71 j := j +1; t [ j ] :=x [ i +1] ; 37 y [ i +1]:= eta (x [ i +1 ] ) ; z [ i +1]:=deta (x [ i +1 ] ) ; end i f : 40 i := i +1; end do : /∗ Ket thuc qua t r i nh lap ∗/ t [ j +1]:=b : /∗ Diem chia cuoi cung ∗/ 43 > /∗ So cac diem chia ∗/ j +2; > /∗ In ra cac diem chia ∗/ 46 for k from 0 to j+1 do print ( t [ k ] ) ; end do ; 49 > /∗ Tap hop so l i e u va ve t ren do t h i ∗/ data1 := [ [ a , alpha ] , [ b , beta ] ] : data2 :=[ seq ( [ x [ i ] , y [ i ] ] , i = 0 . . 1 0 0 ) ] : 52 plot ( [ data1 , data2 ] , x=a . . b , c o l o r =[BLACK,BLACK] , s t y l e =[POINT,LINE ] , t h i c kne s s =2, symbol s i ze =15, symbol=CIRCLE, legend=["Cac␣diem␣bien " , 55 "Nghiem␣khi ␣tim␣diem␣ ch ia " ] , t i t l e="Phuong␣Phap␣Ban␣Boi" ) ; 72

Các file đính kèm theo tài liệu này:

  • pdfa6.PDF
Tài liệu liên quan