找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

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

[复制链接]
chenseeing 发表于 2015-6-24 15:28:52 | 显示全部楼层 |阅读模式

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

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

×
#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);
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-21 22:41 , Processed in 0.062102 second(s), 13 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表