全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版

求助 列主元高斯消去法解线性方程组

[复制链接]
2681 0

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int jueduizhizuida(int a,int M,double *A)
{
int i=0,j=0;
double max=0.0;
for(i=a;i<M;i++)
{
  if(fabs(A[i*(M+1)+a])>max)
  {
   j=i;
   max=fabs(A[i*(M+1)+a]);
  }
}
return j;
}

void jiaohuanlianghang(int a,int j,double *A,int M)
{
int i=0;
double B=0.0;
for(i=0;i<M+1;i++)
{
  B=A[a*(M+1)+i];
  A[a*(M+1)+i]=A[j*(M+1)+i];
  A[j*(M+1)+i]=B;
}
}

void shangsanjiao(double *A,int M)
{
int p=0,k=0,q=0,j=0,i;
double m=0.0,det;
for(p=0;p<M-1;p++)
{

  j=jueduizhizuida(p,M,A);
  jiaohuanlianghang(p,j,A,M);
  if(A[p*(M+1)+p]==0)
  {
   printf("矩阵是一个奇异矩阵,没有唯一解!");
   break;
  }
  for(k=p+1;k<M;k++)
  {
   m=A[k*(M+1)+p]/A[p*(M+1)+p];
   for(q=p;q<M+1;q++)
    A[k*(M+1)+q]=A[k*(M+1)+q]-m*A[p*(M+1)+q];
  }
}
printf("\n增广矩阵高斯列主元消去后的矩阵如下:\n");
for(j=0;j<M;j++)
{
  for(i=0;i<(M+1);i++)
   printf("%lf\t",A[i+j*(M+1)]);
  printf("\n");
}
det=1;
for(i=0;i<M;i++)
  det=det*A[i*(M+2)];
printf("det(A)=%lf",det);
}

double* huidai(double *A,int M)
{
double* X=NULL,temp=0.0;
int k=0,i=0;
X=(double*)malloc(M*sizeof(double));
X[M-1]=A[(M-1)*(M+1)+M]/A[(M-1)*(M+1)+M-1];
for(k=M-2;k>=0;k--)
{
  temp=0.0;
  for(i=k+1;i<M;i++)
   temp=temp+A[k*(M+1)+i]*X[i];
  X[k]=(A[k*(M+1)+M]-temp)/A[k*(M+1)+k];
}
return X;
}

int main()
{
int M=0,i=0,j;
double *A=NULL,*X=NULL;
printf("用列主消去法求解方程组\n");
printf("\n请输入待求解方程组的增广矩阵的行数:\t");
scanf("%d",&M);
if(M>256||M<=0)
{
  printf("输入的数字不再范围之内");
  printf("\n");
  return 0;
}
else
{
  A=(double*)calloc(M*(M+1),sizeof(double));
  printf("请输入待求解方程组的增广矩阵(%d行 %d列):\n",M,M+1);
  for(j=0;j<M;j++)
  {
   printf("请输入第%d行元素: ",j+1);
   for(i=0;i<(M+1);i++)
    scanf("%lf",&A[i+j*(M+1)]);
  }
  printf("\n");
  printf("方程的增广矩阵如下:\n");
  for(j=0;j<M;j++)
  {
   for(i=0;i<(M+1);i++)
    printf("%lf\t",A[i+j*(M+1)]);
    printf("\n");
  }
  shangsanjiao(A,M);   
  X=huidai(A,M);
  printf("\n方程组的解为:\n");
  for(i=0;i<M;i++)
   printf("X(%d)=\t%lf\n",i+1,X[i]);
}
free(A);
free(X);
exit(0);
}

举报

回复
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

打开支付宝扫一扫,最高立得1212元红包
搜索

图文热点

更多

社区学堂

更多

客服中心

QQ:187196467 服务时间:周一至周日 8:30-20:30

关注我们

关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
快速回复 返回顶部 返回列表