资源描述
实验题目
1. Jacobi迭代法
用Jacobi迭代法求解线性方程组,保留四位有效数字(err=1e-4),其中A=[8 -1 1;2 10 -1;1 1 -5]; b=[1 ;4; 3]。
2.Gauss-Seidel迭代法
用Gauss-Seidel迭代法求解线性方程组,保留四位有效数字(err=1e-4),其中A=[8 -1 1;2 10 -1;1 1 -5]; b=[1 ;4; 3]。
3.分别用Jacobi迭代法和Gauss-Seidel迭代法求解方程组
要求精度,初始,最大迭代次数N=25,试比较这几种迭代法的迭代次数和收敛速度。
1.程序:
#include<math.h>
#include<stdio.h>
int main(){
int n=3,i,k,j,mm=1000;//最大迭代次数;
float t,x[mm][n],dx[n],dx_max=1,err=1e-4;//精度
for(i=0;i<n;i++)
x[0][i]=0;
float a[3][3]={8,-1,1,2,10,-1,1,1,-5};
float b[3]={1,4,3};
for(i=0;i<n;i++){
b[i]=b[i]/a[i][i];
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(j!=i)
a[i][j]=a[i][j]/a[i][i];
a[i][i]=0;
}
printf("精度1e-4时,解x'[%d]=\n",n);
for(k=0;dx_max>1e-8;k++){
dx_max=0;
for(i=0;i<n;i++){
t=0;
for(j=0;j<n;j++)
t+=a[i][j]*x[k][j];
x[k+1][i]=b[i]-t;
printf("%0.4f ",x[k+1][i]);
dx[i]=x[k+1][i]-x[k][i];
dx_max+=pow(dx[i],2);
}
printf(" %d",k+1);
printf("\n");
} printf("\n");
}
程序结果:
精度1e-4时,解x'[3]=
0.1250 0.4000 -0.6000 1
0.2500 0.3150 -0.4950 2
0.2262 0.3005 -0.4870 3
0.2234 0.3061 -0.4947 4
0.2251 0.3058 -0.4941 5
0.2250 0.3056 -0.4938 6
0.2249 0.3056 -0.4939 7
0.2249 0.3056 -0.4939 8
2.程序:
#include<math.h>
#include<stdio.h>
int main(){
int n=3,i,k,j,mm=1000;//最大迭代次数;
float t,x[mm][n],dx[n],dx_max=1,err=1e-4;//精度
for(i=0;i<n;i++)
x[0][i]=0;
float a[3][3]={8,-1,1,2,10,-1,1,1,-5};
float b[3]={1,4,3};
for(i=0;i<n;i++){
b[i]=b[i]/a[i][i];
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(j!=i)
a[i][j]=a[i][j]/a[i][i];
a[i][i]=0;
}
printf("精度1e-4时,解x'[%d]=\n",n);
for(k=0;dx_max>1e-8;k++){
dx_max=0;
for(i=0;i<n;i++){
if(i==0){
t=0;
for(j=i+1;j<n;j++)
t+=a[i][j]*x[k][j];
x[k+1][i]=b[i]-t;
}
else{
t=0;
for(j=0;j<=i-1;j++)t+=a[i][j]*x[k+1][j];
for(j=i+1;j<n;j++)t+=a[i][j]*x[k][j];
x[k+1][i]=b[i]-t;
}
printf("%0.4f ",x[k+1][i]);
dx[i]=x[k+1][i]-x[k][i];
dx_max+=pow(dx[i],2);
}
printf("\n");
} printf("\n");
}
程序结果:
精度1e-4时,解x'[3]=
0.1250 0.3750 -0.5000
0.2344 0.3031 -0.4925
0.2245 0.3059 -0.4939
0.2250 0.3056 -0.4939
0.2249 0.3056 -0.4939
3. Jacobi迭代法程序:
#include<math.h>
#include<stdio.h>
int main(){
int n=6,i,k,j,mm=1000;//最大迭代次数;
float t,x[mm][n],dx[n],dx_max=1,err=1e-5;//精度
for(i=0;i<n;i++)
x[0][i]=0;
float a[6][6]={4,-1,0,-1,0,0,-1,4,-1,0,-1,0,0 ,-1 ,4 ,0 ,0 ,-1,-1, 0, 0 ,4 ,-1 ,0, 0 ,-1 ,0 ,-1, 4 ,-1,0 ,0 ,-1, 0, -1 ,4};
float b[6]={0 ,5 ,0 ,6 ,-2, 6};
for(i=0;i<n;i++){
b[i]=b[i]/a[i][i];
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(j!=i)
a[i][j]=a[i][j]/a[i][i];
a[i][i]=0;
}
printf("精度1e-4时,解x'[%d]=\n",n);
for(k=0;dx_max>pow(err,2);k++){
dx_max=0;
for(i=0;i<n;i++){
t=0;
for(j=0;j<n;j++)
t+=a[i][j]*x[k][j];
x[k+1][i]=b[i]-t;
printf("%0.4f ",x[k+1][i]);
dx[i]=x[k+1][i]-x[k][i];
dx_max+=pow(dx[i],2);
}
printf(" %d",k+1);
printf("\n");
} printf("\n");
}
程序结果:
a的对角变0处理后的(a[6][6],b[6])=
0.0000 -0.2500 0.0000 -0.2500 0.0000 0.0000 0.0000
-0.2500 0.0000 -0.2500 0.0000 -0.2500 0.0000 1.2500
0.0000 -0.2500 0.0000 0.0000 0.0000 -0.2500 0.0000
-0.2500 0.0000 0.0000 0.0000 -0.2500 0.0000 1.5000
0.0000 -0.2500 0.0000 -0.2500 0.0000 -0.2500 -0.5000
0.0000 0.0000 -0.2500 0.0000 -0.2500 0.0000 1.5000
精度1e-005时,解x'[6]=
0.0000 1.2500 0.0000 1.5000 -0.5000 1.5000 1
0.6875 1.1250 0.6875 1.3750 0.5625 1.3750 2
0.6250 1.7344 0.6250 1.8125 0.4688 1.8125 3
0.8867 1.6797 0.8867 1.7734 0.8398 1.7734 4
0.8633 1.9033 0.8633 1.9316 0.8066 1.9316 5
0.9587 1.8833 0.9587 1.9175 0.9417 1.9175 6
0.9502 1.9648 0.9502 1.9751 0.9296 1.9751 7
0.9850 1.9575 0.9850 1.9699 0.9787 1.9699 8
0.9819 1.9872 0.9819 1.9909 0.9743 1.9909 9
0.9945 1.9845 0.9945 1.9890 0.9923 1.9890 10
0.9934 1.9953 0.9934 1.9967 0.9907 1.9967 11
0.9980 1.9944 0.9980 1.9960 0.9972 1.9960 12
0.9976 1.9983 0.9976 1.9988 0.9966 1.9988 13
0.9993 1.9979 0.9993 1.9985 0.9990 1.9985 14
0.9991 1.9994 0.9991 1.9996 0.9988 1.9996 15
0.9997 1.9993 0.9997 1.9995 0.9996 1.9995 16
0.9997 1.9998 0.9997 1.9998 0.9995 1.9998 17
0.9999 1.9997 0.9999 1.9998 0.9999 1.9998 18
0.9999 1.9999 0.9999 1.9999 0.9998 1.9999 19
1.0000 1.9999 1.0000 1.9999 1.0000 1.9999 20
1.0000 2.0000 1.0000 2.0000 0.9999 2.0000 21
1.0000 2.0000 1.0000 2.0000 1.0000 2.0000 22
1.0000 2.0000 1.0000 2.0000 1.0000 2.0000 23
1.0000 2.0000 1.0000 2.0000 1.0000 2.0000 24
1.0000 2.0000 1.0000 2.0000 1.0000 2.0000 25
Gauss-Seidel迭代法程序:
#include<math.h>
#include<stdio.h>
int main(){
int n=6,i,k,j,mm=25;//最大迭代次数;
float t,x[mm][n],dx[n],dx_max=1,err=1e-5;//精度
for(i=0;i<n;i++)
x[0][i]=0;
float a[6][6]={4,-1,0,-1,0,0,-1,4,-1,0,-1,0,0 ,-1 ,4 ,0 ,0 ,-1,-1, 0, 0 ,4 ,-1 ,0, 0 ,-1 ,0 ,-1, 4 ,-1,0 ,0 ,-1, 0, -1 ,4};
float b[6]={0 ,5 ,0 ,6 ,-2, 6};
for(i=0;i<n;i++){
b[i]=b[i]/a[i][i];
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(j!=i)
a[i][j]=a[i][j]/a[i][i];
a[i][i]=0;
}
printf("精度1e-4时,解x'[%d]=\n",n);
for(k=0;dx_max>pow(err,2)&&k<mm;k++){
dx_max=0;
for(i=0;i<n;i++){
if(i==0){
t=0;
for(j=i+1;j<n;j++)
t+=a[i][j]*x[k][j];
x[k+1][i]=b[i]-t;
}
else{
t=0;
for(j=0;j<=i-1;j++)t+=a[i][j]*x[k+1][j];
for(j=i+1;j<n;j++)t+=a[i][j]*x[k][j];
x[k+1][i]=b[i]-t;
}
printf("%0.4f ",x[k+1][i]);
dx[i]=x[k+1][i]-x[k][i];
dx_max+=pow(dx[i],2);
}
printf(" %d\n",k+1);
} printf("\n");
}
程序结果:
a对角0化处理后的(a[6][6],b[6][1])=
0.0000 -0.2500 0.0000 -0.2500 0.0000 0.0000 0.0000
-0.2500 0.0000 -0.2500 0.0000 -0.2500 0.0000 1.2500
0.0000 -0.2500 0.0000 0.0000 0.0000 -0.2500 0.0000
-0.2500 0.0000 0.0000 0.0000 -0.2500 0.0000 1.5000
0.0000 -0.2500 0.0000 -0.2500 0.0000 -0.2500 -0.5000
0.0000 0.0000 -0.2500 0.0000 -0.2500 0.0000 1.5000
精度1e-005时,解x'[6]=
0.0000 1.2500 0.3125 1.5000 0.1875 1.6250 1
0.6875 1.5469 0.7930 1.7188 0.7227 1.8789 2
0.8164 1.8330 0.9280 1.8848 0.8992 1.9568 3
0.9294 1.9391 0.9740 1.9572 0.9633 1.9843 4
0.9741 1.9778 0.9905 1.9843 0.9866 1.9943 5
0.9905 1.9919 0.9966 1.9943 0.9951 1.9979 6
0.9966 1.9971 0.9987 1.9979 0.9982 1.9992 7
0.9987 1.9989 0.9995 1.9992 0.9994 1.9997 8
0.9995 1.9996 0.9998 1.9997 0.9998 1.9999 9
0.9998 1.9999 0.9999 1.9999 0.9999 2.0000 10
0.9999 1.9999 1.0000 2.0000 1.0000 2.0000 11
1.0000 2.0000 1.0000 2.0000 1.0000 2.0000 12
1.0000 2.0000 1.0000 2.0000 1.0000 2.0000 13
1.0000 2.0000 1.0000 2.0000 1.0000 2.0000 14
展开阅读全文