You are on page 1of 11

Họ và tên : Nguyễn Thanh Vinh

Mssv : 102220092
Lớp sh : 22T_DT1
Giải nghiệm bằng phương pháp Gauss-Siedel và phương pháp giảm dư:

a)

b)

c)

* PHƯƠNG PHÁP GAUSS-SIEDEL:

a)

Ta có: Thỏa mãn điều kiện hội tụ phương pháp Gauss-Siedel.

6.124243 1.035714 4.997895 2.290515

8.704139 1.267364 6.702824 2.567170

9.763984 1.385930 7.409607 2.685077

10.203775 1.436461 7.703256 2.734245

10.386519 1.457534 7.825294 2.754690

10.462469 1.466296 7.876016 2.763187


10.494035 1.469937 7.897096 2.766719

10.507154 1.471451 7.905857 2.768187

10.512606 1.472080 7.909498 2.768797

10.514872 1.472342 7.911012 2.769050

10.515814 1.472450 7.911641 2.769156

10.516205 1.472495 7.911902 2.769199

10.516368 1.472514 7.912011 2.769218

Vậy: Nghiệm của hệ phương trình là .

b)

Ta có: Thỏa mãn điều kiện hội tụ phương pháp Gauss-Siedel.

2.250000 2.187500 -3.625000

2.812500 2.046875 -3.906250

2.953125 2.011719 -3.976563

2.988281 2.002930 -3.994141

2.997070 2.000732 -3.998535

2.999268 2.000183 -3.999634

2.999817 2.000046 -3.999908


2.999954 2.000011 -3.999977

Vậy: Nghiệm của hệ phương trình là .

c)

Ta có: Thỏa mãn điều kiện hội tụ phương pháp Gauss-Siedel.

1.148148 0.154321 0.753772

1.363969 0.004306 0.765174

1.410173 -0.009196 0.757273

1.417307 -0.012890 0.756948

1.418648 -0.013391 0.756779

1.418871 -0.013494 0.756762

Vậy: Nghiệm của hệ phương trình là .

CODE PHƯƠNG PHÁP GAUSS-SIEDEL:

#include <stdio.h>
#include <math.h>
int n; float a[5][5]; float b[5][5]; float c[5],d[5],e[5];
void inp() {
printf("Nhap bac cua ma tran: ");
scanf("%d",&n);
for(int i =1 ; i<=n ; i++) {
for(int j =1 ; j<=n+1; j++){
scanf("%f", &a[i][j]);
}
}
}
void gauss(){
float maxx = 0;
for(int i =1 ; i <=n ; i++) {
float s = 0;
for(int j =1 ; j<=n+1;j++){
if(i!=j) {
b[i][j] = -a[i][j]/a[i][i];
s += fabs(b[i][j]);
}
if(j==n+1){
s-=fabs(b[i][j]);
b[i][j] *=-1;
}
}
s -= fabs(b[i][i]);
if(maxx < s ) maxx = s ;
b[i][i] = 0;
}
if(maxx<1) {
printf("%.3f < 1 => Thoa man dieu kien hoi tu!\n",maxx);
}
else printf("Khong thoa man dieu kien hoi tu!\n");
if(maxx<1) {
for(int i=1; i<=n; i++) {
c[i] = b[i][n+1];
}
while(1){
for(int i =1 ;i <=n ; i++) {
e[i] = c[i];
}
for(int i =1 ; i<=n ;i++) {
d[i] = 0;
for(int j =1 ; j<=n ; j++) {
d[i] += e[j]*b[i][j];
}
d[i] += b[i][n+1];
e[i] = d[i];
}
bool kt = true;
for(int i=1; i <= n; i++) {
if(fabs(c[i]-d[i]) > 0.0001) kt = false;
}
if(kt == true) break;
else {
for (int i =1 ; i<=n ; i++) {
c[i] = d[i];
}
}
for(int i=1; i<=n; i++) {
printf("%f ", c[i]);
}
printf("\n");
}
}
}
int main() {
inp();
gauss();
}
a)
b)

c)

* PHƯƠNG PHÁP GIẢM DƯ:


a)

0.000 0.000 0.000 0.000 5.400 0.286 -0.818 1.750


