列主元消去法求解方程組(C語言)
阿新 • • 發佈:2019-02-06
用列主元消去法解下列方程組:
#include<stdio.h>
#include<math.h>
void main()
{
void zhu(float *,int,float[]); //宣告函式zhu
int i;
float x[4]; //x為解
float c[4][5]={1,1,0,3,4, //矩陣
2,1,-1,1,1,
3,-1,-1,3,-3,
-1,2,3,-1,4};
float y[4];
float d[4][5]={1,-1,2,-1,-8,
2,-2,3,-3,-20,
1,1,1,0,-2,
1,-1,4,3,4};
zhu(c[0],4,x);
zhu(d[0],4,y);
for(i=0;i<=3;i++)
printf("x[%d]=%f\n",i+1,x[i]); //輸出結果
printf("\n");
for(i=0;i<=3;i++)
printf("y[%d]=%f\n",i+1,y[i]);
}
//列主元消去法
void zhu(float *c,int n,float x[])
{
int i,j,t,k;
float p;
for(i=0;i<=n-2;i++)
{
k=i;
for(j=i+1;j<=n-1;j++)
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))
k=j;
if(k!=i)
for(j=i;j<=n;j++)
{
p=*(c+i*(n+1)+j);
*(c+i*(n+1 )+j)=*(c+k*(n+1)+j);
*(c+k*(n+1)+j)=p;
} //找最大的調換位置
for(j=i+1;j<=n-1;j++)
{
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); //求係數
for(t=i;t<=n;t++)
*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
}
}
for(i=n-1;i>=0;i--)
{
for(j=n-1;j>=i+1;j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j)); //求解
x[i]=(*(c+i*(n+1)+n))/(*(c+i*(n+1)+i));
}
}