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
84 trang |
Chia sẻ: huong.duong | Lượt xem: 1749 | Lượt tải: 1
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:
- DAN310.doc