Đề tài Phương pháp sai phân giải gần đúng phương trình vi phân tuyến tính

 

Lời nói đầu . 3

Chương 1. Khái niệm mở đầu về phương pháp sai phân . 5

1.1. Mở đầu 5

1.2. Khái niệm về bài toán biên . . 5

1.3. Bài toán vi phân . 5

1.4. Lưới sai phân . 6

1.5. Hàm lưới . 6

1.6. Đạo hàm lưới . 6

1.7. Qui ước viết vô cùng bé . 7

1.8. Công thức Taylor 7

1.9. Liên hệ giữa đạo hàm và đạo hàm lưới . 8

1.10. Phương pháp sai phân . 9

1.11. Giải bài toán sai phân bằng phương pháp truy đuổi . 9

 1.11.1. Phương pháp truy đuổi từ phải .10

 1.11.2. Phương pháp truy đuổi từ trái 11

1.12. Sự ổn định của bài toán sai phân 12

1.13. Sự xấp xỉ . 12

1.14. Sự hội tụ . 13

1.15. Trường hợp điều kiện biên loại ba 14

Chương 2. Phương pháp sai phân giải gần đúng phương trình vi phân cấp bốn 18

2.1. Bài toán vi phân 18

2.2. Lưới sai phân 19

2.3. Hàm lưới . 19

2.4. Đạo hàm lưới 19

2.5. Phương pháp sai phân . 20

2.6. Cách giải bài toán sai phân . 27

 2.6.1. Phương pháp lặp Seidel co dãn 27

 2.6.2. Phương pháp truy đuổi 28

 2.6.2.1. Phương pháp truy đuổi từ phải . 28

 2.6.2.2. Phương pháp truy đuổi từ trái . 31

 2.6.2.3. Sự ổn định . 34

2.7. Sự xấp xỉ . 37

2.8. Sự ổn định của bài toán sai phân . 37

2.9. Bài toán sai phân đối với sai số 49

2.10. Sự hội tụ và sai số . 50

Phụ lục . 58

Tài liệu tham khảo 84

 