5.400 0.000 0.000 0.000 0.000 0.286 -4.255 3.100
5.400 0.000 -4.255 0.000 2.553 0.286 0.000 2.036
7.953 0.000 -4.255 0.000 0.000 0.286 -1.624 2.675
7.953 0.000 -4.255 2.675 0.357 1.432 -1.624 0.000
7.953 0.000 -5.879 2.675 1.331 1.432 0.000 -0.406
7.953 1.432 -5.879 2.675 1.331 0.000 -0.391 -0.048
9.284 1.432 -5.879 2.675 0.000 0.000 -1.238 0.285
9.284 1.432 -7.117 2.675 0.743 0.000 0.000 -0.025
10.027 1.432 -7.117 2.675 0.000 0.000 -0.473 0.161
10.027 1.432 -7.589 2.675 0.284 0.000 0.000 0.043
10.310 1.432 -7.589 2.675 0.000 0.000 -0.180 0.114
10.310 1.432 -7.770 2.675 0.108 0.000 0.000 0.069
10.418 1.432 -7.770 2.675 0.000 0.000 -0.069 0.096
10.418 1.432 -7.770 2.770 0.013 0.041 -0.069 0.000
10.418 1.432 -7.839 2.770 0.054 0.041 0.000 -0.017
10.473 1.432 -7.839 2.770 0.000 0.041 -0.034 -0.004
10.473 1.473 -7.839 2.770 0.000 0.000 -0.046 0.007
10.473 1.473 -7.884 2.770 0.027 0.000 0.000 -0.005
10.500 1.473 -7.884 2.770 0.000 0.000 -0.017 0.002
10.500 1.473 -7.902 2.770 0.010 0.000 0.000 -0.002
10.510 1.473 -7.902 2.770 0.000 0.000 -0.007 -0.001
10.510 1.473 -7.908 2.770 0.004 0.000 0.000 -0.001
10.514 1.473 -7.908 2.770 0.000 0.000 -0.003 -0.001
10.514 1.473 -7.911 2.770 0.002 0.000 0.000 -0.000
10.516 1.473 -7.911 2.770 0.000 0.000 -0.001 -0.001
10.516 1.473 -7.912 2.770 0.001 0.000 0.000 -0.001
10.516 1.473 -7.912 2.769 0.000 -0.000 0.000 0.000
10.516 1.473 -7.912 2.769 0.000 -0.000 -0.000 0.000
10.516 1.473 -7.912 2.769 0.000 0.000 -0.000 0.000
10.516 1.473 -7.912 2.769 0.000 0.000 0.000 -0.000

Vậy: Nghiệm của hệ phương trình là .

b)

0.000 0.000 0.000 1.000 2.750 -2.500

0.000 2.750 0.000 1.000 0.000 -2.500

0.000 2.750 -2.500 2.250 0.000 0.000

2.250 2.750 -2.500 0.000 -0.563 -1.125

2.250 2.750 -3.625 0.563 -0.563 0.000

2.813 2.750 -3.625 0.000 -0.703 -0.281

2.813 2.047 -3.625 0.000 0.000 -0.281

2.813 2.047 -3.906 0.141 0.000 0.000

2.953 2.047 -3.906 0.000 -0.035 -0.070

2.953 2.047 -3.977 0.035 -0.035 0.000


2.988 2.047 -3.977 0.000 -0.044 -0.018

2.988 2.003 -3.977 0.000 0.000 -0.018

2.988 2.003 -3.994 0.009 0.000 0.000

2.997 2.003 -3.994 0.000 -0.002 -0.004

2.997 2.003 -3.999 0.002 -0.002 0.000

2.999 2.003 -3.999 0.000 -0.003 -0.001

2.999 2.000 -3.999 0.000 0.000 -0.001

2.999 2.000 -4.000 0.001 0.000 0.000

3.000 2.000 -4.000 0.000 -0.000 -0.000

3.000 2.000 -4.000 0.000 -0.000 0.000

3.000 2.000 -4.000 0.000 -0.000 -0.000

Vậy: Nghiệm của phương trình là .

c)

0.000 0.000 0.000 1.667 0.333 1.222


1.667 0.000 0.000 0.000 -0.222 0.667
1.667 0.000 0.667 -0.222 -0.111 0.000
1.444 0.000 0.667 0.000 -0.037 0.074
1.444 0.000 0.741 -0.025 -0.025 0.000
1.444 -0.025 0.741 -0.016 0.000 0.014
1.428 -0.025 0.741 0.000 0.005 0.019
1.428 -0.025 0.760 -0.006 0.009 0.000
1.428 -0.016 0.760 -0.009 0.000 -0.005
1.419 -0.016 0.760 0.000 0.003 -0.002
1.419 -0.013 0.760 -0.001 0.000 -0.003
1.419 -0.013 0.756 0.000 -0.001 0.000
1.419 -0.013 0.756 0.000 0.000 0.000
1.419 -0.013 0.757 0.000 0.000 0.000

Vậy: Nghiệm của hệ phương trình là .

CODE PHƯƠNG PHÁP GIẢM DƯ:

#include <stdio.h>
#include <math.h>

int main() {
int n, t;
float a[10][10], x[10], r[10];
printf("Nhap n = ");
scanf("%d", &n);
printf("\nNhap he phuong trinh: \n");
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n + 1; j++)
scanf("%f", &a[i][j]);
printf("\nNhap vector nghiem ban dau: \n");
for (int i = 1; i <= n; i++)
scanf("%f", &x[i]);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n + 1; j++) {
if (i != j) a[i][j] /= a[i][i];
}
a[i][i] = 1;
}
for (int i = 1; i <= n; i++) {
r[i] = a[i][n+1];
for (int j = 1; j <= n; j++) {
r[i] -= a[i][j] * x[j];
}
}
do {
for (int i = 1; i <= n; i++)
printf ("%10.3f", x[i]);
for (int i = 1; i <= n; i++)
printf("%8.3f", r[i]);
printf("\n");
t = 0;
int idx = 1;
for (int i = 2; i <= n; i++) {
if (fabs(r[i]) > fabs(r[idx])) idx = i;
}
x[idx] += r[idx];
float d = r[idx];
for (int i = 1; i <= n; i++) {
r[i] -= a[i][idx] * d;
if (fabs(r[i]) >= 0.0001) t = 1;
}
} while (t);
printf("Nghiem cua he phuong trinh la: \n");
for (int i = 1; i <= n; i++)
printf("%10.3f", x[i]);
return 0;
}
a)

b)
c)

You might also like