Tìm nghiệm xấp xỉ hệ phương trình tuyến tính đại số
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI KHOA TOÁN TIN ỨNG DỤNG - - TIỂU LUẬN Đề tài: Tìm nghiệm xấp xỉ hệ phương trình tuyến tính đại số Giáo viên hướng dẫn: Nguyễn Hữu Điển Sinh viên thực : Lê Minh Cường Lớp: Toán – Tin 1-k51 Hà Nội, tháng 11 năm 2009 LỜI NÓI ĐẦU Nội dung chủ yếu tập trung vào phần giải thuật cách cài đặt chương trình ứng dụng Maple, để giải toán tìm nghiệm xấp xỉ hệ phương trình tuyến tính đại số Ax = b phương pháp Jacobi hay Gauss_Seidel … Phiên sử dụng Maple 12.Ở xin trình bày thuật toán cài đặt thuật toán Maple 12 Tuy nhiên khả đọc hiểu tiếng Anh hạn chế nên có chỗ giải thích chưa thoả đáng,rất mong góp ý thầy cô bạn bè Xin chân thành cám ơn giúp đỡ bảo tận tình phó giáo sư Nguyễn Hữu Điển Mọi đóng góp xin gửi địa email : cuongleminh.hut@gmail.com thecatmc@yahoo.com Một lần xin chân thành cám ơn Sinh viên trình bày: Lê Minh Cường Lớp : Toán Tin – K51 I.Chuẩn Vecto Ma Trận : 1.Chuẩn Vecto : Để định nghĩa hàm khoảng cách không gian R n sử dụng khái niệm chuẩn, định nghĩa sau : 1.1 Định nghĩa 1:Chuẩn vecto R n ;ký hiệu ;là hàm R n → R thoả mãn tính chất sau : i) x ≥ 0; ∀x ∈ R n ii) x = ⇔ x = iii) αx = α x ; ∀x ∈ R n iv) x + y ≤ x + y ; ∀x, y ∈ R n 1.2 Định nghĩa : Dạng chuẩn l2 ; l∞ định nghĩa sau : n ∑x l2 = x = l∞ = x ∞ = max xi i i =1 1≤ i ≤ n 1.3 Định lý Causi-Bunhia-Svac : t t Cho x = ( x1 , , xn ) y = ( y1 , , yn ) không gian R n Ta có bất đẳng thức : n n xt y = ∑ xi yi ≤ ∑ xi2 i =1 i =1 n ∑y i i =1 = x y 1.4 Định nghĩa : Cho x = ( x1 , , xn ) y = ( y1 , , yn ) không gian t t R n Khoảng cách x y định nghĩa theo chuẩn : x− y = n ∑ (x − y ) i =1 i i x − y ∞ = max( xi − yi ) 1≤ i ≤ n 1.5 Định nghĩa : Sự hội tụ Một dãy vecto {x (k )}k =1 R n gọi hội tụ đến x với ∞ chuẩn ⋅ ∀ε > ,tồn số nguyên N (ε ) thỏa mãn : x (k ) − x < ε ; ∀k ≥ N (ε ) 1.6 Định lý : Dãy vecto {x (k )}k =1 hội tụ đến x R n với ý chuẩn ∞ ,khi ∞ lim k → ∞ xi(k ) = xi ,với i = 1, , n 1.7 Định lý : Với x ∈ R n x ∞ ≤ x ≤ n x ∞ 2.Chuẩn Ma Trận : 2.1 Định nghĩa : Chuẩn ma trận tập ma trận vuông n chiều hàm số ,định nghĩa tập,thỏa mãn tất ma trận n × n A,B số thực thực,ký hiệu α i) A ≥ ii) A = ⇔ A = O iii) αA = α A iv) A + B ≤ A + B v) A.B ≤ A B 2.1 Định lý : Chuẩn ma trận xác định sau Az A = max = max Az z ≠0 z =1 z 2.3.Hệ : Với vecto z ≠ matrix A : Az ≤ A z II.Trị riêng vecto riêng : Trong trường hợp A ma trận vuông n chiều,luôn tồn vecto x song song với Ax nghĩa tồn số λ cho Ax = λx Từ ta có : ( A − λI )x = Ta tìm hiểu mối quan hệ mật thiết λ hợp lý thuật toán lặp hội tụ 1.Định nghĩa : Nếu A ma trận vuông Đa thức đặc trưng A : p(λ ) = det( A − λI ) 2.Định nghĩa : Trị riêng ma trận A giá trị λ thoả mãn phương trình p(λ ) = Với λ trị riêng A x ≠ Vecto riêng ma trận A vecto x thoả ( A − λI )x = mãn : 3.Ví dụ : ⎡1 2⎤ A = ⎢⎢ − 1⎥⎥ Tìm trị riêng vecto riêng ⎢⎣− 1 ⎥⎦ Trong Maple,ta dùng câu lệnh with()để truy xuất gói lệnh linalg (viết tắt Linear Algebra) sử dụng hàm Eigenvals(A) để tính trị riêng ma trận A : >with(linalg); >A:=matriz(3,3, [1,0,2,0,1,-1,-1,1,1]); >evalf(Eigenvals(A)); Tính trị riêng vecto riêng lúc > evalf(Eigenvals(A,B)); Hiển thị Matrix B cột vecto riêng ứng với trị riêng tìm > evalm(B); 4 Định nghĩa : Bán kính quy chiếu ρ ( A) ma trận A định nghĩa ρ ( A) = max λ với λ trị riêng A Đối với λ giá trị phức λ = α + βi = α + β Định lý : Nếu A ma trận vuông n chiều : ( ) i) A = ρ At A ii) ρ ( A) ≤ A 6.Ví dụ : ⎡ 1 0⎤ Cho A = ⎢⎢ 1⎥⎥ Tìm A ⎢⎣− 1 2⎥⎦ >with(linalg); >A:=matrix(3,3, [1,1,0,1,2,1,-1,1,2]); Dùng hàm chuyển vị transpose để tính At >B:=transpose(A); Dùng hàm nhân multiply để tính At A >C:=multiply(B,A); Hiển thị trị riêng ma trận At A >evalf(Eigenvals(C)); ( ) Suy ρ At A = max λ = 9,645751311 Suy A : Dùng hàm norm() >norm(A,2); >norm(A, infinity); Ngoài ta tìm giới hạn vecto hàm VectorLimit nằm gói câu lệnh NumericalAnalysis.Ta dùng cú pháp sau : with(Student[NumericalAnalysis]) with(Student[NumericalAnalysis]); [AbsoluteError, AdamsBashforth, AdamsBashforthMoulton, AdamsMoulton, AdaptiveQuadrature, AddPoint, ApproximateExactUpperBound, ApproximateValue, BackSubstitution, BasisFunctions, Bisection, CubicSpline, DataPoints, Distance, DividedDifferenceTable, Draw, Euler, EulerTutor, ExactValue, FalsePosition, FixedPointIteration, ForwardSubstitution, Function, InitialValueProblem, InitialValueProblemTutor, Interpolant, InterpolantRemainderTerm, IsConvergent, IsMatrixShape, IterativeApproximate, IterativeFormula, IterativeFormulaTutor, LeadingPrincipalSubmatrix, LinearSolve, LinearSystem, MatrixConvergence, MatrixDecomposition, MatrixDecompositionTutor, ModifiedNewton, NevilleTable, Newton, NumberOfSignificantDigits, PolynomialInterpolation, Quadrature, RateOfConvergence, RelativeError, RemainderTerm, Roots, RungeKutta, Secant, SpectralRadius, Steffensen, Taylor, TaylorPolynomial, UpperBoundOfRemainderTerm, VectorLimit] Gói lệnh Student hỗ trợ cho việc dạy học toán • Từ Maple 8, gói lệnh Student phát triển từ gói lệnh student trước nhằm hỗ trợ cho việc dạy học toán đại học phổ thông Khai thác khả gói lệnh đem đến cho giáo viên nhiều công cụ hỗ trợ phương pháp dạy học Có thể nói gói lệnh đề cập đến tất nội dung toán học đại học phổ thông, cung cấp nhiều lệnh thủ tục cho phép toán algorithm xuất chương trình giảng dạy, cung cấp nhiều công cụ tương tác dạng Maplet hỗ trợ việc làm bước phép toán vi tích phân • Gói lệnh Student có gói lệnh • Calculus1 • LinearAlgebra • Precalculus • Để nạp gói lệnh, làm sau: with(Student[LinearAlgebra]): Ví dụ : > restart; > with(LinearAlgebra): > x:=Vector(4,[5,-3,-6,2]); > Norm(x); > Norm(x,infinity); > Norm(x,2); > Norm(x,Euclidean); > v:=Vector(4,[3+5/k,5,2/k^2,exp(-k)*cos(k)]); > limvec:=Vector(4): for i from to limvec[i]:=limit(v[i],k=infinity); od; vectorlimit:=limvec; > with(Student[NumericalAnalysis]); > vectorlimit1:=VectorLimit(v,k); Ta xét ma trận sau tìm chuẩn : > A:=Matrix(4,4,[[1,1,3,4],[1,-1,1,1],[3,-1,2,-3],[2,3,1,4]]); > Norm(A); > Norm(A,infinity); Tính giá trị lớn chuẩn ma trận : > for i from to R[i]:=Row(A,i); r[i]:=add(abs(R[i][j]),j=1 4); od; supnorm:=max(r[1],r[2],r[3],r[4]); > Norm(A,2); > evalf(%); > Norm(A,Euclidean); > evalf(%); III.Giải hệ phương trình tuyến tính kỹ thuật lặp: 1.Phép lặp Jacobi : Để giải toán Ax = b với xấp xỉ gần ban đầu x ( 0) - Đầu vào : số phương trình số nghiệm n ; ma trận A với thành phần aij , ≤ i, j ≤ n ;vecto b với thành phần b j ,1 ≤ j ≤ n ;các thành phần XOi ,1 ≤ i ≤ n vecto XO = x (0 ) ;sai số cho phép TOL;số lần lặp lớn N - Đầu : nghiệm xấp xỉ x1 , x2 , , xn thông báo “Số lượng tối đa phép lặp bị vượt quá” Thuật toán : Bước : Đặt k = Bước : Trong (k ≤ N ) thực từ Bước đến Bước Bước : Tính giá trị − ∑ (aij XO j ) + bi n j =1 xi = j ≠i ; với i = 1,…, n aii Bước : Nếu x − XO < TOL prinf( x1 , x2 , , xn ); STOP.(thoát khỏi chương trình con) Bước : Update k = k + Bước : Tính toán vecto XO XOi = x i ; với i = 1,…, n Bước : Output “Số lần lặp tối đa bị vượt quá!” STOP n, A(aij ), b(b j ) , XO = x (0 ) , TOL, N k=1 k≤N F Output(‘Max…’) STOP T Tính xi x − XO < TOL T Output(‘ x1 , , xn ’) STOP F k = k +1 Tính XOi = xi > restart; > with(LinearAlgebra): > libname:="c:/nalib",libname; Chương trình cho giải thuật Jacobi >jacobi:=proc(A::Matrix,b::Vector,x0::Vector,tol::positive, n::nonnegint,v::name) local AA, B, OK, N, I, J, X0, X1, TOL, NN, K, ERR, S, X; with(LinearAlgebra); N:=RowDimension(A); AA:=A; B:=b; X0:=x0; TOL:=tol; NN:=n; X1:=Vector(N); > K := 0; > OK := FALSE; printf(` n x\n`); printf(` -\n`); printf(`%3d [`,K); for I from to N printf(`% 12.8f`,X0[I]); if IN then printf(`,`) fi; od; printf(`]\n`); 10 > b:=Vector(4,[6,25,-11,15]); > v:=jacobi(A,b,Vector(4,[0,0,0,0]),10^(-6),100,v); n x [ 0.00000000, 0.00000000, 0.00000000, 0.00000000] [ 0.60000000, 2.27272727, -1.10000000, 1.87500000] [ 1.04727273, 1.71590909, -0.80522727, 0.88522727] [ 0.93263636, 2.05330578, -1.04934091, 1.13088068] [ 1.01519876, 1.95369576, -0.96810863, 0.97384272] [ 0.98899130, 2.01141472, -1.01028590, 1.02135051] [ 1.00319865, 1.99224126, -0.99452174, 0.99443374] [ 0.99812847, 2.00230688, -1.00197223, 1.00359431] [ 1.00062513, 1.99867030, -0.99903558, 0.99888839] [ 0.99967415, 2.00044767, -1.00036916, 1.00061919] 10 [ 1.00011860, 1.99976795, -0.99982814, 0.99978598] 11 [ 0.99994242, 2.00008478, -1.00006833, 1.00010850] 12 [ 1.00002214, 1.99995896, -0.99996916, 0.99995967] 13 [ 0.99998973, 2.00001582, -1.00001256, 1.00001924] 14 [ 1.00000410, 1.99999268, -0.99999444, 0.99999250] 15 [ 0.99999816, 2.00000292, -1.00000230, 1.00000344] 16 [ 1.00000075, 1.99999868, -0.99999899, 0.99999862] 17 [ 0.99999967, 2.00000054, -1.00000042, 1.00000062] 18 [ 1.00000014, 1.99999976, -0.99999982, 0.99999975] The solution vector is > v:='v'; > v:=jacobi(A,b,Vector(4,[0,0,0,0]),10^(-6),10,v); n x [ 0.00000000, 0.00000000, 0.00000000, 0.00000000] [ 0.60000000, 2.27272727, -1.10000000, 1.87500000] [ 1.04727273, 1.71590909, -0.80522727, 0.88522727] [ 0.93263636, 2.05330578, -1.04934091, 1.13088068] [ 1.01519876, 1.95369576, -0.96810863, 0.97384272] [ 0.98899130, 2.01141472, -1.01028590, 1.02135051] [ 1.00319865, 1.99224126, -0.99452174, 0.99443374] [ 0.99812847, 2.00230688, -1.00197223, 1.00359431] 12 [ 1.00062513, 1.99867030, -0.99903558, [ 0.99967415, 2.00044767, -1.00036916, 10 [ 1.00011860, 1.99976795, -0.99982814, Maximum Number of Iterations Exceeded 0.99888839] 1.00061919] 0.99978598] 2.Thuật toán Lặp Gauss-Seidel : Giải toán Ax = b với xấp xỉ gần x (0 ) - Đầu vào : Số lượng phương trình nghiệm n ;các phần tử aij ,1 ≤ i, j ≤ n ma trận A;các thành phần bi ,1 ≤ i ≤ n vecto b ;các thành phần XOi ;1 ≤ i ≤ n vecto XO = x (0 ) ;sai số cho phép TOL;Số lần lặp lớn N Đầu : nghiệm xấp xỉ x1 , x2 , , xn thông báo “Số lượng tối đa phép lặp bị vượt quá” Thuật toán : Bước : Đặt k = Bước : Trong (k ≤ N ) thực từ Bước đến Bước Bước : Cho i chạy từ đến n , ta tính giá trị - i −1 xi = − ∑ aij x (j0 ) − j =1 n ∑a j = i +1 ij XO j + bi aii Bước : Nếu x − XO < TOL prinf( x1 , x2 , , xn );STOP Bước : Cập nhật k = k + Bước : Tính vecto XO XOi = xi với i = 1,…, n Bước : Output (‘Số lần lặp tối đa bị vượt quá!’) STOP 13 n, A(aij ), b(b j ) , XO = x (0 ) , TOL, N k=1 k≤N F Output(‘Max…’) STOP T Tính xi x − XO < TOL T Output(‘ x1 , , xn ’) STOP F k = k +1 Tính XOi = xi > restart; > with(LinearAlgebra): > libname:="c:/nalib",libname; Giải thuật Gauss-Seidel : >gaussseidel:=roc(A::Matrix,b::Vector,x0::Vector,tol:: positive,n::nonnegint,v::name) local AA, B, OK, N, I, J, X0, X1, TOL, NN, K, ERR, S, X; with(LinearAlgebra); N:=RowDimension(A); AA:=A; B:=b; X0:=x0; TOL:=tol; NN:=n; X1:=Vector(N); STEP > K := 0; > OK := FALSE; printf(` n x\n`); printf(` -\n`); printf(`%3d [`,K); for I from to N 14 printf(`% 12.8f`,X0[I]); if IN then printf(`,`) fi; od; printf(`]\n`); K:=1; STEP > while OK = FALSE and K ERR := 0; STEP > for I from to N > S := 0; > for J from to I-1 > S := S-A[I,J]*X1[J]; > od; > for J from I+1 to N > S := S-A[I,J]*X0[J]; od; > S := evalf((S+B[I])/A[I,I]); > if abs(S-X0[I]) > ERR then > ERR := abs(S-X0[I]); > fi; > X1[I] := S; > od; printf(`%3d [`,K); for I from to N printf(`% 12.8f`,X1[I]); if IN then printf(`,`) fi; od; printf(`]\n`); STEP > if ERR OK := TRUE; > fi; STEP > K := K+1; STEP > for I from to N > X0[I] := X1[I]; > od; > od; > if OK = FALSE then > printf(`Maximum Number of Iterations Exceeded.\n`); STEP > else > printf(`\nThe solution vector is\n`,args[6]); > v:=evalm(X1); fi; end; Kết thúc chương trình bắt đầu nhập liệu : 15 > A:=Matrix(4,4,[[10,-1,2,0],[-1,11,-1,3],[2,-1,10,1],[0,3,-1,8]]); > if Determinant(A)=0 then print("There is no unique solution.") else print("There is a unique solution.") fi; > b:=Vector(4,[6,25,-11,15]); > v:='v'; > v:=gaussseidel(A,b,Vector(4,[0,0,0,0]),10^(-6),100,v); n x [ 0.00000000, 0.00000000, 0.00000000, 0.00000000] [ 0.60000000, 2.32727273, -0.98727273, 0.87886364] [ 1.03018182, 2.03693802, -1.01445620, 0.98434122] [ 1.00658504, 2.00355502, -1.00252738, 0.99835095] [ 1.00086098, 2.00029825, -1.00030728, 0.99984975] [ 1.00009128, 2.00002134, -1.00003115, 0.99998810] [ 1.00000836, 2.00000117, -1.00000274, 0.99999922] [ 1.00000067, 2.00000002, -1.00000021, 0.99999996] [ 1.00000004, 2.00000000, -1.00000001, 1.00000000] The solution vector is Từ ta thấy giải thuật Gauss-Seidel có tốc độ hội tụ nhanh giải thuật Jacobi 3.Thuật toán SOR : Giải toán Ax = b với tham số ω xấp xỉ gần ban đầu x (0 ) - Đầu vào : Số phương trình số ẩn n ; phần tử aij ,1 ≤ i, j ≤ n ma trận A;các thành phần bi ,1 ≤ i ≤ n vecto b ;các thành phần XOi ;1 ≤ i ≤ n vecto XO = x (0 ) ; tham số ω ; sai số cho phép TOL ; số lần lặp lớn N - Đầu : nghiệm xấp xỉ x1 , x2 , , xn thông báo “Số lượng tối đa phép lặp bị vượt quá” Thuật toán : 16 Bước : Đặt k = Bước : Trong (k ≤ N ) thực lặp từ Bước đến Bước Bước : Tính x = ( xi ) với i = 1,…, n ⎛ i −1 ω ⎜⎜ − ∑ aij x j − xi = (1 − ω )XOi + ⎝ j =1 n ∑a j = i +1 ij ⎞ XO j + bi ⎟⎟ ⎠ aii Bước : Nếu x − XO < TOL prinf( x1 , x2 , , xn );STOP Bước : Cập nhật k = k + Bước : Tính vecto XO XOi = xi với i = 1,…, n Bước : Output (‘Số lần lặp tối đa bị vượt quá!’) STOP > restart; > with(LinearAlgebra): > libname:="c:/nalib",libname; Thuật toán SOR : > SOR := proc(A::Matrix,b::Vector,w::numeric,x0::Vector,tol::po sitive,n::nonnegint,v::name) local AA, B, OK, N, I, J, X0, X1, TOL, NN, K, ERR, S, X, W; with(LinearAlgebra); N:=RowDimension(A); AA:=A; B:=b; X0:=x0; TOL:=tol; NN:=n; X1:=Vector(N); W:=w; > K := 0; > OK := FALSE; printf(` n x\n`); printf(` -\n`); printf(`%3d [`,K); for I from to N printf(`% 12.8f`,X0[I]); if IN then printf(`,`) fi; od; printf(`]\n`); K:=1; > while OK = FALSE and K ERR := 0; > for I from to N > S := 0; > for J from to I-1 > S := S-A[I,J]*X1[J]; 17 > od; > for J from I+1 to N > S := S-A[I,J]*X0[J]; od; > S := evalf((1-W)*X0[I]+W*(S+B[I])/A[I,I]); > if abs(S-X0[I]) > ERR then > ERR := abs(S-X0[I]); > fi; > X1[I] := S; > od; printf(`%3d [`,K); for I from to N printf(`% 12.8f`,X1[I]); if IN then printf(`,`) fi; od; printf(`]\n`); > if ERR OK := TRUE; > fi; > K := K+1; > for I from to N > X0[I] := X1[I]; > od; > od; > if OK = FALSE then > printf(`Maximum Number of Iterations Exceeded.\n`); > else > printf(`\nThe solution vector is\n`); > v:=evalm(X1); fi; end; Nhập liệu tính toán : > A:=Matrix(3,3,[[4,3,0],[3,4,-1],[0,-1,4]]); > b:=Vector(3,[24,30,-24]); > v:='v'; > > v:=SOR(A,b,1,Vector(3,[1,1,1]),10^(-6),100,v); n x [ 1.00000000, 1.00000000, 1.00000000] [ 5.25000000, 3.81250000, -5.04687500] [ 3.14062500, 3.88281250, -5.02929688] 18 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ 3.08789062, 3.05493164, 3.03433228, 3.02145767, 3.01341104, 3.00838190, 3.00523869, 3.00327418, 3.00204636, 3.00127898, 3.00079936, 3.00049960, 3.00031225, 3.00019516, 3.00012198, 3.00007624, 3.00004765, 3.00002978, 3.00001861, 3.00001163, 3.00000727, 3.00000454, 3.00000284, 3.00000178, 3.00000111, 3.92675781, 3.95422363, 3.97138977, 3.98211861, 3.98882413, 3.99301508, 3.99563443, 3.99727152, 3.99829470, 3.99893418, 3.99933386, 3.99958366, 3.99973979, 3.99983737, 3.99989836, 3.99993647, 3.99996029, 3.99997518, 3.99998449, 3.99999031, 3.99999394, 3.99999622, 3.99999764, 3.99999852, 3.99999908, -5.01831055] -5.01144409] -5.00715256] -5.00447035] -5.00279397] -5.00174623] -5.00109139] -5.00068212] -5.00042632] -5.00026646] -5.00016654] -5.00010408] -5.00006505] -5.00004066] -5.00002541] -5.00001588] -5.00000993] -5.00000620] -5.00000388] -5.00000242] -5.00000152] -5.00000094] -5.00000059] -5.00000037] -5.00000023] The solution vector is Thử với 1< < > v:='v'; = 1.25 > > v:=SOR(A,b,1.25,Vector(3,[1,1,1]),10^(-6),100,v); n x [ 1.00000000, 1.00000000, 1.00000000] [ 6.31250000, 3.51953125, -6.65014648] [ 2.62231445, 3.95852661, -4.60042381] [ 3.13330269, 4.01026464, -5.09668635] [ 2.95705123, 4.00748383, -4.97348972] [ 3.00372110, 4.00292497, -5.00571352] [ 2.99632756, 4.00092620, -4.99828218] [ 3.00004980, 4.00025858, -5.00034865] [ 2.99974513, 4.00006534, -4.99989242] [ 3.00000246, 4.00001498, -5.00002222] 10 [ 2.99998534, 4.00000306, -4.99999349] 11 [ 3.00000080, 4.00000052, -5.00000146] 12 [ 2.99999931, 4.00000006, -4.99999961] 13 [ 3.00000012, 4.00000000, -5.00000010] The solution vector is 19 Thuật toán SOR ngắn gọn nhờ vào tham số Omega tốc độ làm việc hội tụ thuật toán SOR nói nhanh ta tăng Omega n, A(aij ), b(b j ),ϖ , (0 ) XO = x , TOL, N k=1 F k≤N Output(‘Max…’) STOP T Tính xi x − XO < TOL T Output(‘ x1 , , xn ’) STOP F k = k +1 Tính XOi = xi 4.Cải tiến phép lặp : Xấp xỉ nghiệm hệ tuyến tính Ax = b - Đầu vào : Số phương trình số ẩn n ; phần tử aij ,1 ≤ i, j ≤ n ma trận - A;các thành phần bi ,1 ≤ i ≤ n vecto b ; số lần lặp lớn N ; sai số cho phép TOL ; độ xác t chữ số t Đầu : xấp xỉ xx = ( xxi ,…, xxn ) thông báo số lần lặp bị vượt xấp xỉ COND gần đến K ∞ ( A) Thuật toán : Bước : Giải hệ Ax = b tìm nghiệm x1 ,…, xn phép loại trừ Gauss , cách giữ lại hệ số nhân mij , j = i + 1, i + 2,…, n, i = 1,2,…, n − Bước : Đặt k = Bước : Trong (k ≤ N ) thực từ Bước đến Bước Bước : Tính vecto r = (ri ) n ri = bi − ∑ aij x j j =1 Bước : Giải hệ tuyến tính Ay = r sử dụng phép loại trừ Gauss Bước Bước : Tính xxi với i = 1,…, n xxi = xi + yi 20 Bước : Nếu k = đặt COND = Bước : Nếu x − xx ∞ y ∞ xx ∞ × 10t < TOL OUTPUT(xx); OUTPUT(COND);STOP Bước : Đặt k = k + Bước : Tính xi = xxi với i = 1, , n Bước 10 : OUTPUT(‘Số lần lặp tối đa bị vượt quá!’) OUTPUT(COND); STOP 21 n, A(aij ), b(b j ) , C −1 x (0 ) , TOL, N ,t r (0 ) = b − Ax (0 ) w = w(0 ) = C −1r v = v (1) = C − t w n α = ∑ w2j j =1 k=1 F k≤N T v ≤ TOL T Output(‘ x1 , , xn ; r1 , , rn ’) STOP F u = Av = Av (k ) t = tk = α ; x = x (k ) = x (k −1) + tv (k ) n ∑v u j =1 j j r = r (k ) = r ( k −1) − tu w = w(k ) = C −1r (k ) n β = ∑ w2j j =1 β < TOL T x1 , , xn ; r1 , , rn ’) STOP F s = sk = Output(‘ β α v = v (k + ) = C −1w + sv (k ) α =β k = k +1 22 5.Thuật toán Gradient điều kiện kết hợp : Giải toán Ax=b với ma trận điều kiện C −1 xấp xỉ gần x (0 ) o Đầu vào : số lượng phương trình số chưa biết n ; ma trận A với thành phần aij , ≤ i, j ≤ n ; vecto b với thành phần b j ,1 ≤ j ≤ n ; ma trận hệ số điều kiện C −1 với thành phần γ ij ,1 ≤ i, j ≤ n ; vecto xấp xỉ đầu x (0 ) với xi ,1 ≤ i ≤ n số lần lặp lớn N,sai số cho phép TOL o Đầu : nghiệm xấp xỉ x1 , x2 , , xn phần dư r1 , r2 , , rn thông báo “Số lượng tối đa phép lặp bị vượt quá” Thuật toán : Bước : Tính r (0 ) = b − Ax (0 ) w = w(0 ) = C −1r v = v (1) = C −t w n α = ∑ w2j j =1 Bước : Đặt k = Bước : Kiểm tra điều kiện Trong k ≤ N làm từ Bước đến Bước Bước4 : If v ≤ TOL then printf (Nghiệm : x1 , x2 , , xn ) printf (với phần dư : r1 , r2 , , rn ) STOP Else (Sang Bước 5) Bước : Tính u = Av = Av (k ) t = tk = α ; x = x (k ) = x (k −1) + tv (k ) n ∑v u j =1 j j r = r (k ) = r (k −1) − tu w = w(k ) = C −1r (k ) n β = ∑ w2j j =1 Bước : Kiểm tra điều kiện If β 〈TOL then printf (Nghiệm : x1 , x2 , , xn ) printf (với phần dư : r1 , r2 , , rn ) STOP Else (Sang bước 7) Bước : Tính s = sk = β α v = v (k + ) = C −1w + sv (k ) 23 α = β ; (cập nhật α ) k = k +1 Quay lại Bước Bước : Kiểm tra điều kiện If (k〉 n ) then Printf(Số lượng tối đa phép lặp bị vượt ! ) STOP 24 n, A(aij ), b(b j ) , C −1 x (0 ) , TOL, N r (0 ) = b − Ax (0 ) w = w(0 ) = C −1r v = v (1) = C − t w n α = ∑ w2j j =1 k=1 F k≤N T v ≤ TOL T Output(‘ x1 , , xn ; r1 , , rn ’) STOP F u = Av = Av (k ) t = tk = α ; x = x (k ) = x (k −1) + tv (k ) n ∑v u j =1 j j r = r (k ) = r ( k −1) − tu w = w(k ) = C −1r (k ) n β = ∑ w2j j =1 β < TOL T x1 , , xn ; r1 , , rn ’) STOP F s = sk = Output(‘ β α v = v (k + ) = C −1w + sv (k ) α =β k = k +1 IV.Kết luận : Cả thuật toán Gaus_Seidel Jacobi yêu cầu xấp xỉ đầu X(0) sinh chuỗi X(i) theo công thức truy hồi : x(i+1)=Tx(i)+c 25 Chú ý thuật toán hội tụ bán kính chiếu ma trận lặp p < 1,p nhỏ thuật toán hội tụ nhanh Phân tích vecto lại thuật toán Gauss lên phép lặp SOR, điều ko làm thay đổi ảnh hưởng tham số w đến tốc độ hội tụ thuật toán Thuật toán lặp cải biên sử dụng rộng rãi để giải hệ tuyến tính, điều phát sinh nghiệm thực toán V.Tài liệu tham khảo: Hướng dẫn sử dụng Maple V thầy Nguyễn Hữu Điển 1.Tra cứu mạng : • www.google.com.vn • http://www.thuvienkhoahoc.com • Các forum Lập trình 2.Tài liệu tham khảo : • Giải tích số - Nguyễn Trọng Vinh • Numerical Analysis • Lập trình MathLab • Lập trình Mathematica 26 [...]... trận điều kiện C −1 và xấp xỉ gần đúng x (0 ) o Đầu vào : số lượng phương trình là số chưa biết n ; ma trận A với các thành phần aij , 1 ≤ i, j ≤ n ; vecto b với thành phần b j ,1 ≤ j ≤ n ; ma trận hệ số điều kiện C −1 với các thành phần là γ ij ,1 ≤ i, j ≤ n ; vecto xấp xỉ đầu x (0 ) với các xi ,1 ≤ i ≤ n và số lần lặp lớn nhất là N,sai số cho phép TOL o Đầu ra : các nghiệm xấp xỉ x1 , x2 , , xn và... : Giải bài toán Ax = b với tham số ω và xấp xỉ gần đúng ban đầu x (0 ) - Đầu vào : Số phương trình và số ẩn n ; các phần tử aij ,1 ≤ i, j ≤ n của ma trận A;các thành phần bi ,1 ≤ i ≤ n của vecto b ;các thành phần XOi ;1 ≤ i ≤ n của vecto XO = x (0 ) ; tham số ω ; sai số cho phép TOL ; số lần lặp lớn nhất N - Đầu ra : các nghiệm xấp xỉ x1 , x2 , , xn hoặc thông báo Số lượng tối đa của phép lặp đã bị... ma trận - A;các thành phần bi ,1 ≤ i ≤ n của vecto b ; số lần lặp lớn nhất N ; sai số cho phép TOL ; độ chính xác t chữ số t Đầu ra : xấp xỉ xx = ( xxi ,…, xxn ) hoặc thông báo về số lần lặp bị vượt quá và một xấp xỉ COND gần đến K ∞ ( A) Thuật toán : Bước 0 : Giải hệ Ax = b tìm nghiệm x1 ,…, xn bằng phép loại trừ Gauss , bằng cách giữ lại các hệ số nhân mij , j = i + 1, i + 2,…, n, i = 1,2,…, n − 1... ngắn gọn hơn nhờ vào tham số Omega tốc độ làm việc và hội tụ của thuật toán SOR có thể nói là nhanh hơn khi ta tăng Omega n, A(aij ), b(b j ),ϖ , (0 ) XO = x , TOL, N k=1 F k≤N Output(‘Max…’) STOP T Tính các xi x − XO < TOL T Output(‘ x1 , , xn ’) STOP F k = k +1 Tính các XOi = xi 4.Cải tiến phép lặp : Xấp xỉ nghiệm của hệ tuyến tính Ax = b - Đầu vào : Số phương trình và số ẩn n ; các phần tử aij... Lặp Gauss-Seidel : Giải bài toán Ax = b với xấp xỉ gần đúng là x (0 ) - Đầu vào : Số lượng phương trình và nghiệm n ;các phần tử aij ,1 ≤ i, j ≤ n của ma trận A;các thành phần bi ,1 ≤ i ≤ n của vecto b ;các thành phần XOi ;1 ≤ i ≤ n của vecto XO = x (0 ) ;sai số cho phép TOL ;Số lần lặp lớn nhất N Đầu ra : các nghiệm xấp xỉ x1 , x2 , , xn hoặc thông báo Số lượng tối đa của phép lặp đã bị vượt quá”... dụng rộng rãi để giải các hệ tuyến tính, điều này phát sinh trong nghiệm thực của bài toán V.Tài liệu tham khảo: 1 Hướng dẫn và sử dụng Maple V của thầy Nguyễn Hữu Điển 1.Tra cứu trên mạng bằng : • www.google.com.vn • http://www.thuvienkhoahoc.com • Các forum về Lập trình 2.Tài liệu tham khảo : • Giải tích số - Nguyễn Trọng Vinh • Numerical Analysis • Lập trình MathLab • Lập trình Mathematica 26 ... Bước 9 Bước 3 : Tính vecto r = (ri ) n ri = bi − ∑ aij x j j =1 Bước 4 : Giải hệ tuyến tính Ay = r sử dụng phép loại trừ Gauss như ở Bước 0 Bước 5 : Tính các xxi với i = 1,…, n xxi = xi + yi 20 Bước 6 : Nếu k = 1 thì đặt COND = Bước 7 : Nếu x − xx ∞ y ∞ xx ∞ × 10t < TOL thì OUTPUT(xx); OUTPUT(COND);STOP Bước 8 : Đặt k = k + 1 Bước 9 : Tính các xi = xxi với i = 1, , n Bước 10 : OUTPUT( Số lần lặp tối... hoặc thông báo Số lượng tối đa của phép lặp đã bị vượt quá” Thuật toán : Bước 1 : Tính r (0 ) = b − Ax (0 ) w = w(0 ) = C −1r v = v (1) = C −t w n α = ∑ w2j j =1 Bước 2 : Đặt k = 1 Bước 3 : Kiểm tra điều kiện Trong khi k ≤ N thì làm từ Bước 4 đến Bước 7 Bước4 : If v ≤ TOL then printf (Nghiệm là : x1 , x2 , , xn ) printf (với phần dư là : r1 , r2 , , rn ) STOP Else (Sang Bước 5) Bước 5 : Tính u = Av =... i chạy từ 1 đến n , ta tính các giá trị - i −1 xi = − ∑ aij x (j0 ) − j =1 n ∑a j = i +1 ij XO j + bi aii Bước 4 : Nếu x − XO < TOL thì prinf( x1 , x2 , , xn );STOP Bước 5 : Cập nhật k = k + 1 Bước 6 : Tính vecto XO XOi = xi với i = 1,…, n Bước 7 : Output ( Số lần lặp tối đa đã bị vượt quá!’) STOP 13 n, A(aij ), b(b j ) , XO = x (0 ) , TOL, N k=1 k≤N F Output(‘Max…’) STOP T Tính các xi x − XO < TOL... (k ) n β = ∑ w2j j =1 Bước 6 : Kiểm tra điều kiện If β 〈TOL then printf (Nghiệm là : x1 , x2 , , xn ) printf (với phần dư là : r1 , r2 , , rn ) STOP Else (Sang bước 7) Bước 7 : Tính s = sk = β α v = v (k + ) = C −1w + sv (k ) 23 α = β ; (cập nhật α ) k = k +1 Quay lại Bước 3 Bước 8 : Kiểm tra điều kiện If (k〉 n ) then Printf (Số lượng tối đa của phép lặp đã bị vượt quá ! ) STOP 24 n, A(aij ), b(b j