解线性方程组

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计阶段性报告

班级:学号:姓名:申报等级:

题目:线性方程组求解

1.题目要求:输入是N(N<256)元线性方程组Ax=B,输出是方程组的解,也可能无解或有多组解。可以用高斯消去法求解,也可以采用其它方法。

2.设计内容描述:将线性方程组做成增广矩阵,对增广矩阵进行变换然后采用高斯消元法消去元素,从而得到上三角矩阵,再对得到的上三角矩阵进行回代操作,即可以得到方程组的解。

3.编译环境及子函数介绍:我使用Dev-C++环境编译的,调用uptrbk() FindMax()和ExchangeRow(),uptrbk是上三角变换函数,FindMax()用于找出列向量中绝对值最大项的标号,ExchangeRow()用于交换两行

4. 程序源代码:

#include

#include

#include

//在列向量中寻找绝对值最大的项,并返回该项的标号

int FindMax(int p,int N,double *A)

{

int i=0,j=0;

double max=0.0;

for(i=p;i

{

if(fabs(A[i*(N+1)+p])>max)

{

j=i;

max=fabs(A[i*(N+1)+p]);

}

}

return j;

//交换矩阵中的两行

void ExchangeRow(int p,int j,double *A,int N)

{

int i=0;

double C=0.0;

for(i=0;i

{

C=A[p*(N+1)+i];

A[p*(N+1)+i]=A[j*(N+1)+i];

A[j*(N+1)+i]=C;

}

}

//上三角变换,A为增广矩阵的指针,N为矩阵的行数。

void uptrbk(double *A,int N)

{

int p=0,k=0,q=0,j=0;

double m=0.0;

for(p=0;p

{

//找出该列最大项的标号

j=FindMax(p,N,A);

//交换p行和j行

ExchangeRow(p,j,A,N);

if(A[p*(N+1)+p]==0)

{

printf("矩阵是一个奇异矩阵,没有唯一解!");

break;

}

//消去P元素以下的p列内容。

for(k=p+1;k

{

m=A[k*(N+1)+p]/A[p*(N+1)+p];

for(q=p;q

A[k*(N+1)+q]=A[k*(N+1)+q]-m*A[p*(N+1)+q];

}

}

printf("\n增广矩阵高斯列主元消去后的矩阵为:\n");

for(j=0;j

{

if(j%(N+1)==0)

printf("\n");

printf("%lf\t",A[j]);

}

//下面是回代函数

double* backsub(double *A,int N)

{

double* X=NULL,temp=0.0;

int k=0,i=0;

X=(double*)malloc(N*sizeof(double));

X[N-1]=A[(N-1)*(N+1)+N]/A[(N-1)*(N+1)+N-1];

for(k=N-2;k>=0;k--)

{

temp=0.0;

for(i=k+1;i

temp=temp+A[k*(N+1)+i]*X[i];

X[k]=(A[k*(N+1)+N]-temp)/A[k*(N+1)+k];

}

return X;

}

main()

{

int N=0,i=0;

double *A=NULL,*X=NULL;

printf("\n请输入待求解方程组的增广矩阵的行数:");

scanf("%d",&N);

if(N>256||N<=0)

{

printf("输入的数字不再范围之内!!!");

printf("\n");

return 0;}

else

{

A=(double*)calloc(N*(N+1),sizeof(double));

printf("请输入待求解方程组的增广矩阵(%d行%d 列):\n",N,N+1);

for(i=0;i

scanf("%lf",&A[i]);

system("cls");

printf("方程的增广矩阵为:\n");

for(i=0;i

{

if(i%(N+1)==0)

printf("\n");

printf("%lf\t",A[i]);}

uptrbk(A,N); //上三角变换

X=backsub(A,N); //回代函数

printf("\n\n方程组的解为:\n");

for(i=0;i

printf("X(%d)= %lf\n",i+1,X[i]);}

free(A);

free(X);

exit(0);

}

5.运行界面截图:

输入完成按回车;得到输出如下图:

相关文档
最新文档