当前位置:文档之家› 解线性方程组

解线性方程组

课程设计阶段性报告
班级:学号:姓名:申报等级:
题目:线性方程组求解
1.题目要求:输入是N(N<256)元线性方程组Ax=B,输出是方程组的解,也可能无解或有多组解。

可以用高斯消去法求解,也可以采用其它方法。

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

3.编译环境及子函数介绍:我使用Dev-C++环境编译的,调用uptrbk() FindMax()和ExchangeRow(),uptrbk是上三角变换函数,FindMax()用于找出列向量中绝对值最大项的标号,ExchangeRow()用于交换两行
4. 程序源代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//在列向量中寻找绝对值最大的项,并返回该项的标号
int FindMax(int p,int N,double *A)
{
int i=0,j=0;
double max=0.0;
for(i=p;i<N;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<N+1;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<N-1;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<N;k++)
{
m=A[k*(N+1)+p]/A[p*(N+1)+p];
for(q=p;q<N+1;q++)
A[k*(N+1)+q]=A[k*(N+1)+q]-m*A[p*(N+1)+q];
}
}
printf("\n增广矩阵高斯列主元消去后的矩阵为:\n");
for(j=0;j<N*(N+1);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<N;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<N*(N+1);i++)
scanf("%lf",&A[i]);
system("cls");
printf("方程的增广矩阵为:\n");
for(i=0;i<N*(N+1);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<N;i++)
printf("X(%d)= %lf\n",i+1,X[i]);}
free(A);
free(X);
exit(0);
}
5.运行界面截图:
输入完成按回车;得到输出如下图:
6.系统需要完善的功能:。

相关主题