Tải bản đầy đủ (.docx) (21 trang)

Gauss seidel PYTHON LINUX

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (334.19 KB, 21 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT - HUNG
KHOA CÔNG NGHỆ THÔNG TIN
…..o0o…..

BÁO CÁO KẾT THÚC HỌC PHẦN

LINUX VÀ PHẦN MỀM MÃ NGUỒN MỞ
GIẢI THUẬT GAUSS SEIDEL

Hà Nội - Năm 2023


TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT - HUNG
KHOA CÔNG NGHỆ THÔNG TIN
…..o0o…..

BÁO CÁO KẾT THÚC HỌC PHẦN

LINUX VÀ PHẦN MỀM MÃ NGUỒN MỞ
Giảng viên hướng dẫn

: Hà Đăng Tồn

Nhóm sinh viên thực hiện

: Phạm Tuấn Duy
: Hoàng Quốc Tuấn

Lớp

: K43CNT2



Hà Nội - Năm 2023



MỤC LỤC
MỤC LỤC.......................................................................................................................... 1
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT...................................................................................2
1.1.Giới thiệu về Gauss-Seidel........................................................................................2
1.2. Tiêu chí hội tụ cho phương pháp Gauss-Seidel........................................................4
1.3. Cải thiện tính hội tụ bằng cách sử dụng phương pháp Relaxation...........................7
1.4. Thuật toán cho Gauss-Seidel....................................................................................7
1.5. Các bối cảnh vấn đề cho phương pháp Gauss-Seidel...............................................8
CHƯƠNG 2: THUẬT TOÁN GAUSS SEIDEL..............................................................10
2.1 Thuật tốn chương trình..........................................................................................10
2.2. Source code chương trình......................................................................................14
2.3 Kết quả chạy kiểm thử chương trình.......................................................................17
TÀI LIỆU THAM KHẢO................................................................................................18

1


CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1.

Giới thiệu về Gauss-Seidel
Các phương pháp lặp lại hoặc gần đúng cung cấp một giải pháp thay thế cho các
phương pháp loại bỏ được mô tả cho đến thời điểm này. Những cách tiếp cận đó bao gồm
đốn một giá trị và sau đó sử dụng một phương pháp có hệ thống để có được ước tính
chính xác của gốc. Bởi vì phần hiện tại của cuốn sách đề cập đến một vấn đề tương tự thu

được các giá trị đồng thời thỏa mãn một tập hợp các phương trình, chúng ta có thể nghi
ngờ rằng các phương pháp gần đúng như vậy có thể hữu ích trong bối cảnh này.
Phương pháp Gauss-Seidel là phương pháp lặp được sử dụng phổ biến nhất. Giả sử
rằng chúng ta được cung cấp một bộ n phương trình:

[ A ] { X }={B }
Giả sử rằng để cho ngắn gọn, chúng ta giới hạn bản thân trong một bộ phương
trình 3 ×3. Nếu các phần tử đường chéo đều khác khơng, phương trình đầu tiên có thể
được giải cho x 1, phương trình thứ hai cho x 2và thứ ba cho x 3 để mang lại
x 1=

b1−a12 x 2−a13 x3
(11.5 a)
a 11

x 2=

b2−a21 x 1−a 23 x 3
(11.5 b)
a 22

x 3=

b3−a31 x 1−a 32 x 2
(11.5 c)
a33

Bây giờ, chúng ta có thể bắt đầu q trình giải bằng cách chọn các dự đoán cho x.
Một cách đơn giản để có được những dự đốn ban đầu là giả sử rằng tất cả chúng đều
bằng không. Những số không này có thể được thay thế thành phương trình. Phần (11.5a),

có thể dùng để tính giá trị mới cho x 1=b1 /a 11. Sau đó, ta thay thế giá trị mới này của x 1
cùng với dự đốn trước đó về 0 cho x 3 vào phương trình. Phần (11.5b) để tính tốn giá trị
mới cho x 2. Q trình này được lặp lại cho phương trình. Phần (11.5c) để tính ước lượng
mới cho x 3. Sau đó, chúng tơi quay lại phương trình đầu tiên và lặp lại tồn bộ quy trình
cho đến khi giải pháp của chúng tơi hội tụ đủ gần với các giá trị thực. Sự hội tụ có thể
được kiểm tra bằng cách sử dụng tiêu chí.

|

|ε a ,i|=

xi j−x i j−1
xi j

|

100 % <ε s (11.6)

với tất cả i, trong đó j và j−1 là các lần lặp lại hiện tại và trước đó.
Ví dụ:
Vấn đề: Sử dụng phương pháp Gauss-Seidel để thu được giải pháp tương tự hệ thống
2


3x1  0.1x2  0.2 x3 7.85
0.1x1  7 x2  0.3 x3  19.3
0.3x1  0.2 x2  10 x3 71.4
Xử lí giá trị với

x1 3 , x2  2.5 , x3 7


Giải pháp: Đầu tiên ta có
x1 

7.85  0.1x2  0.2 x3
3
(E11.3.1)

x2 

 19.3  0.1x1  0.3 x3
7
(E.11.3.2)

x3 

71.4  0.3x1  0.2 x2
10
(E.11.3.3)

Bằng cách giả sử rằng x 2và x 3bằng 0 thì E11.3.1 có thể được sử dụng để tính tốn
x1 

7.85  0  0
2.616667
3

Giá trị này, cùng với giá trị giả định của x 3=¿ 0, có thể được thay thế vào E11.3.2 tính
tốn
x2 


 19.3  0.1(2.616667)  0
 2.794524
7

Tương tự x 3 trong trường hợp này sẽ là
x3 

71.4  0.3(2.616667)  0.1(  2.794524)
7.005610
10

Với lần 2 ta có giá trị là

x1 

7.85  0.1( 2.794524)  0.2  7.005610 
3

2.990557

εt

| |

x2 

 19.3  0.1(2.990557)  0.3(7.005610)
 2.499625
10


| |

x3 

71.4  0.3( 2.990557)  0.1( 2.499625)
7.000291
10

| |

εt
εt

= 0.31%
= 0.015%
= 0.0042%

Do đó, phương pháp này hội tụ trên nghiệm thực. Các lần lặp bổ sung có thể được
áp dụng để cải thiện các câu trả lời. Tuy nhiên, trong một vấn đề thực tế, chúng tôi sẽ
3


không biết câu trả lời thực sự tiên nghiệm. Do đó, (11.6) cung cấp phương tiện để ước
lượng sai số.
Ví dụ, đối với x 1,

|2.990557−2.616667
|100 %=12.5 %
2.990557


|ε a ,1|=

Đối với x 2, và x 3,, ước tính lỗi là |ε a ,2| = 11,8% và |ε a ,3|= 0,076%. Lưu ý rằng,
giống như trường hợp xác định nghiệm của một phương trình, các cơng thức như phương
trình (11.6) thường đưa ra đánh giá thận trọng về sự hội tụ. Vì vậy, khi chúng được đáp
ứng, chúng đảm bảo rằng kết quả được biết đến với ít nhất dung sai được chỉ định bởi ε s.
Vì mỗi giá trị x mới được tính cho phương pháp Gauss-Seidel, nó ngay lập tức
được sử dụng trong phương trình tiếp theo để xác định giá trị x khác. Do đó, nếu giải
pháp hội tụ, các ước tính khả dụng tốt nhất sẽ được sử dụng. Một cách tiếp cận khác,
được gọi là phép lặp Jacobi, sử dụng một chiến thuật hơi khác. Thay vì sử dụng x ' s mới
nhất hiện có, kỹ thuật này sử dụng phương trình. (11.5) để tính tập hợp x ' s mới trên cơ sở
tập hợp x ' s cũ. Do đó, khi các giá trị mới được tạo ra, chúng không được sử dụng ngay
lập tức mà được giữ lại cho lần lặp tiếp theo.
Sự khác biệt giữa phương pháp Gauss-Seidel và phép lặp Jacobi được mô tả trong
hình 11.4. Mặc dù có một số trường hợp nhất định mà phương pháp Jacobi hữu ích,
nhưng việc sử dụng các ước tính tốt nhất hiện có của Gauss-Seidel thường khiến nó trở
thành phương pháp được ưu tiên.
1.2. Tiêu chí hội tụ cho phương pháp Gauss-Seidel
Lưu ý rằng phương pháp Gauss-Seidel có tinh thần tương tự như kỹ thuật lặp lại
điểm cố định đơn giản đã được sử dụng trong Sec. 6.1 để giải nghiệm của một phương
trình. Nhớ lại rằng phép lặp điểm cố định đơn giản có hai vấn đề cơ bản: (1) đơi khi nó
khơng hội tụ và (2) khi nó hội tụ, nó thường hội tụ rất chậm. Phương pháp GaussSeidel
cũng có thể bộc lộ những thiếu sót này.

4


Hình 11.4: Mơ tả đồ họa về sự khác biệt giữa (a) Gauss-Seidel và (b) các phương pháp lặp
Jacobi để giải các phương trình đại số tuyến tính đồng thời.

Tiêu chí hội tụ có thể được phát triển bằng cách gọi lại từ Sec. 6.5.1 điều kiện đủ
để hai phương trình phi tuyến tính hội tụ u(x , y) và v ( x , y ) là

|

u
u
v
v
|  | | 1
| |  | | 1
x
y
y
(11.7a) và x
(11.7b)

Các tiêu chí này cũng áp dụng cho các phương trình tuyến tính thuộc loại mà
chúng ta đang giải bằng phương pháp Gauss-Seidel. Ví dụ, trong trường hợp có hai
phương trình đồng thời, thuật tốn GaussSeidel [Eq. (11.5)] có thể được biểu thị dưới
dạng
u ( x1 , x2 ) 

b1 a12
b
a

x2
v( x1 , x2 )  2  21 x1
a11 a11 (11.8a) và

a22 a22 (11.8b)

Các đạo hàm riêng của các phương trình này có thể được đánh giá đối với từng ẩn
số như
5


|a11| > |a12| và |a22| > |a21|
Nghĩa là, phần tử đường chéo phải lớn hơn phần tử ngoài đường chéo cho mỗi
hàng.
Việc mở rộng các phương trình trên thành n rất đơn giản và có thể được biểu thị bằng
n

| a

ij

|

j 1
j 1

|a11|
>
(11.10)
Hình 11.5: Mạng nhện lặp đi lặp lại minh họa (a) hội tụ và (b) phân kỳ của
phương pháp Gauss-Seidel. Phải lưu ý rằng các hàm giống nhau được vẽ trong cả hai

11x 13 x 286; v :11x  9 x


1
2
1
2 ). Do đó, thứ tự mà các phương trình được thực
trường hợp (u:
hiện (như được mơ tả bởi hướng của mũi tên đầu tiên tính từ gốc tọa độ) quyết định liệu
phép tính có hội tụ hay khơng.

Nghĩa là, hệ số đường chéo trong mỗi phương trình phải lớn hơn tổng các giá trị
tuyệt đối của các hệ số khác trong phương trình. Tiêu chí này là đủ nhưng khơng cần thiết
cho sự hội tụ. Đó là, mặc dù phương pháp này đơi khi có thể hoạt động nếu
phương trình (11.10) khơng thỏa mãn, đảm bảo hội tụ nếu thỏa mãn điều kiện. Các hệ
thống có phương trình. (11.10) giữ được gọi là diagonally dominant. May mắn thay,
nhiều vấn đề kỹ thuật có tầm quan trọng thực tế đáp ứng yêu cầu này.
6


1.3. Cải thiện tính hội tụ bằng cách sử dụng phương pháp Relaxation.
Phương pháp Relaxation đại diện cho một sự thay đổi nhỏ của phương pháp
Gauss-Seidel và được thiết kế để tăng tính hội tụ. Sau khi tính tốn giá trị mới của x bằng
cách sử dụng công thức (11.5), giá trị đó được điều chỉnh bằng trung bình có trọng số của
kết quả của các lần lặp trước và hiện tại.

xinew  xinew  (1   ) xiold
trong đó là hệ số trọng số được gán giá trị trong khoảng từ 0 đến 2.
Nếu  = 1, (1 -  ) bằng 0 và kết quả không thay đổi. Tuy nhiên, nếu  được đặt ở
giá trị trong khoảng từ 0 đến 1, thì kết quả là giá trị trung bình có trọng số của kết quả
hiện tại và kết quả trước đó. Loại sửa đổi này được gọi là underrelaxation. It is typically
employed to make a nonconvergent system converge or to hasten convergence by
dampening out oscillations.

Đối với các giá trị của  từ 1 đến 2, trọng lượng bổ sung được đặt trên giá trị hiện
tại. Trong trường hợp này, có một giả định ngầm định rằng giá trị mới đang di chuyển
đúng hướng hướng tới giải pháp thực sự nhưng với tốc độ quá chậm. Do đó, trọng số 
được thêm vào nhằm mục đích cải thiện ước tính bằng cách đẩy nó đến gần hơn với sự
thật. Do đó, loại sửa đổi này, được gọi là overrelaxation, được thiết kế để tăng tốc độ hội
tụ của một hệ thống đã hội tụ. Cách tiếp cận còn được gọi là successive hoặc
simultaneous overrelaxation, hoặc SOR.
Việc lựa chọn một giá trị phù hợp cho  có tính đặc thù cao đối với vấn đề và
thường được xác định theo kinh nghiệm. Đối với một giải pháp duy nhất của một tập hợp
các phương trình, điều đó thường không cần thiết. Tuy nhiên, nếu hệ đang nghiên cứu
phải được giải nhiều lần, thì hiệu quả do sự lựa chọn khơn ngoan của  có thể cực kỳ
quan trọng. Các ví dụ điển hình là các hệ phương trình đạo hàm riêng rất lớn thường xuất
hiện khi mơ hình hóa các biến thiên liên tục (nhớ lại hệ thống phân tán được mơ tả trong
Hình. PT3.1b)
1.4. Thuật tốn cho Gauss-Seidel
Một thuật toán cho phương pháp Gauss-Seidel, với Relaxation, được miêu tả trong
hình 11.6. Lưu ý rằng thuật tốn này khơng được đảm bảo hội tụ nếu các phương trình
khơng được nhập dưới dạng đường chéo ưu tiên. Pseudocode có hai đặc điểm cần đề cập.
Thứ nhất, có một tập hợp các vòng lặp lồng nhau ban đầu để chia mỗi phương trình cho
phần tử đường chéo của nó. Điều này giảm tổng số phép tính trong thuật tốn. Thứ hai,
lưu ý rằng kiểm tra lỗi được định danh bằng một biến được gọi là sentinel. Nếu bất kỳ
phương trình nào có sai số xấp xỉ lớn hơn tiêu chuẩn dừng (es), thì các lần lặp được phép
tiếp tục. Việc sử dụng sentinel là để kiểm soát việc dừng của thuật toán cho phép chúng
7


tơi bỏ qua các tính tốn ước tính lỗi khơng cần thiết khi một trong các phương trình vượt
quá tiêu chí.

Hình 11.6: Mã giả cho Gauss-Seidel với thư giãn.


8


1.5. Các bối cảnh vấn đề cho phương pháp Gauss-Seidel.
Bên cạnh việc phá vỡ thế tiến thoái lưỡng nan, kỹ thuật Gauss-Seidel cịn có một
số ưu điểm khác khiến nó trở nên đặc biệt hấp dẫn trong bối cảnh của một số vấn đề kỹ
thuật. Ví dụ: khi ma trận được đề cập rất lớn và rất thưa thớt (nghĩa là hầu hết các phần tử
đều bằng 0), các phương pháp loại bỏ sẽ lãng phí một lượng lớn bộ nhớ máy tính bằng
cách lưu trữ các số khơng.
Ở phần đầu của chương này, chúng ta đã thấy khuyết điểm này có thể được khắc
phục như thế nào nếu ma trận hệ số được phân dải. Đối với các hệ thống khơng có băng
tần, thường khơng có cách đơn giản nào để tránh các yêu cầu bộ nhớ lớn khi sử dụng các
phương pháp loại bỏ. Bởi vì tất cả các máy tính đều có một lượng bộ nhớ hữu hạn, sự
kém hiệu quả này có thể đặt ra một hạn chế về kích thước của các hệ thống mà các
phương pháp loại bỏ là thực tế.
Mặc dù một thuật tốn tổng qt như thuật tốn trong Hình 11.6 cũng có xu hướng
gặp hạn chế tương tự, nhưng cấu trúc của các phương trình Gauss-Seidel [Eq. (11.5)] cho
phép phát triển các chương trình ngắn gọn cho các hệ thống cụ thể. Bởi vì chỉ các hệ số
khác khơng cần được đưa vào biểu thức. (11.5), có thể tiết kiệm được nhiều bộ nhớ máy
tính. Mặc dù điều này địi hỏi phải đầu tư nhiều hơn vào phát triển phần mềm, nhưng lợi
ích lâu dài là đáng kể khi xử lý các hệ thống lớn mà nhiều mô phỏng sẽ được thực hiện.
Cả hai hệ thống biến gộp và phân tán đều có thể dẫn đến các ma trận lớn, thưa thớt mà
phương pháp Gauss-Seidel có ích.

9


CHƯƠNG 2: THUẬT TỐN GAUSS SEIDEL
2.1 Thuật tốn chương trình

 Định nghĩa hàm Gseid
Mô tả: Đoạn code này là phần thực hiện thuật tốn lặp Gauss-Seidel để giải hệ
phương trình tuyến tính. Cụ thể, đoạn code này định nghĩa một hàm Gseid với các tham
số đầu vào là ma trận hệ số A, vector vế phải b, số phương trình và số ẩn n, vector nghiệm
ban đầu x, số lần lặp tối đa imax, sai số tuyệt đối es và hệ số lặp lamda. Hàm Gseid sử
dụng phương pháp lặp Gauss-Seidel để tính tốn giá trị của các phần tử trong vector
nghiệm x. Phương pháp lặp Gauss-Seidel là một phương pháp lặp dựa trên công thức xấp
xỉ mới của các nghiệm x. Thuật toán này bắt đầu với một vector nghiệm ban đầu và sử
dụng cơng thức lặp để tính toán giá trị mới của các phần tử trong vector nghiệm x. Sau
đó, ta kiểm tra sai số tuyệt đối của các phần tử trong vector nghiệm x so với giá trị cũ của
chúng. Nếu sai số nhỏ hơn hay bằng sai số tuyệt đối cần đạt được, ta dừng thuật tốn và
trả về vector nghiệm x. Nếu khơng, ta tiếp tục lặp lại q trình tính tốn với các giá trị x
mới.
Cụ thể, ta thực hiện như sau:


Bước 1: Ta thực hiện phép chia hàng của ma trận A và vector b cho phần tử chính
của hàng đó, để đưa ma trận A về dạng ma trận tam giác trên.



Bước 2: Ta sử dụng phương pháp lặp Gauss-Seidel để tính tốn giá trị của các
phần tử trong vector nghiệm x. Cụ thể, ta sử dụng công thức lặp để tính tốn giá trị
của x[i] từ các giá trị x[j] của các phần tử trước đó.



Bước 3: Ta tiếp tục lặp lại q trình tính tốn giá trị của vector nghiệm x đến khi
đạt được điều kiện dừng hoặc vượt quá số lần lặp tối đa. Trong quá trình lặp, ta sử
dụng một biến sentinel để kiểm tra xem có phải đã đạt được điều kiện dừng hay

chưa. Nếu sentinel = 1 và x[i] khác 0, ta tính sai số tuyệt đối ea của x[i] so với giá
trị cũ của x[i]. Nếu ea nhỏ hơn hay bằng sai số tuyệt đối cần đạt được (es), ta đặt
sentinel = 0 để kết thúc quá trình lặp và trả về vector nghiệm x.
Cụ thể, công thức lặp như sau:
x[i ] lamda  (1  lamda ) x[i ]

Trong đó, s là giá trị đại diện cho tổng các phần tử trong hàng i của ma trận A nhân
với các giá trị tương ứng của vector x, ngoại trừ x[i]. Ta sử dụng hệ số lặp lamda
để điều chỉnh độ nhanh của quá trình hội tụ. Hệ số lamda thường được chọn trong
khoảng từ 1 đến 2.



Bước 4: Ta trả về vector nghiệm x.
10


Các biến được sử dụng trong đoạn code này bao gồm:


a: ma trận hệ số A



b: vector vế phải b



n: số phương trình và số ẩn




x: vector nghiệm ban đầu



lamda: hệ số lặp



imax: số lần lặp tối đa



es: sai số tuyệt đối



iter: số lần lặp đã thực hiện



sentinel: biến kiểm tra điều kiện dừng



old: giá trị cũ của x[i]




s: giá trị đại diện cho tổng các phần tử trong hàng i của ma trận A nhân với các giá
trị tương ứng của vector x, ngoại trừ x[i]



ea: sai số tuyệt đối của x[i] so với giá trị cũ của x[i]

Mã nguồn:
for i in range(n):
dummy = a[i, i]
for j in range(n):
a[i, j] /= dummy
b[i] /= dummy

for i in range(n):
s = b[i]
for j in range(n):
if i != j:
s -= a[i, j] * x[j]
x[i] = lamda * s + (1 - lamda) * x[i]

11


iter = 1
while True:
sentinel = 1
for i in range(n):
old = x[i]
s = b[i]

for j in range(n):
if i != j:
s -= a[i, j] * x[j]
x[i] = lamda * s + (1 - lamda) * old

if sentinel == 1 and x[i] != 0:
ea = abs((x[i] - old) / x[i]) * 100
if ea <= es:
sentinel = 0

iter += 1
if sentinel == 1 or iter > imax:
break

return x

 Khởi tạo ma trận hệ số A và vector b và khởi tạo vector x ban đầu
Mô tả: Đoạn code trên khởi tạo ma trận hệ số A và vector vế phải b của hệ phương
trình tuyến tính. Cụ thể, ma trận hệ số A là một ma trận vng có kích thước 3x3, với các
giá trị của các phần tử được cung cấp bởi các thông số [4, 1, 1], [2, 7, 1], [1, 2, 6]. Các giá
trị này thể hiện các hệ số của các biến trong hệ phương trình tuyến tính. Vector vế phải b
cũng có kích thước 3, với các giá trị của các phần tử được cung cấp bởi các thông số 9, 7,
15. Các giá trị này thể hiện các hệ số tự do trong hệ phương trình tuyến tính.
12


Sau đó, đoạn code khởi tạo vector nghiệm ban đầu x với kích thước 3 và các giá trị
ban đầu của các phần tử bằng 0. Điều này sẽ được sử dụng trong thuật tốn lặp GaussSeidel để tính tốn giá trị của các phần tử trong vector nghiệm x.
Mã nguồn:
# Khở

+ i tạo ma trận hệ số0A và vector b
A = np.array([[4, 1, 1],
[2, 7, 1],
[1, 2, 6]])
b = np.array([9, 7, 15])

# Khở
+ i tạo vector x ban đầ?
u
x = np.zeros(3)

 Gọi hàm Gseid để giải hệ phương trình
Mơ tả: Đoạn code trên gọi hàm Gseid để giải hệ phương trình tuyến tính với ma trận
hệ số A, vector vế phải b và vector nghiệm ban đầu x đã được khởi tạo trước đó.
Cụ thể, ta đặt giá trị n = 3 là số phương trình và số ẩn trong hệ phương trình tuyến
tính.
Sau đó, ta đặt giá trị imax = 100 là số lần lặp tối đa của thuật toán lặp Gauss-Seidel.
Giá trị es = 1e-5 là sai số tuyệt đối cần đạt được trong quá trình giải hệ phương trình.
Hệ số lặp lamda được đặt giá trị là 1.2.
Cuối cùng, ta gọi hàm Gseid với các tham số đã được định nghĩa trước đó để tính tốn
vector nghiệm của hệ phương trình tuyến tính. Kết quả được lưu trữ trong biến result.
Mã nguồn:
n = 3
imax = 100
es = 1e-5
lamda = 1.2
result = Gseid(A, b, n, x, imax, es, lamda)
 In kết quả
13



Mô tả: Đoạn code trên in ra kết quả của hệ phương trình tuyến tính đã được giải bằng
phương pháp lặp Gauss-Seidel.
Cụ thể, ta sử dụng một vòng lặp for để in ra giá trị của các phần tử trong vector
nghiệm x. Đối với mỗi phần tử x[i], ta in ra giá trị của x[i] cùng với chỉ số của phần tử đó.
Cuối cùng, ta in ra thơng báo "Nghiệm của hệ phương trình:" để đánh dấu kết quả
được in ra.
Mã nguồn:
# In kế0
t qua
+
print("Nghiệm cu
+a hệ phưởng trình:")
for i in range(n):
print(f"x[{i+1}] = {result[i]}")
2.2. Source code chương trình
import numpy as np

# Định nghĩa hàm Gseid
def Gseid(a, b, n, x, imax, es, lamda):
for i in range(n):
dummy = a[i, i]
for j in range(n):
a[i, j] /= dummy
b[i] /= dummy

for i in range(n):
s = b[i]
for j in range(n):
if i != j:

s -= a[i, j] * x[j]
x[i] = lamda * s + (1 - lamda) * x[i]

14


iter = 1
while True:
sentinel = 1
for i in range(n):
old = x[i]
s = b[i]
for j in range(n):
if i != j:
s -= a[i, j] * x[j]
x[i] = lamda * s + (1 - lamda) * old

if sentinel == 1 and x[i] != 0:
ea = abs((x[i] - old) / x[i]) * 100
if ea <= es:
sentinel = 0

iter += 1
if sentinel == 1 or iter > imax:
break

return x
# Khở
+ i tạo ma trận hệ số0A và vector b
A = np.array([[4, 1, 1],

[2, 7, 1],
[1, 2, 6]])
b = np.array([9, 7, 15])

15


# Khở
+ i tạo vector x ban đầ?
u
x = np.zeros(3)

# Gọi hàm Gseid đế+gia
+i hệ phưởng trình
n = 3
imax = 100
es = 1e-5
lamda = 1.2

result = Gseid(A, b, n, x, imax, es, lamda)

# In kế0
t qua
+
print("Nghiệm cu
+a hệ phưởng trình:")
for i in range(n):
print(f"x[{i+1}] = {result[i]}")

16



2.3 Kết quả chạy kiểm thử chương trình

Dữ liệu kiểm thử lần 1

Kết quả trả ra lần 1

Dữ liệu kiểm thử lần 2

Kết quả trả ra lần 2

Dữ liệu kiểm thử lần 3

Kết quả trả ra lần 3

17



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×