#include<stdio.h>
#include<math.h>
#define N 10 /*定义矩阵阶数*/
void main()
{
int i,j,m,A[N][N],B[N];
double X[N],akv[N],dka[N],rk[N],dk[N],pk,pkk,ak,bk;
for(i=0;i<N;i++) /*输入系数矩阵A*/ {
for(j=0;j<N;j++)
{
if(i==j)
A[i][j]=-2;
else if(abs(i-j)==1)
A[i][j]=1;
else
A[i][j]=0;
}
}
for(i=0;i<N;i++) /*输入矩阵B*/ {
if(i==0||i==N-1)
B[i]=-1;
else
B[i]=0;
}
printf("\n"); /*输出系数矩阵A*/
printf("the Maxtr A is\n");
for(i=0;i<N;i++)
{
printf("\n");
for(j=0;j<N;j++)
printf("%3d",A[i][j]);
}
printf("\n"); /*输出矩阵B*/
printf("the Maxtr b is\n");
for(i=0;i<N;i++)
printf("%3d",B[i]);
printf("\n");
printf("input the Maxtr X\n"); /*给X0输入一个初始向量*/ for(i=0;i<N;i++)
X[i]=0;
printf("X chushi:\n");
for(i=0;i<N;i++) /*显示给定的初始向量X0*/ printf("%3.0f",X[i]);
/*开始计算*/
for(i=0;i<N;i++) /*计算rk*/
{
pk=0.0;
for(j=0;j<N;j++)
pk+=A[i][j]*X[j];
akv[i]=pk;
}
for(i=0;i<N;i++)
rk[i]=B[i]-akv[i];
for(i=0;i<N;i++) /*给rO赋值*/
dk[i]=rk[i];
for(m=0;m<N;m++) /*开始迭代循环*/
{
for(i=0;i<N;i++) /*计算ak*/
{
pk=0.0;
for(j=0;j<N;j++)
pk+=A[i][j]*dk[j];
dka[i]=pk;
}
pk=0.0;pkk=0.0;
for(i=0;i<N;i++)
{
pk+=dka[i]*dk[i];
pkk+=rk[i]*rk[i];
}
if(pkk==0) /*如果残差pkk=0,计算结束*/ break;
ak=pkk/pk;
for(i=0;i<N;i++) /*计算X(k+1)*/
X[i]=X[i]+ak*dk[i];
for(i=0;i<N;i++) /*计算r(k+1)*/
{
pk=0.0;
for(j=0;j<N;j++)
pk+=A[i][j]*X[j];
akv[i]=pk;
}
for(i=0;i<N;i++)
rk[i]=B[i]-akv[i];
pk=0.0;
for(i=0;i<N;i++) /*计算bk*/
pk+=rk[i]*rk[i];
bk=pk/pkk;
for(i=0;i<N;i++) /*计算d(k+1)*/
dk[i]=rk[i]+bk*dk[i];
}
printf("\n");
printf("X cacualtate value is:\n"); /*输出运算结果X*/
for(i=0;i<N;i++)
printf("%f\n",X[i]);
}。