Giải hệ phương trình tuyến tính bằng ngôn ngữ lập trình c

43 83 1
Giải hệ phương trình tuyến tính bằng ngôn ngữ lập trình c

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Hệ phương trình tuyến tính TRƯỜNG ĐẠI HỌC VINH KHOA TOÁN HỌC NGUYỄN THỊ BÍCH NGỌC GIẢI HỆ PHƯƠNG TRÌNH TUYẾN TÍNH BẰNG NGƠN NGỮ LẬP TRÌNH C KHĨA LUẬN TỐT NGHIỆP ĐẠI HỌC CHUYÊN NGÀNH TOÁN - TIN HỌC ỨNG DỤNG Vinh, tháng năm 2012 SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng Hệ phương trình tuyến tính TRƯỜNG ĐẠI HỌC VINH KHOA TỐN HỌC KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC GIẢI HỆ PHƯƠNG TRÌNH TUYẾN TÍNH BẰNG NGƠN NGỮ LẬP TRÌNH C Người hướng dẫn : ThS Nguyễn Thanh Diệu Người thực : Nguyễn Thị Bích Ngọc Lớp : 49B - Tốn - Tin học ứng dụng MSSV : 0851095183 Vinh, tháng năm 2012 SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng Hệ phương trình tuyến tính Mục lục Mở đầu Chương Giải hệ phương trình phương pháp Gauss 1.1 Ý tưởng 1.2 Nội dung phương pháp 1.3 Kiểm tra q trình tính nghiệm 1.4 Khối lượng tính 1.5 Thuật tốn, sơ đồ khối chương trình 10 Chương Phương pháp giải gần hệ phương trình 16 2.1 Khái niệm 16 2.2 Phương pháp lặp đơn 16 2.3 Phương pháp dây đen 25 2.4 Đưa hệ thống phương trình tuyến tính dạng thỏa mãn điều kiện hội tụ phương pháp lăp đơn phương pháp lặp dây đen 32 2.5 Phương pháp Gauss – Seidel 34 Kết luận 40 Tài liệu tham khảo 41 SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng Hệ phương trình tuyến tính MỞ ĐẦU Trong mơ hình kinh tế, y học, sinh hoc khoa học kỹ thuật thường dẫn đến toán giải hệ phương trình tuyến tính Đã có nhiều phương pháp giải hệ phương trình tuyến tinh, chẳng hạn phương pháp Gauss, Cramer, Choleky… Tuy nhiên, trường hợp số ẩn lớn việc tính tốn trở nên phức tạp Khi đó, việc giải hệ phương trình gặp phải khó khăn Khơng thế, hệ phương trình thường có từ thực nghiệm nên hệ số thường số gần Nên việc giải hệ phương trình trường hợp khơng khó thực mà cịn khơng có ý nghĩa thực tế Trong trường hợp đó, thay giải hệ phương trình người ta tìm cách giải gần hệ phương trình tuyến với sai số cho phép với việc tính tốn đơn giản Ngày nay, với phát triển cơng nghệ thơng tin, có nhiều ngơn ngữ lập trình hỗ trợ việc tính tốn kể đến ngơn ngữ lập trình như: Pascal, C, C++ , C# … Trên lý thuyết giải giải gần hệ phươngng trình ngơn ngữ lập trình quen thuộc, chúng tơi chọn đề tài nghiên cứu cho khóa luận “phương pháp giải hệ phương trình ngơn ngữ lập trình C” Mục đích khóa luận viết chương trình giải hệ phương trình ngơn ngữ C Ngồi phần mở đầu tài liệu tham khảo, Khóa luận chia làm hai chương Chương I Phương pháp giải hệ phương trình Nội dung chương nghiên cứu phương phap Gauss - phương pháp giải hệ phương trình có nghiệm cài đặt thuật tốn máy tính ngơn ngữ C Chương II Phương pháp giải gần hệ phương trình Nội dung chương nghiên cứu phương pháp giải gần hệ phương trình SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng Hệ phương trình tuyến tính như: phương pháp lặp đơn, phương pháp dây đen, phương pháp lặp Gauss – Seidel cài đặt thuật tốn phương pháp ngơn ngữ lập trình C Khóa luận thực trường Đại học Vinh, hướng dẫn ThS.Nguyễn Thanh Diệu Em xin bày tỏ lòng biết ơn sâu sắc tới Thầy nhiệt tình hướng dẫn dành cho em suốt q trình hình thành khóa luận Nhân dịp em xin trân trọng cảm ơn Ban chủ nhiệm khoa Tốn, thầy giáo khoa Tốn trường Đại học Vinh, gia đình bạn bè tạo điều kiện thuận lợi để em học tập hồn thành khóa luận Mặc dù có nhiều cố gắng, song khóa luận khơng tránh khỏi thiếu sót Em mong nhận ý kiến đóng góp thầy, cô giáo bạn đọc để khóa luận hồn thiện Sinh viên Nguyễn Thị Bích Ngọc SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng Hệ phương trình tuyến tính CHƯƠNG I GIẢI ĐÚNG HỆ PHƯƠNG TRÌNH PHƯƠNG PHÁP GAUSS 1.1 Ý tưởng phương pháp - Phương pháp trực tiếp ( phương pháp Gauss) phương pháp cho ta nghiệm hệ phương trình sau số hữu hạn phép tính sơ cấp (với giả thiết khơng sai có sai số làm tròn) - Phương pháp Gauss phương pháp phổ biến để giải hệ phương trình Khi ma trận hệ số khơng có đặc biệt (A khơng suy biến) Người ta thường dùng phương pháp ma trận hệ số “đầy” Cho hệ phương trình:  a11 x1  a12 x   a1n x n  a1,n 1 a x  a x   a x  a  21 22 2n n , n 1   a n1 x1  a n x   a nn x n  a n ,n 1 (1.1) 1.1.1 Bước thuận Dùng phép biến đổi tương đương đưa hệ (1.1) dạng tam giác sau:  x1  b12( 0) x  b13( 0) x3   b1(n0) x n  b1(,0n)1  (1) x  b23 x3   b2(1n) x n  b2(1,n) 1     x n  bn ,n 1  (1.2) 1.1.2 Bước ngược Tìm từ hệ (1.2) x n , x n 1 , , x Các cơng thức tính tốn:  a1( kj )  a1( kj 1)  a1(kk 1) bkj( k 1) SVTH:Nguyễn Thị Bích Ngọc ( 1, j  k ) Lớp:49B-Toán tin ứng dụng Hệ phương trình tuyến tính  ( k 1) kj b  a kj( k 1) ( j  k ) a kk( k 1) Chú ý: Điều kiện để thực phương pháp Gauss để giải hệ phương trình đại số tuyến tính là: akk( k 1)  ( 0)  a11 k  1, n a11 1.2 Nội dung phương pháp Để đơn giản ta thực giải hệ phương trình phương pháp Gauss với n=4 Ta có hệ phương trình: (0) (0) a11 x1  a12 x2  (0) (0) a 21 x1  a 22 x  (0) (0) a31 x1  a32 x (0) (0) a 41 x1  a 42 x2 ( 0) (0) (0)  a13 x3  a14 x  a15 ( 0) (0) (0)  a 23 x3  a 24 x  a 25 ( 0) (0) (0)  a33 x3  a34 x  a35 ( 0) (0) (0)  a 43 x3  a 44 x  a 45 (1.3) 1.2.1 Bước thuận - Giả sử a 11  Chia vế phương trình đầu hệ phương trình (1.3) cho a 11 ta phương trình: x1  b12(0) x2  b13(0) x3  b14(0) x4  b15(0) Với b1( 0j )  a1 j a11 (1.4) - Dùng phương trình (1.4) để khử x từ phương trình cịn lại ( trừ phương trình đầu) hệ phương trình (1.3) ta được: (1) (1) (1) (1) a 22 x  a 23 x3  a 24 x  a 25  (1) (1) (1) (1) a32 x  a33 x3  a34 x  a35 a (1) x  a (1) x  a (1) x  a (1) 43 44 45  42 Trong a1(1j)  a1 j  ai1b1(0j ) (1.3’) ( i, j  ) - Chia vế phương trình hệ (1.3’) cho a (221) ta : (1) (1) (1) x2  b23 x3  b24 x4  b25 SVTH:Nguyễn Thị Bích Ngọc (1.5) Lớp:49B-Tốn tin ứng dụng Hệ phương trình tuyến tính Trong (1) 2i b a 2(1i)  (1) a 22 - Dùng phương trình (1.5) để khử x từ phương trình cịn lại ( trừ phương trình đầu) hệ (1.3’) ta được: ( 2) ( 2) ( 2) a33 x3  a34 x  a35  ( 2) ( 2) ( 2) a 43 x3  a 44 x  a 45 Trong (1.3”) a1( 2j )  a1(1j)  ai(21) b2(1j) ( 2) - Chia phương trình đầu hệ (1.3”) cho a 33 ta phương trình: ( 2) ( 2) x3  b34 x4  b35 Trong b3 j  a3( 2j ) ( 2) a33 (1.6) - Dùng phương trình (1.6) để khử x khỏi phương trình cịn lại ( trừ phương trình đầu) hệ (1.3”) ta được: (1.3”’) ( 3) ( 3) a44 x4  a45 Trong ( 2) ( 2) a1(3j )  a1( 2j )  a13 b3 j - Từ (1.3”’) ta tìm : x4  ( 3) a 45 ( 3)  b45 ( 3) a 44 1.2.2 Bước ngược Ta tính lần lượt: ( 2) ( 2) x3  b35  b34 x4 (1) (1) (1) x2  b25  b24 x4  b23 x3 x1  b15(0)  b14(0) x4  b13(0) x3  b12(0) x2 1.3 Kiểm tra trình tính nghiệm Để kiểm tra q trình tính ta dùng tổng kiểm tra SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng Hệ phương trình tuyến tính ai(60)   aij( 0) , i  1,4 (1.7) i 1 vế phải hệ thống phương trình (1.3) xét hệ phương trình: a j 1 ( 0) ij x j  ai(60) , i  1,4  x j  x j 1, j  1,4 (1.8) (1.9) Thật vậy: Thay (1.9) vào (1.8) (1.3) ta nhận được: 4 j 1 j 1  aij(0) x j ( x j  1)   aij(0) x j   aij(0)  j 1 j 1 j 1  ai(50)   aij( 0)   aij( 0)  ai(60) Vì phần tử cột tổng ta thực phép tính giống phần tử cột bên trái cột tổng nằm hàng phân tử cột tổng, nên khơng có sai số tính tốn phần tử cột tổng phải tổng phần tử a bên trái tổng Hiện tượng dùng để kiểm tra trình thuận Quá trình ngược kiểm tra hệ thức (1.9) X1 x2 x3 x4 a 11( ) a (210 ) (0) a 31 a (410 ) a 12( ) a (220 ) (0) a 32 a (420 ) a 14( ) a (240 ) (0) a 34 a (440 ) a 12(1) a (221) (1) a 32 a (421) a 13( ) a (230 ) (0) a 33 a (430 ) a 13(1) a (231) (1) a 33 a (431) a 14(1) a (241) (1) a 34 a (441) Hệ số tự a 15( ) a (250 ) (0) a 35 a (450 ) a 15(1) a (251) (1) a 35 a (451) a (232 ) a (242 ) a (252 ) SVTH:Nguyễn Thị Bích Ngọc Tổng Quá trình a 16( ) a (260 ) (0) a 36 a (460 ) a 16(1) a (261) (1) a 36 a (461) Quá a (262 ) Trình Thuận Lớp:49B-Tốn tin ứng dụng Hệ phương trình tuyến tính ( 2) a 33 a (432 ) ( 2) a 34 a (442 ) ( 3) a 34 a (443) 1 1 ( 2) a 35 a (452 ) ( 3) a 35 a (453) a (454 ) x4 x3 x2 x1 ( 2) a 36 a (462 ) ( 3) a 36 a (463) a (464 ) x4 x3 x2 x1 Quá Trình Nghịch *Nhận xét: Sơ đồ Gauss giải hệ phương trình n ẩn (n > 4) Nếu ma trận hệ số A phương trình xuất phát đối xứng, tức a ij = a ji vào công thức (1.4), (1.5) (1.6) ta thấy a ij(1) = a (ji1) , a ij( ) = a (ji2 ) nghĩa ma trận: A(1) 1)  a (22  (1) =  a32  a (1)  42 (1) a 23 (1) a33 (1) a 43 (1)  a 24  (1) a34  (1)  a 44   a ( 2) a ( 2)  A(2) =  33( 2) 34( 2)   a 43 a 44  hai ma trận đối xứng Do phương trình Gauss ta cần tính a ij(1) a ij( ) suy a (ji1) a (ji2 ) 1.4 Khối lượng tính 1.4.1 Hệ phương trình tổng quát Xét hệ phương trình n ẩn Ta cần thực số phép toán + Phép nhân n(n  1)(2n  5) + Phép chia n(n  1) SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng 10 Hệ phương trình tuyến tính 2.3.3 Sự hội tụ phương pháp Do phương pháp dây đen biến dạng phương pháp lặp đơn nên điều kiện hội tụ phương pháp dây đen hoàn toàn giống với phương pháp lặp đơn hay là: Với  p 1 X  X k p   X k  X k 1 p 1  p p    r X  Xk Và X1  X p 1  p p p   r 1 Nếu chọn X0 =  X  X k  p  p p 1  p 2.3.4 Đánh giá sai số nghiệm gần Để đánh giá độ lệch nghiệm gần Xk nhận phương pháp lặp dây đen nghiệm x* hệ phương trình (2.2) người ta sử dụng công thức sau: Đối với  : - Xk  X * Trong     = max i 1  X k  X k 1 qi  qi i 1 pi = a j 1  (2.9) i=1, n n ij ; qi = a j 1 ij ; p1 = Và Xk  X - *  k X1  X  1   (2.10) Đối với : Xk  X *   (1  s)(1   ) X k  X k 1 SVTH:Nguyễn Thị Bích Ngọc (2.11) Lớp:49B-Tốn tin ứng dụng 29 Hệ phương trình tuyến tính Trong đó: n a s = max j i  j 1 j tj = ij ;  = max  aij ; sj = i 1 j tj (i=1, n ) 1 s j n  aij ; sn = 0; tn = i  j 1 n a i 1 in Xk  X *   (1  s)(1   ) X1  X (2.12) Nhận xét: - Khi tính X(k+1) phương pháp lặp dây đen (công thức (2.8)), ta không dùng x 1( k ) , x (2k ) , …, x i( k1) mà dùng x 1( k 1) , x (2k 1) , …, x i(k11) vừa tính - Sau tính xong x i( k 1) ta không cần giữ lại x ik đặt x i( k 1) vào nhớ x ik - Phương pháp lặp dây đen có ưu điểm phương pháp lặp đơn n lớn 2.3.5 Thuật tốn chương trình 2.3.5.1 Thuật toán Input : Ma trận A cấp n *n, ma trận B cấp n*1 Output : Hệ nghiệm X = (xi)n*1 Quá trình thực hiện: - Nhập ma trận A = (aij)n*n, ma trận B=(bi)n*1 - Lặp i = đến n - Gán si = ai1, tong1 = 0, tong2 = - Lặp i = đến n - Lặp j = đến n - si = si + aij - Nếu max|si| < - xi = bi - Lặp i = đến n SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng 30 Hệ phương trình tuyến tính - Lặp j = đến i – - tong1 + = aij * xj - Lặp i = đến n - Lặp j = i đến n - tong2 + = aij * xj - Lặp i = đến n - Lặp j = đến n - xi = tong1 + tong2 + bi - In nghiệm (xi)n*1 - End 2.3.5.2 Chương trình #include #include #include #include float abs(float d) { if(d > 0) return 1; else return -1; } float max(float a[10]) { int i, j, n; float max = a[0]; for(i = 0; i < n-1; i + +) SVTH:Nguyễn Thị Bích Ngọc Lớp:49B-Tốn tin ứng dụng 31 Hệ phương trình tuyến tính { if(a[i] > max) max = a[i]; } return max; } int main() { int i, j, n; float a[10][10], b[10], s[10], x[10]; float tong1 = 0, tong2 = 0; char tt; while (1) { printf("\n nhap n = "); scanf("%d", &n); printf("\nnhap he so cua phuong trinh :\n"); for( i = 1; i

Ngày đăng: 16/09/2021, 17:32

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan