Chương 3 - Hệ phương trình đại số tuyến tính. Chương này cung cấp cho người học những kiến thức về phương pháp tính trực tiếp và các phương pháp lặp. Nội dung cụ thể gồm: Phương pháp khử Gaussian, quay và tính tỷ lệ - Pivoting and scaling, phương pháp phân ly LU, nghịch đảo ma trận, các hệ chéo bậc 3, phương pháp lặp Jacobi, phương pháp lặp Gauss-Seidel.
TS Ngô Văn Thanh, Viện Vật lý Cao học vật lý – chuyên ngành Vật lý lý thuyết Chương.3 Hệ phương trình đại số tuyến tính 3.1 Phương pháp tính trực tiếp 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 Phương pháp khử Gaussian Quay tính tỷ lệ - Pivoting and scaling Phương pháp phân ly LU Nghịch đảo ma trận Các hệ chéo bậc 3.2 Các phương pháp lặp 3.2.1 Phương pháp lặp Jacobi 3.2.2 Phương pháp lặp Gauss-Seidel @2009, Ngô Văn Thanh - Viện Vật Lý 3.1 Phương pháp tính trực tiếp Hệ M phương trình tuyến tính với N ẩn … Biểu diễn dạng ma trận: @2009, Ngô Văn Thanh - Viện Vật Lý 3.1.1 Phương pháp khử Gaussian Xét hệ N phương trình tuyến tính với N ẩn số, dạng mở rộng ma trận: Giải hệ phương trình phương pháp khử theo hàng Xét ví dụ đơn giản Nhân hàng cho cộng với hàng thứ 2, thay kết cho hàng Nhân hàng cho -2 cộng với hàng thứ 3, thay kết cho hàng @2009, Ngô Văn Thanh - Viện Vật Lý Hàng vừa gọi phương trình pivot hay hàng pivot, phần tử a11 gọi phần tử pivot Áp dụng phương pháp tương tự phương trình pivot thứ hai phần tử pivot thứ Hệ phương trình tương đương có dạng Giải từ phương trình thứ đến phương trình @2009, Ngơ Văn Thanh - Viện Vật Lý Trường hợp tổng quát: Chọn hàng thứ làm hàng pivot, ta có: @2009, Ngô Văn Thanh - Viện Vật Lý Thực tiếp cho hàng pivot thứ hai: Cuối ta thu ma trận chéo, phần tử nằm phía đường chéo @2009, Ngô Văn Thanh - Viện Vật Lý 3.1.2 Pivoting and scaling Nếu phần tử pivot (các phần tử đường chéo) bé có sai số phép tính làm trịn số sau dấu chấm thập phân Nếu phần tử pivot khơng khơng sử dụng phương pháp khử Gaussian Để giải vấn đề Nếu phần tử pivot 0, thực tráo đổi hàng pivot cho hàng Sử dụng phương pháp scaling Phương pháp scaling theo cột (partial pivoting) Phương pháp scaling theo hàng (scaled partial pivoting) Kết hợp hai phương pháp (full pivoting) Cuối tìm nghiệm phương pháp thay ngược (backward substitution) @2009, Ngô Văn Thanh - Viện Vật Lý Phương pháp scaling theo cột (partial pivoting): Xét phần tử pivot akk, ta có Tìm giá trị mki lớn nhất, tương đương với việc tìm phần tử có giá trị tuyệt đối lớn cột i: |aki| Tráo đổi hàng pivot cho hàng tương ứng với Ví dụ: Phần tử |-3| lớn phần tử cột Tráo đổi hàng thứ cho hàng Tiếp tục thực phương pháp thu ma trận rút gọn dạng chéo @2009, Ngô Văn Thanh - Viện Vật Lý Phương pháp scaling theo hàng (scaled partial pivoting): Xác định hệ số tỷ lệ phần tử lớn hàng Tính tỷ số phần tử cột k : Tìm hàng thứ p mà tỷ số có giá trị lớn Tráo đổi hàng pivot cho hàng thứ p Xét ví dụ: Ta có: Tính: Vì a31/s3 lớn nên tráo đổi hàng cho hàng @2009, Ngô Văn Thanh - Viện Vật Lý @2009, Ngô Văn Thanh - Viện Vật Lý Chương trình đơn giản: SUBROUTINE ludcmp(a,indx,d) IMPLICIT NONE REAL, DIMENSION(:,:), INTENT(INOUT) :: a INTEGER, DIMENSION(:), INTENT(OUT) :: indx REAL, INTENT(OUT) :: d REAL, DIMENSION(size(a,1)) :: vv REAL, PARAMETER :: TINY=1.0e-20 !A small number INTEGER :: j,n,imax n=assert_eq(size(a,1),size(a,2),size(indx),’ludcmp’) d=1.0 !No row interchanges yet vv=maxval(abs(a),dim=2) if (any(vv == 0.0)) & write(6,*) ’ There is a row of zeros.’ vv=1.0/vv @2009, Ngô Văn Thanh - Viện Vật Lý j=1,n imax=(j-1)+imaxloc(vv(j:n)*abs(a(j:n,j))) if (j /= imax) call swap(a(imax,:),a(j,:)) d = -d vv(imax) = vv(j) end if indx(j) = imax if (a(j,j) == 0.0) a(j,j)=TINY a(j+1:n,j) = a(j+1:n,j)/a(j,j) * i=1,j-1 a(i,j)=a(i,j)-sum(a(i,1:i-1)*a(1:i-1,j)) enddo * i=j,n !This is i = j and i = j+1: ::N a(i,j)=a(i,j)-sum(a(i,1:j-1)*a(1:j-1,j)) enddo enddo END SUBROUTINE ludcmp @2009, Ngô Văn Thanh - Viện Vật Lý Chương trình F90 kiểu parallel tối ưu: SUBROUTINE ludcmp(a,indx,d) IMPLICIT NONE REAL, DIMENSION(:,:), INTENT(INOUT) :: a INTEGER, DIMENSION(:), INTENT(OUT) :: indx REAL, INTENT(OUT) :: d REAL, DIMENSION(size(a,1)) :: vv REAL, PARAMETER :: TINY=1.0e-20 !A small number INTEGER :: j,n,imax n=assert_eq(size(a,1),size(a,2),size(indx),’ludcmp’) d=1.0 !No row interchanges yet vv=maxval(abs(a),dim=2) if (any(vv == 0.0)) & write(6,*) ’ There is a row of zeros.’ vv=1.0/vv @2009, Ngô Văn Thanh - Viện Vật Lý j=1,n imax=(j-1) + imaxloc(vv(j:n)*abs(a(j:n,j))) !Find the pivot row (only j:n elements) if (j /= imax) then !Do we need to interchange rows? call swap(a(imax,:),a(j,:)) ! Yes, so d = -d ! and change the parity of d vv(imax)= vv(j) !Also interchange the scale factor end if indx(j) = imax if (a(j,j) == 0.0) a(j,j) = TINY a(j+1:n,j)=a(j+1:n,j)/a(j,j) !Divide by the pivot element a(j+1:n,j+1:n)=a(j+1:n,j+1:n) - & outerprod(a(j+1:n,j),a(j,j+1:n)) !Reduce remaining submatrix end END SUBROUTINE ludcmp @2009, Ngô Văn Thanh - Viện Vật Lý SUBROUTINE lubksb(a,indx,b) … n=assert_eq(size(a,1),size(a,2),size(indx),’lubksb’) k=0 i=1,n j=indx(i) summ=b(j) b(j)=b(i) if (k /= 0) then summ=summ-dot_product(a(i,k:i-1),b(k:i-1)) else if (summ /= 0.0) then k = i end if !have to the dot product above b(i)=summ end do i=n,1,-1 ! Now we the backsubstitution b(i) = (b(i)-dot_product(a(i,i+1:n),b(i+1:n)))/a(i,i) end END SUBROUTINE lubksb @2009, Ngô Văn Thanh - Viện Vật Lý 3.1.4 Nghịch đảo ma trận Xét hệ phương trình tuyến tính: Nhân hai vế cho ma trận nghịch đảo A-1: Nếu xác định A-1 hệ phương trình hồn tồn tìm nghiệm dạng: Để xác định ma trận nghịch đảo A-1, ta phải thực bước sau: Áp dụng phương pháp phân ly LU (ludcmp) cho ma trận A Sử dụng chương trình lubksb để tìm nghiệm cho cột ma trận b @2009, Ngô Văn Thanh - Viện Vật Lý REAL, DIMENSION(:,:), INTENT(INOUT) :: a INTEGER,DIMENSION(size(a,1)) :: indx INTEGER,DIMENSION(size(a,1),size(a,1)) :: y INTEGER :: i,j,n REAL :: d n=assert_eq(size(a,1),size(a,2),size(indx),’inverse’) y = 0.0 i=1,n !Set up identity matrix y(i,i)=1 enddo call ludcmp(a,indx,d) !Decompose the matrix just once j=1,n !Find inverse by columns call lubksb(a,indx,y(1,j)) enddo @2009, Ngô Văn Thanh - Viện Vật Lý Tính định thức ma trận Sau áp dụng phân ly LU cho ma trận A, tính định thức theo cơng thức: REAL, FUNCTION det(a) REAL, DIMENSION(:,:), INTENT(INOUT) :: a INTEGER,DIMENSION(size(a,1)) :: indx INTEGER :: i,n REAL :: d n=size(a,1) call ludcmp(a,indx,d) !Decompose the matrix just once i=1,n d=d*a(i,i) enddo det = d END FUNCTION det @2009, Ngô Văn Thanh - Viện Vật Lý 3.1.5 Các hệ chéo bậc Chương trình: SUBROUTINE tridag_ser(a,b,c,r,u) IMPLICIT NONE REAL, DIMENSION(:), INTENT(IN) :: a,b,c,r REAL, DIMENSION(:), INTENT(OUT) :: u REAL, DIMENSION(size(b)) :: gam INTEGER :: n,j REAL :: bet @2009, Ngô Văn Thanh - Viện Vật Lý REAL :: bet n=size(b) bet=b(1) if (bet == 0.0) write(6,*) ‘Error at code stage 1’ u(1) = r(1)/bet j=2,n !Decomposition and forward substitution gam(j) = c(j-1)/bet bet = b(j)-a(j-1)*gam(j) if (bet == 0.0) write(6,*) ‘Error at code stage 2’ u(j)=(r(j)-a(j-1)*u(j-1))/bet enddo j=n-1,1,-1 !Backsubstitution u(j)=u(j)-gam(j+1)*u(j+1) end END SUBROUTINE tridag_ser @2009, Ngô Văn Thanh - Viện Vật Lý 3.2 Các phương pháp lặp Hệ phương trình tuyến tính dạng giải gầng phương pháp tính lặp Nghiệm hệ phương trình có dạng: Trong H gọi ma trận lặp Ma trận A viết dạng L : ma trận tam giác hồn tồn (khơng có thành phần chéo) D : ma trận chéo U : ma trận tam giác hồn tồn @2009, Ngơ Văn Thanh - Viện Vật Lý 3.2.1 Phương pháp lặp Jacobi Định nghĩa nghiệm gần đúng: Ma trận lặp Biến đổi phương trình nghiệm Suy Cơng thức tính lặp: @2009, Ngô Văn Thanh - Viện Vật Lý K=1 ERR=TOL+1.0 DO WHILE (K TOL) DO I=1,N S = 0.0 DO J=1,N S = S-A(I,J)*X1(J) ENDDO S = (S+A(I,N+1))/A(I,I) IF (ABS(S).GT.ERR) ERR=ABS(S) X2(I) = X1(I)+S ENDDO DO I=1,N X1(I) = X2(I) ENDDO K=K+1 ENDDO @2009, Ngô Văn Thanh - Viện Vật Lý 3.2.2 Phương pháp lặp Gauss-Seidel Phương pháp phát triển từ phương pháp Jacobi Định nghĩa phương trình tính nghiệm gần đúng: hoặc: Trong ma trận lặp Cơng thức tính lặp: @2009, Ngô Văn Thanh - Viện Vật Lý .. .Chương. 3 Hệ phương trình đại số tuyến tính 3. 1 Phương pháp tính trực tiếp 3. 1.1 3. 1.2 3. 1 .3 3.1.4 3. 1.5 Phương pháp khử Gaussian Quay tính tỷ lệ - Pivoting and scaling Phương pháp phân... chéo bậc 3. 2 Các phương pháp lặp 3. 2.1 Phương pháp lặp Jacobi 3. 2.2 Phương pháp lặp Gauss-Seidel @2009, Ngô Văn Thanh - Viện Vật Lý 3. 1 Phương pháp tính trực tiếp Hệ M phương trình tuyến tính với... END SUBROUTINE tridag_ser @2009, Ngô Văn Thanh - Viện Vật Lý 3. 2 Các phương pháp lặp Hệ phương trình tuyến tính dạng giải gầng phương pháp tính lặp Nghiệm hệ phương trình có dạng: Trong H