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 hiện
: 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 và cách cài đặt nó trên chương trình ứng
dụng Maple, để giải quyết bài toán tìm nghiệm xấp xỉ hệ phương trình tuyến tính đại số
Ax = b bằng các phương pháp như Jacobi hay Gauss_Seidel …
Phiên bản sử dụng là Maple 12.Ở đây xin được trình bày 5 thuật toán chính và cài đặt
3 thuật toán đầu tiên bằng Maple 12.
Tuy nhiên do khả năng đọc hiểu tiếng Anh còn hạn chế nên có thể có những chỗ giải
thích chưa thoả đáng,rất mong được sự góp ý của thầy cô và bạn bè.
Xin chân thành cám ơn sự giúp đỡ chỉ bảo tận tình của phó giáo sư Nguyễn Hữu
Điển.
Mọi đóng góp xin gửi về địa chỉ email : hoặc
.
Một lần nữa xin chân thành cám ơn.
Sinh viên trình bày: Lê Minh Cường
Lớp : Toán Tin 1 – K51
2
I.Chuẩn của Vecto và Ma Trận :
1.Chuẩn Vecto :
Để định nghĩa hàm khoảng cách trong không gian R n chúng ta sử dụng khái niệm
về chuẩn, được định nghĩa như sau :
1.1. Định nghĩa 1:Chuẩn của một vecto trong R n ;ký hiệu . ;là một hàm
R n → R thoả mãn các tính chất sau :
i) x ≥ 0; ∀x ∈ R n
ii) x = 0 ⇔ x = 0
iii) αx = α x ; ∀x ∈ R n
iv) x + y ≤ x + y ; ∀x, y ∈ R n
1.2. Định nghĩa 2 : Dạng chuẩn l2 ; l∞ được định nghĩa như sau :
n
∑x
l2 = x 2 =
và l∞ = x ∞ = max xi
2
i
i =1
1≤ i ≤ n
1.3. Định lý Causi-Bunhia-Svac :
t
t
Cho x = ( x1 ,..., xn ) và y = ( y1 ,..., yn ) trong 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
2
i
i =1
= x. y
1.4. Định nghĩa 4 : Cho x = ( x1 ,..., xn ) và y = ( y1 ,..., yn ) trong không gian
t
t
R n .Khoảng cách giữa x và y được định nghĩa theo các chuẩn là :
x− y 2 =
n
∑ (x − y )
2
i =1
i
i
và x − y
∞
= max( xi − yi )
1≤ i ≤ n
1.5. Định nghĩa 5 : Sự hội tụ
Một dãy các vecto {x (k )}k =1 trong R n được gọi là hội tụ đến x với
∞
chuẩn ⋅ khi ∀ε > 0 ,tồn tại 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 trong R n với chú ý là chuẩn . ∞ ,khi
∞
và chỉ khi lim k → ∞ xi(k ) = xi ,với i = 1,..., n
1.7. Định lý :
Với x ∈ R n thì x ∞ ≤ x 2 ≤ n x
∞
2.Chuẩn Ma Trận :
2.1. Định nghĩa : Chuẩn của ma trận trên tập các ma trận vuông n chiều là một hàm số
,định nghĩa trên tập,thỏa mãn tất cả ma trận n × n là A,B và số thực
thực,ký hiệu
α
i) A ≥ 0
3
ii) A = 0 ⇔ A = O
iii) αA = α A
iv) A + B ≤ A + B
v) A.B ≤ A . B
2.1. Định lý : Chuẩn của ma trận được xác định như sau
Az
A = max
= max Az
z ≠0
z =1
z
2.3.Hệ quả : Với mọi vecto z ≠ 0 và matrix A thì : Az ≤ A . z
II.Trị riêng và vecto riêng :
Trong trường hợp A là ma trận vuông n chiều,luôn tồn tại một vecto x song song với
Ax nghĩa là tồn tại hằng số λ sao cho Ax = λx .Từ đó ta có : ( A − λI )x = 0 .Ta tìm hiểu về
mối quan hệ mật thiết giữa λ và sự hợp lý trong thuật toán lặp sẽ hội tụ.
1.Định nghĩa 1 : Nếu A là ma trận vuông thì Đa thức đặc trưng của A là :
p(λ ) = det( A − λI )
2.Định nghĩa 2 : Trị riêng của ma trận A là những giá trị λ thoả mãn phương trình
p(λ ) = 0
Với λ là trị riêng của A và x ≠ 0 thì Vecto riêng của ma trận A là vecto x thoả
( A − λI )x = 0
mãn :
3.Ví dụ :
⎡1 0 2⎤
A = ⎢⎢ 0 1 − 1⎥⎥ Tìm trị riêng và vecto riêng.
⎢⎣− 1 1 1 ⎥⎦
Trong Maple,ta dùng câu lệnh with()để truy xuất gói lệnh linalg (viết tắt của
Linear Algebra) và sử dụng hàm Eigenvals(A) để tính trị riêng của ma trận A :
>with(linalg);
>A:=matriz(3,3, [1,0,2,0,1,-1,-1,1,1]);
>evalf(Eigenvals(A));
Tính cả trị riêng và vecto riêng cùng lúc
> evalf(Eigenvals(A,B));
Hiển thị Matrix B trong đó mỗi cột là một vecto riêng ứng với mỗi trị riêng tìm được
> evalm(B);
4
4. Định nghĩa 3 : Bán kính quy chiếu ρ ( A) của ma trận A được định nghĩa là
ρ ( A) = max λ với λ là trị riêng của A
Đối với λ là giá trị phức thì λ = α + βi = α 2 + β 2
5. Định lý : Nếu A là ma trận vuông n chiều thì :
( )
i) A 2 = ρ At A
ii) ρ ( A) ≤ A
6.Ví dụ :
⎡ 1 1 0⎤
Cho A = ⎢⎢ 1 2 1⎥⎥ Tìm A 2
⎢⎣− 1 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);
5
Hiển thị các trị riêng của ma trận At A
>evalf(Eigenvals(C));
( )
Suy ra ρ At A = max λ = 9,645751311
Suy ra A 2 là : Dùng hàm norm()
>norm(A,2);
>norm(A, infinity);
Ngoài ra ta cũng có thể tìm được giới hạn của 1 vecto bằng hàm VectorLimit nằm trong
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 và học toán.
• Từ Maple 8, gói lệnh Student được phát triển từ gói lệnh student trước đó nhằm hỗ trợ
cho việc dạy và học toán ở đại học và phổ thông. Khai thác khả năng của gói lệnh này sẽ
đem đến cho giáo viên rất nhiều công cụ hỗ trợ mới trong phương pháp dạy học. Có thể
nói rằng gói lệnh này đã đề cập đến tất cả các nội dung toán học của đại học và phổ
6
thông, cung cấp nhiều lệnh và thủ tục cho các phép toán và algorithm xuất hiện trong
chương trình giảng dạy, cung cấp nhiều công cụ tương tác dưới dạng Maplet và hỗ trợ
việc làm
từng bước các phép toán cơ bản của vi tích phân.
• Gói lệnh Student có 3 gói lệnh con là
•
Calculus1
•
LinearAlgebra
•
Precalculus
•
Để nạp từng gói lệnh, làm như 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 1 to 4 do
limvec[i]:=limit(v[i],k=infinity);
od;
vectorlimit:=limvec;
7
> with(Student[NumericalAnalysis]);
> vectorlimit1:=VectorLimit(v,k);
Ta xét ma trận sau và tìm chuẩn của 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 nhất của chuẩn ma trận :
> for i from 1 to 4 do
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]);
8
> Norm(A,2);
> evalf(%);
> Norm(A,Euclidean);
> evalf(%);
III.Giải hệ phương trình tuyến tính bằng kỹ thuật lặp:
1.Phép lặp Jacobi :
Để giải quyết bài toán Ax = b với xấp xỉ gần đúng ban đầu x ( 0)
- Đầu vào : số phương trình và số nghiệm là 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 ;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á”.
Thuật toán :
Bước 1 : Đặt k = 1
Bước 2 : Trong khi (k ≤ N ) thì thực hiện từ Bước 3 đến Bước 6
Bước 3 : Tính các giá trị
− ∑ (aij XO j ) + bi
n
j =1
xi =
j ≠i
; với i = 1,…, n
aii
Bước 4 : Nếu x − XO < TOL thì prinf( x1 , x2 ,..., xn );
STOP.(thoát khỏi chương trình con)
Bước 5 : Update k = k + 1
Bước 6 : Tính toán vecto XO
XOi = x i ; với i = 1,…, n
Bước 7 : Output “Số lần lặp tối đa đã bị vượt quá!”
STOP.
9
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
T
Output(‘ x1 ,..., xn ’)
STOP
F
k = k +1
Tính các XOi = xi
> restart;
> with(LinearAlgebra):
> libname:="c:/nalib",libname;
Chương trình con 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 1 to N do
printf(`% 12.8f`,X0[I]);
if I<>N then printf(`,`) fi;
od;
printf(`]\n`);
10
K:=1;
> while OK = FALSE and K <= NN do
> ERR := 0;
> for I from 1 to N do
> S := 0;
> for J from 1 to I-1 do
> S := S-A[I,J]*X0[J];
> od;
> for J from I+1 to N do
> 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 1 to N do
printf(`% 12.8f`,X1[I]);
if I<>N then printf(`,`) fi;
od;
printf(`]\n`);
> if ERR <= TOL then
> OK := TRUE;
> fi;
> K := K+1;
> for I from 1 to N do
> X0[I] := X1[I];
> od;
> od;
> if OK = FALSE then
> printf(`Maximum Number of Iterations Exceeded.\n`);
> else
> printf(`\nThe solution vector is\n`,args[6]);
> v:=evalm(X1);
fi;
end;
Kết thúc chương trình con.Bắt đầu nhập dữ liệu và sử dụng :
> 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;
11
> b:=Vector(4,[6,25,-11,15]);
> v:=jacobi(A,b,Vector(4,[0,0,0,0]),10^(-6),100,v);
n
x
0
[ 0.00000000, 0.00000000, 0.00000000, 0.00000000]
1
[ 0.60000000, 2.27272727, -1.10000000, 1.87500000]
2
[ 1.04727273, 1.71590909, -0.80522727, 0.88522727]
3
[ 0.93263636, 2.05330578, -1.04934091, 1.13088068]
4
[ 1.01519876, 1.95369576, -0.96810863, 0.97384272]
5
[ 0.98899130, 2.01141472, -1.01028590, 1.02135051]
6
[ 1.00319865, 1.99224126, -0.99452174, 0.99443374]
7
[ 0.99812847, 2.00230688, -1.00197223, 1.00359431]
8
[ 1.00062513, 1.99867030, -0.99903558, 0.99888839]
9
[ 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
[ 0.00000000, 0.00000000, 0.00000000, 0.00000000]
1
[ 0.60000000, 2.27272727, -1.10000000, 1.87500000]
2
[ 1.04727273, 1.71590909, -0.80522727, 0.88522727]
3
[ 0.93263636, 2.05330578, -1.04934091, 1.13088068]
4
[ 1.01519876, 1.95369576, -0.96810863, 0.97384272]
5
[ 0.98899130, 2.01141472, -1.01028590, 1.02135051]
6
[ 1.00319865, 1.99224126, -0.99452174, 0.99443374]
7
[ 0.99812847, 2.00230688, -1.00197223, 1.00359431]
12
8
[ 1.00062513, 1.99867030, -0.99903558,
9
[ 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 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á”.
Thuật toán :
Bước 1 : Đặt k = 1
Bước 2 : Trong khi (k ≤ N ) thì thực hiện từ Bước 3 đến Bước 6
Bước 3 : Cho 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
T
Output(‘ x1 ,..., xn ’)
STOP
F
k = k +1
Tính các 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 1
> K := 0;
> OK := FALSE;
printf(` n
x\n`);
printf(` -\n`);
printf(`%3d
[`,K);
for I from 1 to N do
14
printf(`% 12.8f`,X0[I]);
if I<>N then printf(`,`) fi;
od;
printf(`]\n`);
K:=1;
STEP 2
> while OK = FALSE and K <= NN do
> ERR := 0;
STEP 3
> for I from 1 to N do
> S := 0;
> for J from 1 to I-1 do
> S := S-A[I,J]*X1[J];
> od;
> for J from I+1 to N do
> 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 1 to N do
printf(`% 12.8f`,X1[I]);
if I<>N then printf(`,`) fi;
od;
printf(`]\n`);
STEP 4
> if ERR <= TOL then
> OK := TRUE;
> fi;
STEP 5
> K := K+1;
STEP 6
> for I from 1 to N do
> X0[I] := X1[I];
> od;
> od;
> if OK = FALSE then
> printf(`Maximum Number of Iterations Exceeded.\n`);
STEP 7
> else
> printf(`\nThe solution vector is\n`,args[6]);
> v:=evalm(X1);
fi;
end;
Kết thúc chương trình con và bắt đầu nhập dữ 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
[ 0.00000000, 0.00000000, 0.00000000, 0.00000000]
1
[ 0.60000000, 2.32727273, -0.98727273, 0.87886364]
2
[ 1.03018182, 2.03693802, -1.01445620, 0.98434122]
3
[ 1.00658504, 2.00355502, -1.00252738, 0.99835095]
4
[ 1.00086098, 2.00029825, -1.00030728, 0.99984975]
5
[ 1.00009128, 2.00002134, -1.00003115, 0.99998810]
6
[ 1.00000836, 2.00000117, -1.00000274, 0.99999922]
7
[ 1.00000067, 2.00000002, -1.00000021, 0.99999996]
8
[ 1.00000004, 2.00000000, -1.00000001, 1.00000000]
The solution vector is
Từ đây ta thấy giải thuật Gauss-Seidel có tốc độ hội tụ nhanh hơn giải thuật
Jacobi.
3.Thuật toán SOR :
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ị vượt quá”.
Thuật toán :
16
Bước 1 : Đặt k = 1
Bước 2 : Trong khi (k ≤ N ) thì thực hiện lặp từ Bước 3 đến Bước 6
Bước 3 : 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 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.
> 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 1 to N do
printf(`% 12.8f`,X0[I]);
if I<>N then printf(`,`) fi;
od;
printf(`]\n`);
K:=1;
> while OK = FALSE and K <= NN do
> ERR := 0;
> for I from 1 to N do
> S := 0;
> for J from 1 to I-1 do
> S := S-A[I,J]*X1[J];
17
> od;
> for J from I+1 to N do
> 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 1 to N do
printf(`% 12.8f`,X1[I]);
if I<>N then printf(`,`) fi;
od;
printf(`]\n`);
> if ERR <= TOL then
> OK := TRUE;
> fi;
> K := K+1;
> for I from 1 to N do
> 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 dữ liệu và 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
0
[ 1.00000000, 1.00000000, 1.00000000]
1
[ 5.25000000, 3.81250000, -5.04687500]
2
[ 3.14062500, 3.88281250, -5.02929688]
18
3
4
5
6
7
8
9
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< < 2 là
> v:='v';
= 1.25
> > v:=SOR(A,b,1.25,Vector(3,[1,1,1]),10^(-6),100,v);
n
x
0
[ 1.00000000, 1.00000000, 1.00000000]
1
[ 6.31250000, 3.51953125, -6.65014648]
2
[ 2.62231445, 3.95852661, -4.60042381]
3
[ 3.13330269, 4.01026464, -5.09668635]
4
[ 2.95705123, 4.00748383, -4.97348972]
5
[ 3.00372110, 4.00292497, -5.00571352]
6
[ 2.99632756, 4.00092620, -4.99828218]
7
[ 3.00004980, 4.00025858, -5.00034865]
8
[ 2.99974513, 4.00006534, -4.99989242]
9
[ 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 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 ,1 ≤ i, j ≤ n của 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 và
Bước 1 : Đặt k = 1
Bước 2 : Trong khi (k ≤ N ) thì thực hiện từ Bước 3 đến 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 đ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 bài toán Ax=b với ma 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à phần dư r1 , r2 ,..., rn 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 = 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 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 ) , 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ả 2 thuật toán Gaus_Seidel và Jacobi đều yêu cầu xấp xỉ đầu bất kỳ X(0) và sinh ra một
chuỗi các X(i) theo công thức truy hồi : x(i+1)=Tx(i)+c
25