#include <stdio.h>
#include <math.h>
#define N 4 /* N为方程组系数矩阵的阶数*/
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}};/*输入被求解线性方程组*/
float b[N]={14.4095,16.166,24.628,-5.8256};
float x[N]={0,0,0,0,0};
#define MAX_N 1000 /* 最大迭代次数*/
#define eps 1e-6 /* 容许误差*/
int yacobi(float a[N][N],float b[N],float x[N])/*雅可比迭代法计算核心*/
{
float d,s,max,y[N];
int i,j,k,flag;
k=0;
while(1)
{
max=0.0;
k++;
for(i=0;i<N;i++)
{
s=0.0;
for(j=0;j<N;j++)
if(j!=i) s=s+a[i][j]*x[j];
y[i]=(b[i]-s)/a[i][i];
d=fabs(y[i]-x[i]);
if(max<d)
max=d; /* 将循环过程中最大值赋值给max */
}
for(i=0;i<N;i++)
x[i]=y[i];
if(max<eps) /* 结束迭代判断*/
{
flag=1;
break;
}
if(k>=MAX_N) /*结束迭代判断*/
{
flag=0;
break;
}
}
return(flag);
}
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("%10f",a[i][j]);
printf("%12f",b[i]);
printf("\n");
}
printf("\n");
}
main()
{
int i,k;
printf("Linear equations:\n");
augm_matrix(a,b);
k=yacobi(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("No result could be obtained.");
system("pause");
}
参考资料:
[1] 王汉青. 暖通空调流体流动数值计算方法与应用[M]. 北京: 科学出版社, 2013.10.
搜索