2 Tổng quan về phương pháp khử Gauss giải hệ phương trình
2.1.2 Giải hệ tam giác trên máy tính với bộ nhớ phân tán
Bởi vì chỉ cần đòi hỏi O(n2) cho giải xuôi và giải ngược gồm O(n3) phép toán của phân rã LU, giải hệ tam giác có một sự hấp dẫn và ưu thế đặc biệt trên máy tính song song. Hơn nữa, thường xảy ra là cần đồng thời giải một số hệ với vế phải khác nhau, nên chỉ phải phân rã hệ ban đầu vào hệ tam giác một lần.
Rất nhiều thuật toán song song đã được xây dựng để giải hệ tam giác. Tuy nhiên, rất nhiều thuật toán trong số chúng đòi hỏi phải có O(n3) bộ sử lí. Điều này là không thực tế khi các máy hiện nay chỉ có khoảng một trăm đến một nghìn bộ sử lí. Dưới đây trình bày một thuật toán của Heath và Romine (xem, [6], trang 78).
Giả sử ta bắt đầu với một dãy thuật toán và giả sử Lx = b đã được giải, trong đó L là ma trận tam giác dưới. Có hai cách để tính nghiệm. Cách thứ nhất là phương pháp cổ điển, trong đó các tọa độ chính xác của nghiệm được tính lần lượt. for i=1..n for j=1:i-1 b(i)=b(i)-l(i,j)*x(j) end x(i)=b(i)/l(i,i) end
Thuật toán này được gọi là thuật toán tích vô hướng, vì phép toán cơ bản là tính tích vô hướng của dòng thứ i của L (ngoại trừ phần tử đường chéo với vectơ có các thành phần đã được tính từ trước.
Thuật toán thứ hai sử dụng sự kiện là sau khi một thành phần của vectơ
x(i) đã được tính, vế phải của phương trình có thể cải tiến thêm một lần nữa: for j=1..n x(j)=b(j)/l(j,j) for i=j+1:n b(i)=b(i)-l(i,j)*x(j) end
end
Ta gọi thuật toán này là Saxpy vì vòng lặp cơ bản ở đây là phép thay thế,
x(j) là một số. Nhận xét rằng điều này tương ứng với sự trao đổi hai vòng lặp của thuật toán. Có thể xem cơ chế vận hành tính toán song song trên từng bộ xử lí trong [6], p. 79.
2.2 Các phương pháp giải hệ phương trình có ma
trận hệ số thưa
Nghiên cứu ma trận thưa được quan tâm và phát triển mạnh mẽ trong vòng 50 năm trở lại đây. Trong chương trước ta đã nhắc đến một số dạng ma trận đặc biệt: ma trận đối xứng, ma trận xác định dương, ma trận đường chéo và ma trận tam giác (trên hoặc dưới). Tuy nhiên, ta chưa quan tâm đến lớp ma trận có cấu trúc thưa, tức là ma trận có nhiều phần tử bằng không. Khó có thể đưa ra một định nghĩa chính xác thế nào là ma trận thưa, thí dụ, cần phải có bao nhiêu phần tử 0, hoặc thậm chí ma trận phải có bao nhiêu phần trăm số phần tử 0 thì được gọi là thưa.
Đã có các kĩ thuật đặc biệt để lưu trữ các ma trận thưa và có các thuật toán làm cực tiểu bộ nhớ và các thuật toán đánh giá số các phép toán sử dụng trong khử Gauss cho ma trận thưa. Các thuật toán với ma trận thưa đã được song song hóa và đạt được kì tích khi giải được các hệ phương trình có đến hàng triệu biến vào năm 1996.
Có một số cuốn sách nói về ma trận thưa. Xem, thí dụ, [3], [4].
Một trong những hạn chế của các kĩ thuật thao tác với ma trận thưa là các thuật toán nói chung phức tạp (phức tạp hơn nhiều so với các thuật toán thông thường) và nhiều khi khó có thể tối ưu được.
Các loại ma trận thưa thường gặp trong tính toán thực tế đó là ma trận ba đường chéo, ma trận băng, ma trận chéo khối, và một số ma trận khác bởi có thêm một số phần tử khác không nằm ngoài quy luật.
Để giải hệ phương trình có ma trận hệ số thưa với các phương pháp như đã nêu ở chương I vẫn thích hợp song lại không tối ưu như: không tiết kiệm bộ nhớ, không tiết kiệm thời gian,....Vì vậy, ta xem xét một số phương pháp đặc thù được suy ra từ các phương pháp trên để giải hệ phương trình dạng
này.
Giả sử ta cần tìm nghiệm của phương trình vi phân thường bậc hai dạng:
y00+ p(x)y0+q(x)y = f(x) (2.1)
trên đoạn[a, b]với các điều kiện nào đó tại hai nút a và b bằng phương pháp sai phân.
Ta chia đoạn [a, b] thành n−1 đoạn nhỏ bằng nhau bởi các nút điểm:
x1 ≡ a; x2 = x1 + h; ...; xn ≡b;
h = b−a n−1
Ta kí hiệu y(xk) = yk. Tại các nút lưới ta sử dụng sơ đồ sai phân trung tâm bậc hai cho các đạo hàm bậc hai và bậc nhất của hàm y(x) như sau:
yk00 = yk+1 −2yk +yk−1
h2 ; yk0 = yk+1 −yk−1
2h (2.2)
Khi đó phương trình sai phân xấp xỉ của phương trình (2.1) tại điểm xk
(1< k < n) và các điều kiện biên tại hai điểm mút có dạng tổng quát:
akyk−1 +bkyk+ ckyk+1 = dk (2.3) trong đó: y1, y2, ..., yn, là các ẩn. Và ak, bk, ck, dk là các hệ số phụ thuộc vào
h, p(xk), q(xk), f(xk).
Khi đó (2.3) là hệ phương trình n ẩn với ma trận hệ số có dạng:
A = b1 c1 0 .. .. .. 0 a2 b2 c2 0 .. .. 0 0 a3 b3 c3 0 .. 0 .. .. .. .. .. .. .. 0 0 .. an−2 bn−2 cn−2 0 0 0 .. .. an−1 bn−1 cn−1 0 0 .. .. .. an bn ;d = d1 d2 d3 .. dn−2 dn−1 dn (2.4)
Ma trận hệ số A trong trường hợp này có dạng ma trận ba đường chéo.
2.2.1 Hệ ba đường chéo. Phương pháp Thomas
Phương pháp Thomas thực chất là phương pháp khử Gauss áp dụng cho ma trận ba đường chéo.Thuật toán của ma trận này gồm hai bước: bước thứ
nhất ta tính các hệ số truy hồi,bước thứ hai ta tính nghiệm của hệ bằng công thức truy hồi thông qua hệ số ở bước một.Cụ thể, phương pháp Thomas như sau:
Từ phương trình đầu tiên của hệ ta có:
b1y1 +c1y2 = d1
Suy ra:
y1 +p1y2 = q1; p1 = c1/b1, q1 = d1/b1 (i) Từ phương trình thứ hai và kết hợp phương trình (i) ta nhận được:
y2 +p2y3 = q2; p2 = c2/b2 −a2p1, q2 = d2 −a2q1/b2 −a2p1 (2i) Nói chung ở phương trình thứ k ta nhận được:
yk +pkyk+1 = qk (3i) với
pk = ck/(bk −akpk−1);qk = (dk −akqk−1)/(bk −akpk−1);k = 1, ..., n
Ở phương trình (3i) ứng với k = n cho ta giá trị yn = qn ( ở đây
qn = (dn −anqn−1)/(bn −anpn−1)
. Sau khi tính được yn dùng phương trình (3i) thế ngược trở lại để tính
yn−1, ..., y1.
Cũng giống như trong phương pháp Gauss, khi tính nghiệm của hệ phương trình trên trong thuật toán Thomas ta có phép chia cho phần tửpk−1 hoặc khi tính hệ sốpk, qk ta cũng có phép chia cho phần tử ((bk−akpk−1,k = 1, ..., n) ta thường dẫ tới sai số là làm tròn số làm cho bài toán bị sai số lớn. Vậy để thuật toán ổn định điều kiện đủ là:
|bk| > |ak|+|ck|, (k = 1, ..., n) (2.5) nghĩa là ma trận hệ số A là ma trận chéo trội.