解线性方程组
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.运行界面截图: 输入完成按回车;得到输出如下图: