Bài giảng Phương pháp số - Chương 2: Các phương pháp số trong đại số tuyến tính - Phan Thị Hà
MỤC ĐÍCH, YÊU CẦU:
Sau khi nghiên cứu chương 1, yêu cầu sinh viên:
1. Hiểu và nắm được các phương pháp tìm nghiệm đúng, nghiệm xấp xỉ của hệ phương
trình tuyến tính.
2. Biết cách ứng dụng các phương pháp trên vào việc tính định thức của ma trận, tìm ma
trận nghịch đảo, giải quyết các bài toán thực tế.
3. Biết cách đánh giá sai số của từng phương pháp
(1) Giá trị x1(1) được tính qua các giá trị x2(0), x3(0), ... xn(0) 34 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 2: Các phương pháp số trong đại số tuyến tính Giá trị x2(1) được tính qua các giá trị x1(1), x3(0), ... xn(0) Giá trị x3(1) được tính qua các giá trị x1(1), x2(1),x4(0), ... xn(0) . . . (h) Giá trị x1(h) được tính qua các giá trị x2(h-1), x3(h-1), ... xn(h-1) Giá trị x2(h) được tính qua các giá trị x1(h), x3(h-1), ... xn(h-1) Giá trị x3(h) được tính qua các giá trị x1(h), x2(h),x4(h-1), ... xn(h-1) . . . Với vec tơ x(0) cho trước bất kỳ, ví dụ x(0) = θ (vec tơ 0) ta có thể tính các vec tơ x(k) tại bước lặp k bằng công thức xi(k) = iia 1 (bi -( a∑− − 1 1 i j ijxj(k) +∑ +− n ij 1 aijxj(k-1))) (2.11) i = 1, 2, . . ., n, k = 1,2,... Trong công thức (2.11) chúng ta có thể không dùng chỉ số trên để chỉ ra rằng chúng ta chỉ dùng một mảng là vec tơ có n thành phần để lưu trữ nghiệm. Giá trị nào vừa được tính toán thì được lưu trữ ngay vào vị trí cũ và được dùng ngay trong công thức tính các giá trị khác. xi = iia 1 (bi - a∑ ≠− n ijj ,1 ij xj) i = 1, 2, . . ., n, k = 1,2,... Sự hội tụ của phương pháp Gause-Seidel Điều kiện hội tụ của phương pháp lặp Gause- Seidel cũng giống với phương pháp lặp đơn. Như ta sẽ thấy trong ví dụ trong phần sau, phương pháp Gause- Seidel nói chung hội tụ nhanh hơn phương pháp lặp đơn. Ta có thể sử dụng các công thức sau để đánh giá sai số của phương pháp lặp Gause-Seidel: Gọi x* là nghiệm đúng của hệ phương trình và gọi pi = ∑ |c− = 1 1 i j ij|, qi = ∑ |c = n ij ij| , μ = i max i i p q −1 Khi đó ta có ||x(k) - x*|| ≤ μ μ −1 ||x (k) - x(k-1)|| (2.12) hoặc ||x(k) - x*|| ≤ μ μ −1 k ||x(1) - x(0)|| (2.13) Ví dụ. Dùng phương pháp lặp Gause-Seidel tìm nghiệm gần đúng của hệ phương trình: 4x1 + 0.24x2 - 0.08x3 = 8 0.09x1 + 3x2 - 0.15x3 = 9 0.04x1 - 0.08x2 + 4x3 = 20 35 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 2: Các phương pháp số trong đại số tuyến tính Giải. (1).Có thể thấy rằng ma trận các hệ số của hệ phương trình trên đây thỏa mãn tính chéo trội, do đó ta có thể biến đổi hệ này để áp dụng phương pháp lặp Jacobi. Chia hai vế phương trình đầu tiên cho 4, hai vế phương trình thứ hai cho 3 và hai vế của phương trình thứ ba cho 4 rồi biến đổi thích hợp ta nhận được: x1 = 2 - 0.06x2 +0.02x3 x2 = 3 - 0.03x1 + 0.05x3 x3 = 5 - 0.01x1 + 0.02x2 hay ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎝ ⎛ 3 2 1 x x x = + = Cx + d ⎥⎥ ⎥ ⎦ ⎤ ⎢⎢ ⎢ ⎣ ⎡ − − − 002.001.0 05.0003.0 02.006.00 ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎝ ⎛ 3 2 1 x x x ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎝ ⎛ 5 3 2 ||C||∞ = max(0 + 0.06 + 0.02, 0.03 + 0 + 0.05, 0.01 + 0.02 + 0) = = max(0.08,0.08,0.03) = 0.08 <1 (2) Chọn x(0) = (2,3,5)T, rồi tính x(1), x(2),... theo công thức (2.11) với lưu ý aii =1 ta được bảng kết quả sau: k x1(k) x2(k) x3(k) 0 1 2 3 2 1.92 1.9093489 1.909199 3 3.1924 3.194952 3.1949643 5 5.044648 5.0448056 5.0448073 Xem x(3) là nghiệm gần đúng cần tìm, ta có thể đánh giá sai số phạm phải của x(3) theo(2.12): ||x(k) - x*|| ≤ μ μ −1 ||x (k) - x(k-1)|| Trong đó: ||x(3) - x(2)||∞ = |x i max i(3) - xi(2)| = max(0.0001499,0.000123,0.0000017) = 0.0001499 μ = i max i i p q −1 = max(0.08,0.0515463,0) = 0.08 Như vậy ||x(3) - x*||∞ ≤ μ μ −1 ||x (k) - x(k-1)|| ≤ 08.01 08.0 − 0.00001499 ≈ 0.000013 Thuật toán Jacobi cũng tương tự như thuật toán Gauss-Seidel, nhưng thuật toán Gauss - Seidel có tốc độ hội tụ nhanh hơn. 36 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 2: Các phương pháp số trong đại số tuyến tính Chương trình minh họa. Sau đây là đoạn chương trình chính thể hiện (mô tả) thuật toán lặp Gauss - Seidel /*Giai he phuong trinh tuyen tinh dung lap Gauss-Seidel, ma tran vuong n, cac phan tu cot thu n+1 la vecto b*/ //=============================================== double kcach(double *x,double *y,int n) {double tmp=0; for(int i=1;i<=n;i++) tmp=tmp+fabs(x[i]-y[i]); return tmp; } //=============================================== int cheotroi(kmatran a, int n) {double tmp;int i,j; for(i=1;i<=n;i++) {tmp=0; for(j=1;j<=n;j++) {if(j!=i) tmp=tmp+fabs(a[i][j]);} if(fabs(a[i][i])<=tmp) return false; } return true; } //=============================================== /*Giai he phuong trinh tuyen tinh bang phep lap Gauss-Seidel. Tra ve true neu co nghiem */ int gseidel(kmatran aa,double *x,int n) {int h,i,j,k;double tmp;kvecto z;kmatran a; int n1=n+1; for(i=1;i<=n;i++) for(j=1;j<=n1;j++) a[i][j]=aa[i][j]; if(!cheotroi(a,n)) {cout<<endl<<"Khong phai cheo troi";delay(1000);return false;} for(i=1;i<=n;i++) //chuyen ve dang he so a[i][i] == 1 {tmp=a[i][i]; for(j=1;j<=n1;j++) a[i][j] = a[i][j]/tmp; } //Vong lap cac buoc khu 37 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 2: Các phương pháp số trong đại số tuyến tính for(i=1;i<=n;i++) {x[i]=0;z[i]=0;} k=1; while(true) {for(i=1;i<=n;i++) {tmp=0; for(j=1;j<=n;j++) if(j!=i) tmp+=a[i][j]*x[j]; x[i] = a[i][n+1]-tmp; } k++; if(kcach(x,z,n)<epsi) break; if(k>kmax) {cout<<endl<<"Phep lap chua hoi tu";delay(1000);return(false);} //Gan z = x va chuan bi sang vong lap tinh x for(i=1;i<=n;i++) z[i]=x[i]; } //Thu lai kvecto bb; for(i=1;i<=n;i++) {bb[i]=aa[i][1]*x[1]; for(j=2;j<=n;j++) bb[i]+=aa[i][j]*x[j]; } //Dua ket qua vao tep ketqua return true; ) 2.3. BÀI TẬP Bài 1. Tính và kiểm tra bằng chương trình định thức của ma trận A = ⎥⎥ ⎥ ⎦ ⎤ ⎢⎢ ⎢ ⎣ ⎡ 1167 642 131 Bài 2. Tìm và kiểm tra bằng chương trình nghịch đảo của ma trận A = ⎥⎥ ⎥ ⎦ ⎤ ⎢⎢ ⎢ ⎣ ⎡ −− 203 121 132 38 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 2: Các phương pháp số trong đại số tuyến tính Bài 3. Tìm nghiệm hệ phương trình 2x1 + 3x2 +x3 = 11 -x1 + 2x2 - x3 = 0 3x1 +2x3 = 9 Bằng phương pháp khử Gauss và Jordan. Kiểm tra bằng chương trình. Bài 4. Giải bằng các phương pháp khử Gauss, khử Gauss-Jordan, phương lặp Jacobi và lặp Gauss-Seidel (nếu thỏa mãn điều kiện) hệ phương trình sau: A = = ⎥⎥ ⎥⎥ ⎦ ⎤ ⎢⎢ ⎢⎢ ⎣ ⎡ − − − 104753 .19112356 28371612 50136517 ⎟⎟ ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜ ⎝ ⎛ 4 3 2 1 x x x x ⎟⎟ ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜ ⎝ ⎛ 18 36 25 84 Kiểm tra trên máy tính và thông báo về khả năng giải được hay không các phương pháp trên. Bài 5. Giải bằng các phương pháp lặp hệ phương trình sau: 10x1 + 2x2 + x3 =9 2x1 + 20x2 - 2x3 = -44 -2x1 + 3x2 + 10x3 =22 39 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 2: Các phương pháp số trong đại số tuyến tính TÓM TẮT NỘI DUNG CHƯƠNG 2 Trong chương này sinh viên cần nắm vững ít nhất là các vấn đề sau: 1. Phương pháp trực tiếp giải hệ phương trình tuyến tính a.Phương pháp khử Gauss Phương pháp khử Gauss dùng cách khử dần các ẩn để đưa hệ phương trình đã cho về một dạng tam giác trên rồi giải hệ tam giác này từ giới lên trên, không phải tính một định thức nào. b. Phương pháp khử Gauss-Jordan Phương pháp khử Gauss-Jordan dùng cách khử dần các ẩn để đưa hệ phương trình đã cho về một dạng ma trận đường chéo rồi giải hệ phương trình này, không phải tính một định thức nào. 2. Phương pháp lặp giải hệ phương trình tuyến tính a. Phương pháp lặp đơn - Giả sử phải tìm nghiệm gần đúng của hệ phương trình tuyến tính (2.1) có dạng Ax=b. Đối với phương pháp lặp đơn, nói chung chúng ta phải đưa hệ (2.1) về dạng x=Cx+d.Trong đó ma trận C và vec tơ d được xây dựng từ A và b. Ma trận phải thoả mãn điều kiện ||C||<1. Để thực hiện phép lặp ta chọn một vec tơ ban đầu x(0), sau đó tính các x(i), i =1,2,... theo công thức lặp sau: x(i) = Cx(i-1) + d cho tới khi nào thảo mãn điều kiện dừng. - Sai số của phương pháp: ||x(k) - x*|| ≤ ||||1 |||| C C − ||x (k) - x(k-1)|| hoặc ||x(k) - x*|| ≤ ||||1 |||| C C k − ||x (1) - x(0)|| b. Phương pháp lặp Jacobi - Giả thiết ma trận A có tính chéo trội. Phương pháp lặp Jacobi sẽ có các bước lặp như : Với vec tơ x(0) cho trước bất kỳ, ví dụ x(0) = θ (vec tơ 0) ta có thể tính các vec tơ x(k) tại bước lặp k bằng công thức x(k) = C x(k-1) + d , k =1, 2, ... Cụ thể hơn, nếu x(k) = (x1(k), x2(k), . . ., xn(k)) thì ta có ⎟⎟ ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜ ⎝ ⎛ )( )( 2 )( 1 . k n k k x x x = - ⎥⎥ ⎥⎥ ⎥⎥ ⎥⎥ ⎦ ⎤ ⎢⎢ ⎢⎢ ⎢⎢ ⎢⎢ ⎣ ⎡ 0... ...... ...0 ...0 21 22 2 22 21 11 1 11 12 nn n nn n n n a a a a a a a a a a a a ⎟⎟ ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜ ⎝ ⎛ − − − )1( )1( 2 )1( 1 . k n k k x x x + ⎟⎟ ⎟⎟ ⎟⎟ ⎟⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜⎜ ⎜⎜ ⎝ ⎛ nn n a b a b a b . 22 2 11 1 40 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 2: Các phương pháp số trong đại số tuyến tính Với từng thành phần xi(k) ta có xi(k) = - ∑ ≠− n ijj ,1 ii ij a a xj(k-1) + ii i a b = iia 1 (bi - a∑ ≠− n ijj ,1 ij xj(k-1)) i = 1, 2, . . ., n, k = 1,2,... - Điều kiện hội tụ, đánh gái sai số của phương pháp lặp Jacobi cũng giống với phương pháp lặp đơn. c.Phương pháp lặp Gauss – Seidel - Giả thiết ma trận A có tính chéo trội. Phương pháp lặp Gauss - Seidel sẽ có các bước lặp như sau: Với vec tơ x(0) cho trước bất kỳ, ví dụ x(0) = θ (vec tơ 0) ta có thể tính các vec tơ x(k) tại bước lặp k bằng công thức : xi(k) = iia 1 (bi -( a∑− − 1 1 i j ijxj(k) +∑ +− n ij 1 aijxj(k-1))) i = 1, 2, . . ., n, k = 1,2,... - Đánh giá sai số: pi = ∑ |c− = 1 1 i j ij|, qi = ∑ |c = n ij ij| , μ = i max i i p q −1 Khi đó ta có: ||x(k) - x*|| ≤ μ μ −1 ||x (k) - x(k-1)|| hoặc ||x(k) - x*|| ≤ μ μ −1 k ||x(1) - x(0)|| 41 CuuDuongThanCong.com https://fb.com/tailieudientucntt
File đính kèm:
- bai_giang_phuong_phap_so_chuong_2_cac_phuong_phap_so_trong_d.pdf