- #include<stdio.h>
- #include<math.h>
- #define N 6
- #define M 6
- double max(double a[M]);
- double jocabi(double a[][M],double b[N],double x[M],double p);
- /* a 为 系数 矩阵 N 行 M列
- b 为 Ax=b中的 b;M个元素
- x 为初值 维数为 M的 一维数组
- p 为精度
- */
- int main()
- {
- double x[M],p;
- double a[N][M]={{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}};
- double b[N]={0,5,0,6,-2,6};
- int i;
- printf("请输入初值:/n");
- for(i=0;i<M;i++)
- {
- printf("x%d(0)=",i+1); //初值
- scanf("%lf",&x[i]);
- }
- printf("请输入求解精度:/n");
- printf("p=");
- scanf("%lf",&p);
- printf("/n");
- for(i=0;i<M;i++)
- printf("x%d(0)=%lf/t/t",i+1,i,x[i]); //输出初始值
- printf("/n/n");
- jocabi(a,b,x,p);
- }
- double max(double a[M])
- {
- int i;
- double t;
- for(i=0,t=a[0];i<M;i++)
- if(a[i]>t) t=a[i];// t 始终存储 最大值
- return t;
- }
- double jocabi(double a[][M],double b[N],double x[M],double p)
- {
- int k,i,j;
- double e[M]={0},y[M]={0},temp; //M为列
- printf("迭代列表如下:/n");
- for(k=0;k<5000; )
- {
- for(i=0;i<M;i++)
- {
- temp=0;
- for(j=0;j<M;j++)
- {
- if(i==j) continue;// 主对角线的元素 已被 提取来了
- else
- {
- temp+=a[i][j]*x[j];//系数乘以 变量 x[j];
- }
- }
- y[i]=(b[i]-temp)/a[i][i];
- printf("x%d(%d)=%lf/t/t",i+1,k+1,y[i]);
- e[i]=fabs(x[i]-y[i]);//e[i] 存储 每次的 x[i]-y[j]差值
- }
- printf("/n");
- if(max(e)<p)//e的最大值 小于精度 p 时 输出结果
- {
- printf("/n");
- printf("该方程组的解为:/n");
- for(j=0;j<N;j++)
- {
- printf("x%d=%lf /t /t",j+1,y[j]);//未知数的从 X1 开始,而 数组y[j]从 0开始
- }
- printf("/n");
- break;
- }
- k++;
- for(j=0;j<M;j++)
- x[j]=y[j];
- }
- if(k==5000)//迭代数组次数超过 5000 超过 迭代次数 结束
- printf("此方程迭代失败/n");
- return 0;
- }