#include <stdio.h>
#include <math.h>
#define N 4 /* N为方程组系数矩阵的阶数*/
#define MAX_N 100 /* 最大迭代次数*/
#define eps 1e-5 /* 容许误差*/
static float a[N][N]={{1.5,0.5,2.5,-3},{6,0.6,0,-5},{1,1.2,14,1},{-3,-5,1,11.1}};/*输入被求解线性方程组*/
static float b[N]={14.4095,16.166,24.628,-5.8256};
float x[N]={0,0,0,0}; /*定义初始值*/
void augm_matrix(float a[N][N],float b[N]) /*输出增广矩阵*/
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%12f",a[i][j]);
printf("%12f",b[i]);
printf("\n");
}
printf("\n");
}
int sor(float w,float a[N][N],float b[N],float x[N])/*超松弛迭代法计算核心*/
{
float erro;
float d[N],g[N],c[N][N];
int i,j,k,flag=0;
for(i=0;i<N;i++)
{
g[i]=b[i]/a[i][i];
for(j=0;j<N;j++)
c[i][j]=-a[i][j]/a[i][i];
}
for(i=1;i<=MAX_N;i++)
{ for(j=0;j<N;j++)
d[j]=g[j];
for(j=0;j<N;j++)
{
for(k=0;k<j;k++)
d[j]=d[j]+c[j][k]*d[k];
for(k=j+1;k<N;k++)
d[j]=d[j]+c[j][k]*x[k];
d[j]=(1-w)*x[j]+w*d[j];
}
erro=0.0;
for(j=0;j<N;j++)
if(erro<fabs(d[j]-x[j]))
erro=fabs(d[j]-x[j]);
for(j=0;j<N;j++)
x[j]=d[j];
if(erro<eps)
{
flag=1;
break;
}
}
return(flag);
}
main()
{
float w;
int i,k;
while(1)
{
printf("input the w value:");
scanf("%f",&w);
if(w<=1 || w>=2) /* 必须保证松弛因子*/
printf("w must between 1 and 2.\n");
else
break;
}
printf("Linear equations:\n");
augm_matrix(a,b);
k=sor(w,a,b,x);
if(k==1) /* 输出方程组的解*/
{
printf("Results:\n");
for(i=0;i<N;i++)
printf(" x%d=%f\n",i+1,x[i]);
}
else printf("after %d repeat, no result!\n",MAX_N);/*输出失败信息*/
system("pause");
}
参考资料:
[1] 王汉青. 暖通空调流体流动数值计算方法与应用[M]. 北京: 科学出版社, 2013.10.
搜索