doc84 trang | Chia sẻ: huong.duong | Lượt xem: 1654 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Phương pháp sai phân giải gần đúng phương trình vi phân tuyến tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
đuổi đã nêu ở trên. Sau khi giải ra ta được kết quả: . Ta có thể tìm được nghiệm tổng quát của phương trình đã cho là: Dựa vào các điều kiện biên, ta tìm được . Suy ra nghiệm riêng tương ứng của phương trình là: So sánh với các nghiệm gần đúng tại các nút lưới, ta có bảng kết quả sau: Nghiệm gần đúng Nghiệm đúng 0 -0.5 0 0 1 -0.25 -0.19943 -0.21031 2 0 -0.26393 -0.27415 3 0.25 -0.20295 -0.21031 4 0.5 0 0 Sai số đạt: Chương 2 Phương pháp sai phân giải gần đúng phương trình vi phân cấp bốn Trong chương một ta đã xét các khái niệm của phương pháp sai phân thông qua bài toán biên đối với phương trình vi phân cấp hai nhằm hiểu được tư tưởng của phương pháp. Chương này sẽ đi vào nội dung chính của đồ án là dùng phương pháp sai phân để giải gần đúng phương trình vi phân cấp bốn tổng quát một cách chi tiết. Bài toán vi phân Cho hai số và với . Tìm hàm xác định tại thỏa mãn: trong đó: liên tục và các đạo hàm liên tục liên tục và đạo hàm liên tục là những hàm số liên tục đồng thời là những hàm số cho trước là những hàm số liên tục cho trước. Định lý về sự tồn tại và duy nhất nghiệm Phương trình có dạng: Nếu liên tục trong một miền nào đó trong và nếu là một điểm thuộc thì trong một lân cận nào đó của điểm , tồn tại một nghiệm duy nhất của phương trình thỏa mãn các điều kiện: Xem [5] phần tài liệu tham khảo. Lưới sai phân Ta chia đoạn thành đoạn con bằng nhau, mỗi đoạn con dài bởi các điểm . Mỗi điểm gọi là một nút lưới, gọi là bước lưới Tập gọi là tập các nút trong Tập gọi là tập các nút biên Tập gọi là một lưới trên Hàm lưới Đó là những hàm số xác định tại các nút của lưới . Giá trị của hàm lưới tại nút viết là . Một hàm số xác định tại mọi sẽ tạo ra hàm lưới có giá trị tại nút là . Đạo hàm lưới Giả sử hàm đủ trơn. Theo công thức Taylor, ta có Ta suy ra và như ta đã biết gọi là đạo hàm lưới tiến và lùi cấp một của . Qui ước: Ta còn có Ta suy ra Do đó Đồng thời Phương pháp sai phân Giả sử bài toán vi phân thỏa mãn định lý về sự tồn tại và duy nhất nghiệm, ta tìm cách tính gần đúng giá trị của nghiệm đúng tại các nút . Gọi các giá trị gần đúng đó là . Muốn có ta thay bài toán vi phân bởi bài toán sai phân tương ứng. Đặt Từ ta suy ra Theo ta có Ta có: Cộng vế với vế hai đẳng thức trên ta được: Suy ra Hay Thay vào ta được Thay vào ta được Đặt Cũng từ ta suy ra trong đó Thật vậy (giả thiết: ) Vậy: Tương tự, ta có thể chỉ ra rằng: Bằng cách khai triển các tới đạo hàm cấp 5 theo công thức Taylor, với giả thiết Đặt , coi là nghiệm gần đúng của và bỏ qua các vô cùng bé của ta được phương trình sau: Viết lại: trong đó: Có thể tính: Đặt Ta có phương trình sau: Kết hợp với các điều kiện biên , ta có: Bây giờ, ta cần xấp xỉ đạo hàm tại điểm : Nhân cả hai vế của đẳng thức với (-2) sau đó cộng với hai đẳng thức và ở trên, ta được: mà Vậy: trong đó: Thay vào, ta có: Thay bởi và bỏ qua sai số địa phương cấp 2 , ta được: Tương tự với điều kiện biên , ta có: Ta cần xấp xỉ đạo hàm cấp 2 tại : Nhân cả hai vế của đẳng thức ứng với với (-2) sau đó cộng với hai đẳng thức , ta được: mà Vậy: trong đó: Thay vào, ta có: Cũng thay bởi và bỏ qua sai số địa phương cấp 2 , ta được: Như vậy ta có hệ phương trình sau: Hệ cũng được gọi là lược đồ sai phân đối với bài toán biên đã cho. Thay cho bài toán vi phân đối với ẩn hàm ta có bài toán sai phân đối với ẩn hàm . là hệ phương trình đại số bậc nhất tuyến tính có dạng năm đường chéo. Cách giải bài toán sai phân (I) Phương pháp lặp Seidel co dãn Hệ có thể viết lại ở dạng ma trận Từ suy ra: Phương pháp lặp xuất phát từ xấp xỉ đầu cho trước Tăng cường tốc độ hội tụ bằng phép co dãn Quá trình lặp co dãn dừng khi sai số tương đối: trong đó là mức độ chính xác tương đối định trước. Phương pháp truy đuổi Bài toán sai phân có dạng: Đó là một hệ đại số tuyến tính năm đường chéo. Bây giờ ta sẽ xét phương pháp truy đuổi giải hệ năm đường chéo tổng quát sau: Phương pháp truy đuổi từ phải Ta tìm nghiệm của hệ ở dạng: Khi đã biết các hệ số thì cho phép tính các lùi từ phải sang trái. Vì lẽ đó phương pháp mang tên phương pháp truy đuổi từ phải. Từ các công thức và các hệ số là chưa biết. Để tính các hệ số . Từ ta thay bởi và ta được: Thay và vào phương trình , ta được: Đối chiếu với ta suy ra: trong đó: Từ ta thấy để xác định được và ta phải biết được và . Như vậy, trước hết ta cần xác định các và với . Sau đó từ ta tính được các và với . Từ ta suy ra: Từ với , ta có: Suy ra: Tương tự, từ với và ta có: Từ với , ta có: Suy ra: Như vậy, từ ta tính được các hệ số và với . Tiếp theo, ta cần xác định và theo công thức . Bây giờ, ta cần sử dụng các phương trình trong hệ. Từ và với kết hợp với phương trình và sử dụng công thức , ta có: Suy ra: Ta thấy rằng ở trên chính là giá trị được tính theo công thức ứng với , trong đó mẫu số chính là . Để tính , ta sử dụng với và với phương trình Với được tính từ tại . Như vậy, ta có thể tóm tắt lại qui trình giải hệ năm đường chéo theo phương pháp truy đuổi từ phải như sau: Tính các hệ số trong đó: Tính các theo công thức Phương pháp truy đuổi từ trái Ta tìm nghiệm hệ ở dạng: Từ và các hệ số là chưa biết. Từ thay , ta được: Từ thay , ta được: Thay vào : Đối chiếu với ta suy ra: trong đó: Từ ta thấy, để xác định được các hệ số ta phải biết được . Như vậy, trước hết ta cần xác định và với . Sau đó từ ta tính được các hệ số với . Từ , ta suy ra: Từ tại , ta có: Suy ra: Tương tự, từ và tại ta có: Từ tại , ta có: Suy ra: Như vậy, từ ta tính được các hệ số với Tiếp theo ta cần xác định và theo công thức . Từ với và : Thay ở trên vào cho ta: Đối chiếu với ta suy ra: Ta thấy rằng ở trên trùng với các giá trị suy ra từ công thức ứng với . Để tính , ta sử dụng tại và rồi thay vào phương trình ta có: Suy ra: Tóm lại, qui trình giải hệ theo phương pháp truy đuổi từ trái như sau: Tính các hệ số trong đó: Tính các theo công thức 2.6.2.3 Sự ổn định Nhận xét rằng, các công thức chỉ có nghĩa khi và chỉ khi: Để đảm bảo rằng việc giải hệ theo các công thức là ổn định thì các hệ số của hệ phương trình phải thỏa mãn các điều kiện của định lý sau: Định lý. Khi tìm nghiệm hệ theo công thức truy đuổi ta sẽ gặp phải sai số quy tròn, vì vậy có thể dẫn đến sự mất ổn định của công thức tính. Quá trình tính sẽ ổn định nếu các điều kiện sau đây được thỏa mãn: đồng thời có ít nhất một bất đẳng thức mạnh trong các bất đẳng thức dưới đây: Khi đó ta có: Chứng minh. Thật vậy, từ và ta có: (do giả thiết: ) Do vì (giả thiết) Mà Suy ra: Tương tự, ta có thể chứng minh được: Nếu thì Bây giờ, ta sẽ chỉ ra rằng: và Thật vậy, từ ta có: Từ , suy ra: ( do ) Tương tự, với dựa vào ta suy ra: (Sử dụng giả thiết và ) Do đó: Cuối cùng, ta cần chỉ ra rằng . Như vậy, với giả thiết đã cho cùng với các điều kiện và đã được chứng minh ở trên ta cần giả thiết thêm là các bất đẳng thức thứ này không đồng thời xảy ra dấu bằng. Khi đó, ta có . Định lý được chứng minh đầy đủ. Với cách đánh giá hoàn toàn tương tự như định lý trên, nếu các giả thiết của định lý được thỏa mãn thì ta cũng chỉ ra được rằng: . Sự xấp xỉ Ta có: với . Do đó: Vì lẽ đó ta nói toán tử sai phân xấp xỉ toán tử vi phân tới cấp . Sự ổn định của bài toán sai phân Định lý. Bài toán sai phân là bài toán ổn định: Chứng minh. ở trên, bài toán sai phân đã đưa về dạng với các hệ số thỏa mãn định lý về sự ổn định của hệ năm đường chéo. Để đánh giá ta đặt , trong đó: thỏa mãn thỏa mãn Khi đó thỏa mãn . Công thức truy đuổi từ phải áp dụng vào bài toán cho: Ta có: Do định lý về sự ổn định của hệ năm đường chéo, ta có nên suy ra sao cho thỏa mãn bất đẳng thức . trong đó các hệ số chính là số hạng thứ của dãy số Fibonacci Dãy số thể hiện ứng với các giá trị , có dạng: Viết lại: Ta có: trong đó: Với Xét quan hệ giữa các hệ số và . Suy ra: và ta có: (định lý về sự ổn định của hệ năm đường chéo). Bây giờ ta đánh giá Ta có: Do đó: Ta suy ra: Đặt: Suy ra: Cộng vế với vế các bất đẳng thức trên, ta được: Từ , ta có: Do đó: Đặt: Suy ra: Do giả thiết Ta có: Tương tự, ta có: Suy ra: Tiếp theo ta đánh giá các hệ số Nhận xét rằng: Do các nên ta có: Với mục đích đánh giá để thấy được nghiệm của bài toán phụ thuộc chặt vào vế phải của phương trình sai phân và điều kiện biên, do các hệ số đã chỉ ra ở trên chỉ phụ thuộc vào các hằng số ( và ) nên để đơn giản ta có thể đánh giá như sau: trong đó: Suy ra: Với Vậy: trong đó là số hạng thứ của dãy số Fibonacci ở trên. Ta có thể tính theo công thức sau: Ta nhận thấy, với mỗi xác định đánh giá ở trên chỉ phụ thuộc vào điều kiện đầu và vế phải của phương trình sai phân. Một cách tương tự đối với , áp dụng công thức truy đuổi từ trái ta có: do nên sao cho thỏa mãn ( với thì ). Ta có: trong đó: với Suy ra: trong đó: Ta có: Cộng vế với vế các bất đẳng thức trên ta được: Dựa vào điều kiện biên của bài toán , ta có: Suy ra: Do đó: trong đó: Tương tự như ở phần trên đối với ta sẽ chỉ ra được nên suy ra: Và cũng tương tự, ta cũng dễ dàng chứng tỏ rằng các . Khi đó có thể đánh giá như sau: Suy ra: Với Vậy: Rõ ràng ta thấy rằng tương tự bài toán nghiệm của bài toán cũng chỉ phụ thuộc vào vế phải của phương trình sai phân và điều kiện biên của nó. Như vậy từ ta suy ra: Tức là: . Trong đó: với . Định lý được chứng minh. Bài toán sai phân đối với sai số Gọi là nghiệm của bài toán vi phân và là nghiệm của bài toán sai phân . Đặt (- biểu thị sai số tại nút khi ta lấy ). Ta có bài toán sai phân đối với sai số . Suy ra: Vậy ta có hệ Sự hội tụ và sai số Định lý. Phương pháp sai phân là phương pháp hội tụ với cấp chính xác . Chứng minh. Với mọi hàm lưới xác định trên , ta định nghĩa chuẩn áp dụng định lý về sự ổn định vào bài toán sai phân đối với sai số, ta suy ra: Bất đẳng thức này chứng tỏ , tức là khi . Hơn nữa bất đẳng thức trên còn là một ước lượng của sai số . Cỡ của sai số là (tức là ). Định lý chứng minh xong. Chú ý: Từ chứng minh trên của định lý ta có thể phát biểu gọn: Xấp xỉ + ổn định = Hội tụ Xấp xỉ cấp 2 + ổn định = Hội tụ cấp 2 Thí dụ 1: Để kiểm tra sự đúng đắn của phương pháp, ta xét thí dụ sau: trong đó: chưa biết Bây giờ ta sẽ “mò” lấy một nghiệm và coi là nghiệm đúng của phương trình đã cho, sau đó tính các đạo hàm và thay vào phương trình để tính ra hàm . Khi đó áp dụng phương pháp sai phân đã trình bày ở trên để tính ra nghiệm gần đúng rồi so sánh với nghiệm đúng . Từ đó ta có thể đưa ra nhận xét về sự phù hợp của phương pháp. Nhận xét rằng phương trình đã cho là phương trình vi phân cấp 4 tuyến tính không thuần nhất hệ số hằng. Ta có thể tìm được nghiệm tổng quát của phương trình thuần nhất tương ứng là: Để tìm nghiệm tổng quát của phương trình không thuần nhất đã cho, ta sử dụng phương pháp biến thiên hằng số, nghĩa là coi các hắng số tùy ý là các hàm số. Ta tìm để cho nghiệm tìm được ở trên là một nghiệm của phương trình không thuần nhất. Sau khi tính các đạo hàm và thay vào phương trình đã cho, ta sẽ chọn các hệ số thỏa mãn hệ phương trình sau: trong đó: Giải ra ta có: Do là hàm chưa biết (cần tìm) nên các hệ số chưa xác định được Như vậy dựa vào dạng của nghiệm tìm được ở trên ta có thể chọn: và coi là nghiệm đúng của phương trình không thuần nhất. Sau khi tính các đạo hàm và thay vào phương trình đã cho, ta được: Bây giờ đã biết . Ta cần giải bài toán sau: Với các điều kiện biên: Chọn , nghĩa là chia đoạn làm 10 phần bằng nhau bởi các điểm chia: Dựa vào phương pháp sai phân đã nêu ở phần lý thuyết, ta đưa về hệ năm đường chéo sau đây để tính nghiệm gần đúng của phương trình vi phân đã cho trong đó: Giải ra ta được các , đồng thời so sánh với các nghiệm đúng cho trong bảng sau: Nghiệm gần đúng Nghiệm đúng 0 0 -0.9998 -1 1 0.025 -1.2589 -1.2588 2 0.05 -1.5362 -1.5361 3 0.075 -1.8327 -1.8326 4 0.1 -2.1493 -2.1494 5 0.125 -2.4871 -2.4873 6 0.15 -2.8470 -2.8474 7 0.175 -3.2303 -3.2307 8 0.2 -3.6380 -3.6384 9 0.225 -4.0714 -4.0716 10 0.25 -4.5317 -4.5316 Sai số đạt: Thí dụ 2. Giải gần đúng phương trình vi phân sau: ở đây: Do ta không thể tìm được dạng nghiệm tổng quát của phương trình đã cho nên ta phải lấy tùy ý và coi là nghiệm đúng của phương trình. Giả sử ta có dạng như sau: (Coi là nghiệm đúng) Sau khi tính các đạo hàm và thay vào phương trình đã cho, ta được: Tương tự như ở thí dụ 1, bây giờ đã biết các hàm ta dùng phương pháp sai phân để tìm nghiệm gần đúng của phương trình. Với các điều kiện biên: Ta chọn , tức là chia đoạn làm 25 phần bằng nhau bởi các điểm chia Như vậy ta có bài toán sai phân tương ứng với bài toán vi phân đã cho là: Tính các hệ số rồi thay vào hệ trên và giải ra được các nghiệm gần đúng đồng thời so sánh với các nghiệm đúng ta được bảng kết quả sau: 0 0 0.9998 1 1 0.02 1.0004 1.0006 2 0.04 1.0024 1.0025 3 0.06 1.0056 1.0058 4 0.08 1.0103 1.0105 5 0.1 1.0166 1.0167 6 0.12 1.0245 1.0246 7 0.14 1.034 1.0342 8 0.16 1.0454 1.0456 9 0.18 1.0587 1.0589 10 0.2 1.0741 1.0742 11 0.22 1.0915 1.0917 12 0.24 1.1111 1.1114 13 0.26 1.1331 1.1333 14 0.28 1.1575 1.1578 15 0.3 1.1845 1.1847 16 0.32 1.2141 1.2144 17 0.34 1.2466 1.2468 18 0.36 1.2819 1.2822 19 0.38 1.3203 1.3205 20 0.4 1.3618 1.3621 21 0.42 1.4067 1.4069 22 0.44 1.455 1.4552 23 0.46 1.5069 1.5071 24 0.48 1.5625 1.5627 25 0.5 1.6220 1.6221 Sai số đạt: Chú ý 1. Runge xem: (tồn tại nhưng chưa biết). Tính sai số: Chú ý 2. Xét bài toán Giả sử khi tính không được các giá trị đúng của mà chỉ được với ( là hai số dương bé) Khi đó thay cho bài toán ban đầu, ta có là bài toán mà vế phải và bị nhiễu một chút. Bài toán sai phân đối với sai số (tính toán): áp dụng bất đẳng thức ổn định Phụ lục Chương trình minh họa phương pháp sai phân giải gần đúng phương trình vi phân cấp bốn (Sử dụng ngôn ngữ Visual Basic) Tập tin PPSP.BAS Public a As Double Public b As Double Public N As Integer '---------------------------------------- ' Nhap ham p(x) '---------------------------------------- Public Function p(X As Double) As Double Dim a As Double Dim b As Double Dim c As Double a = Val(frmBTVP.txtAp.Text) b = Val(frmBTVP.txtBp.Text) c = Val(frmBTVP.txtCp.Text) p = a * X * X + b * X + c End Function '---------------------------------------- ' Nhap ham q(x) '---------------------------------------- Public Function q(X As Double) As Double Dim a As Double Dim b As Double Dim c As Double a = Val(frmBTVP.txtAq.Text) b = Val(frmBTVP.txtBq.Text) c = Val(frmBTVP.txtCq.Text) q = a * X * X + b * X + c End Function '---------------------------------------- ' Nhap ham g(x) '---------------------------------------- Public Function g(X As Double) As Double Dim a As Double Dim b As Double Dim c As Double a = Val(frmBTVP.txtAg.Text) b = Val(frmBTVP.txtBg.Text) c = Val(frmBTVP.txtCg.Text) g = a * X * X + b * X + c End Function '---------------------------------------- ' Nhap ham f(x) '---------------------------------------- Public Function f(X As Double) As Double Dim a As Double Dim b As Double Dim c As Double a = Val(frmBTVP.txtAf.Text) b = Val(frmBTVP.txtBf.Text) c = Val(frmBTVP.txtCf.Text) f = a * X * X + b * X + c End Function '----------------------------------------------------------------------- ' Phuong phap truy duoi tu phai giai he 5 duong cheo '----------------------------------------------------------------------- Public Sub TDP(Y() As Double, N As Integer) ReDim hsa(0 To N) As Double ReDim hsb(0 To N) As Double ReDim hsc(0 To N) As Double ReDim hsd(0 To N) As Double ReDim hse(0 To N) As Double ReDim fvp(0 To N) As Double ReDim Alpha(1 To N) As Double ReDim Beta(1 To N) As Double ReDim Gama(1 To N + 1) As Double ReDim Delta(1 To N) As Double Dim i As Integer Call Tinh_HS(hsa(), hsb(), hsc(), hsd(), hse(), fvp(),N) '1------ Tinh cac he so Alpha, Beta, Gama ------' Alpha(1) = hsd(0) / hsc(0) Delta(1) = hsc(1) - hsb(1) * Alpha(1) Beta(1) = hse(0) / hsc(0) Alpha(2) = (hsd(1) - Beta(1) * hsb(1)) / Delta(1) Beta(2) = hse(1) / Delta(1) Gama(1) = fvp(0) / hsc(0) Gama(2) = (fvp(1) + hsb(1) * Gama(1)) / Delta(1) For i = 2 To N - 2 Step 1 Delta(i) = hsc(i) - hsa(i) * Beta(i - 1) + Alpha(i) * (hsa(i) * Alpha(i - 1) - hsb(i)) Alpha(i + 1) = (hsd(i) + Beta(i) * (hsa(i) * Alpha(i - 1) - hsb(i))) / Delta(i) Beta(i + 1) = hse(i) / Delta(i) Gama(i + 1) = (fvp(i) - hsa(i) * Gama(i - 1) - Gama(i) * (hsa(i) * Alpha(i - 1) - hsb(i))) / Delta(i) Next i Delta(N - 1) = hsc(N - 1) - hsa(N - 1) * Beta(N - 2) + Alpha(N - 1) * (hsa(N - 1) * Alpha(N - 2) - hsb(N - 1)) Alpha(N) = (hsd(N - 1) + Beta(N - 1) * (hsa(N - 1) * Alpha(N - 2) - hsb(N - 1))) / Delta(N - 1) Gama(N) = (fvp(N - 1) - hsa(N - 1) * Gama(N - 2) - Gama(N - 1) * (hsa(N - 1) * Alpha(N - 2) - hsb(N - 1))) / Delta(N - 1) Delta(N) = hsc(N) - hsa(N) * Beta(N - 1) + Alpha(N) * (hsa(N) * Alpha(N - 1) - hsb(N)) Gama(N + 1) = (fvp(N) - hsa(N) * Gama(N - 1) - Gama(N) * (hsa(N) * Alpha(N - 1) - hsb(N))) / Delta(N) '2------ Tinh nghiem theo phuong phap truy duoi tu phai ------' Y(N) = Gama(N + 1) Y(N - 1) = Alpha(N) * Y(N) + Gama(N) For i = N - 2 To 0 Step -1 Y(i) = Alpha(i + 1) * Y(i + 1) - Beta(i + 1) * Y(i + 2) + Gama(i + 1) Next i End Sub '---------------------------------------------------------------- ' Phuong phap truy duoi tu trai giai he 5 duong cheo '---------------------------------------------------------------- Public Sub TDT(Y() As Double, N As Integer) ReDim hsa(0 To N) As Double ReDim hsb(0 To N) As Double ReDim hsc(0 To N) As Double ReDim hsd(0 To N) As Double ReDim hse(0 To N) As Double ReDim fvp(0 To N) As Double ReDim Delta(1 To N) As Double ReDim Gsi(1 To N) As Double ReDim Deta(1 To N) As Double ReDim T0(0 To N) As Double Dim i As Integer Call Tinh_HS(hsa(), hsb(), hsc(), hsd(), hse(), fvp(), N) '1---------- Tinh cac he so Gsi, Deta, T0 ----------' Gsi(N) = hsb(N) / hsc(N) Deta(N) = hsa(N) / hsc(N) T0(N) = fvp(N) / hsc(N) Delta(N) = hsc(N - 1) - hsd(N - 1) * Gsi(N) Gsi(N - 1) = (hsb(N - 1) - hsd(N - 1) * Deta(N)) / Delta(N) Deta(N - 1) = hsa(N - 1) / Delta(N) T0(N - 1) = (fvp(N - 1) + hsd(N - 1) * T0(N)) / Delta(N) For i = N - 2 To 1 Step -1 Delta(i + 1) = hsc(i) - hse(i) * Deta(i + 2) + Gsi(i + 1) * (hse(i) * Gsi(i + 2) - hsd(i)) Gsi(i) = (hsb(i) + Deta(i + 1) * (hse(i) * Gsi(i + 2) - hsd(i))) / Delta(i + 1) Deta(i) = hsa(i) / Delta(i + 1) T0(i) = (fvp(i) - hse(i) * T0(i + 2) - T0(i + 1) * (hse(i) * Gsi(i + 2) - hsd(i))) / Delta(i + 1) Next i Delta(1) = hsc(0) - hse(0) * Deta(2) + Gsi(1) * (hse(0) * Gsi(2) - hsd(0)) T0(0) = (fvp(0) - hse(0) * T0(2) - T0(1) * (hse(0) * Gsi(2) - hsd(0))) / Delta(1) '2---------- Tinh nghiem theo cong thuc truy duoi tu trai ----------' Y(0) = T0(0) Y(1) = Gsi(1) * Y(0) + T0(1) For i = 2 To N Step 1 Y(i) = Gsi(i) * Y(i - 1) - Deta(i) * Y(i - 2) + T0(i) Next i End Sub '----------------------------------------------------------------- ' Phuong phap truy duoi ket hop giai he 5 duong cheo '----------------------------------------------------------------- Public Sub TDKH(Y() As Double, N As Integer) ReDim U(0 To N) As Double ReDim V(0 To N) As Double Dim i As Integer Call TDT(U(), N) Call TDP(V(), N) For i = 0 To N Step 1 Y(i) = (U(i) + V(i)) / 2 Next i End Sub Public Sub Tinh_HS(hsa() As Double, hsb() As Double, hsc() As Double, hsd() As Double, hse() As Double, fvp() As Double, N As Integer) Dim h As Double Dim i As Integer ReDim X(0 To N) As Double X(0) = a h = (b - a) / N For i = 1 To N Step 1 X(i) = X(i - 1) + h Next i hsa(0) = 0: hsa(1) = 0 hsa(N - 1) = 0: hsa(N) = 0 hsb(0) = 0: hsb(1) = 3 hsb(N - 1) = 1: hsb(N) = 0 hsc(0) = 1: hsc(1) = 4 hsc(N - 1) = 4: hsc(N) = 1 hsd(0) = 0: hsd(1) = 1 hsd(N - 1) = 3: hsd(N) = 0 hse(0) = 0: hse(1) = 0 hse(N - 1) = 0: hse(N) = 0 fvp(0) = Val(frmBTVP.txtYa.Text): fvp(1) = 2 * h * Val(frmBTVP.txtYpa.Text) fvp(N - 1) = -2 * h * Val(frmBTVP.txtYpb.Text): fvp(N) = Val(frmBTVP.txtYb.Text) For i = 2 To N - 2 Step 1 hsa(i) = p(X(i - 1)) hsb(i) = 2 * p(X(i)) + 2 * p(X(i - 1)) - h * h * q(X(i) - h / 2) hsc(i) = p(X(i + 1)) + 4 * p(X(i)) + p(X(i - 1)) - h * h * (q(X(i) + h / 2) + q(X(i) - h / 2)) + h*h*h*h* g(X(i)) hsd(i) = 2 * p(X(i + 1)) + 2 * p(X(i)) - h * h * q(X(i) + h / 2) hse(i) = p(X(i + 1)) fvp(i) =h*h* h * h * f(X(i)) Next i End Sub '---------------------------------------------------------- 'Phuong phap lap co dan giai he 5 duong cheo '---------------------------------------------------------- Public Sub LCD(V() As Double, N As Integer) Dim i As Integer ReDim hsa(0 To N) As Double ReDim hsb(0 To N) As Double ReDim hsc(0 To N) As Double ReDim hsd(0 To N) As Double ReDim hse(0 To N) As Double ReDim fvp(0 To N) As Double ReDim Vt(0 To N) As Double Dim Ya As Double, Yb As Double Dim Ypa As Double, Ypb As Double Dim Delta As Double Dim max As Double Dim solan As Double Dim h As Double Call Tinh_HS(hsa(), hsb(), hsc(), hsd(), hse(), fvp(), N) Ya = Val(frmBTVP.txtYa.Text) Yb = Val(frmBTVP.txtYb.Text) Ypa = Val(frmBTVP.txtYpa.Text) Ypb = Val(frmBTVP.txtYpb.Text) '------ Cho xap xi dau V(i) buoc 0 ------' For i = 0 To N Step 1 Vt(i) = 0 Next i '------ Tinh V(i) buoc thu m theo cong thuc lap Seidel ------' If frmLCD.txtDelta "" Then Delta = Val(frmLCD.txtDelta.Text) Else Delta = 0.01 End If h = (b - a) / N w = 1.5 ' 1 < w < 2 solan = 1 Do V(0) = Ya V(2) = ((-hsa(2) + 0.75 * hsb(2)) * Ya + hsd(2) * Vt(3) - hse(2) * Vt(4) + fvp(2) + 0.5 * hsb(2) * h * Ypa) / (hsc(2) - 0.25 * hsb(2)) V(1) = 0.25 * (3 * Ya + V(2) + 2 * h * Ypa) V(2) = w * V(2) + (1 - w) * Vt(2) For i = 3 To N - 2 Step 1 V(i) = (-hsa(i) * V(i - 2) + hsb(i) * V(i - 1) + hsd(i) * Vt(i + 1) - hse(i) * Vt(i + 2) + fvp(i)) / hsc(i) V(i) = w * V(i) + (1 - w) * Vt(i) Next i V(N) = Yb V(N - 1) = 0.25 * (V(N - 2) + 3 * V(N) - 2 * h * Ypb) max = Abs((V(1) - Vt(1)) / V(1)) For i = 2 To N - 1 Step 1 If Abs((V(i) - Vt(i)) / V(i)) > max Then max = Abs((V(i) - Vt(i)) / V(i)) Next i Call BangLap For i = 1 To N - 1 Step 1 frmLCD.grdLcd.TextMatrix(solan, i) = Round(V(i), 5) Next i solan = solan + 1 If solan >= frmLCD.grdLcd.Rows Then frmLCD.grdLcd.Rows = solan + 1 End If For i = 0 To N Step 1 Vt(i) = V(i) Next i Loop While max > Delta And solan < 100 End Sub Public Sub BangLap() Dim i As Integer frmLCD.grdLcd.Cols = N frmLCD.grdLcd.FormatString = " Buoc lap " For i = 1 To frmLCD.grdLcd.Rows - 1 Step 1 frmLCD.grdLcd.TextMatrix(i, 0) = Str$(i) Next i For i = 1 To N - 1 frmLCD.grdLcd.TextMatrix(0, i) = " V(" & Str$(i) & ")" Next i End Sub Public Sub HienBangLap() ReDim V(0 To N) As Double Dim M As Integer frmLCD.Show Call BangLap M = N Call LCD(V(), M) End Sub Public Function SaiSo() As Double ReDim V(0 To N) As Double ReDim W(0 To 2 * N) As Double Dim Error As Double Dim M As Integer Dim i As Integer M = N Call TDP(V(), M) Call TDP(W(), 2 * M) Error = Abs(V(0) - W(0)) For i = 1 To N Step 1 If Abs(V(i) - W(2 * i)) > Error Then Error = Abs(V(i) - W(2 * i)) End If Next i SaiSo = 4 * Error / 3 End Function Tập tin BTVP.frm Thiết kế giao diện Mã lệnh Private Sub Form_Load() frmBTVP.Height = 6710 frmBTVP.Width = 7530 frmBTVP.Left = (Screen.Width - frmBTVP.Width) / 2 frmBTVP.Top = (Screen.Height - frmBTVP.Height) / 2 mnuDel.Enabled = False mnuPopupDel.Enabled = False cmdSph.Enabled = False End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbRightButton Then PopupMenu mnuPopup, vbPopupMenuLeftAlign End If End Sub Private Sub cmdExit_Click() End End Sub Private Sub cmdSph_Click() frmBTVP.Hide frmBTSP.Show End Sub Private Sub Frame1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Call Form_MouseUp(Button, Shift, X, Y) End Sub Private Sub lblbt_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Call Form_MouseUp(Button, Shift, X, Y) End Sub Private Sub mnuAbout_Click() frmDATN.Show End Sub Private Sub mnuDel_Click() txtAp.Text = "": txtBp.Text = "": txtCp.Text = "" txtAq.Text = "": txtBq.Text = "": txtCq.Text = "" txtAg.Text = "": txtBg.Text = "": txtCg.Text = "" txtAf.Text = "": txtBf.Text = "": txtCf.Text = "" txtYa.Text = "": txtYb.Text = "" txtYpa.Text = "": txtYpb.Text = "" End Sub Private Sub mnuExit_Click() End End Sub Private Sub mnuInput_Click() Dim i As Integer Dim NextLine As String Dim S() As Double CommonDialog1.Filter = "Text f

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

  • docDAN310.doc
Tài liệu liên quan