最近的混凝土搅拌站:请求:用C编一个程序!

来源:百度文库 编辑:中科新闻网 时间:2024/04/30 13:45:56
全主元高斯消去法求N阶线形方程组!

以前编的高斯消元法的函数,加在你的程序里面,先把线形方程组的系数存成矩阵,等号右边的在最后一列,用的时候调用以下就可以了,里面会有结果输出的,
注意,i是矩阵的维数,p是矩阵的首地址
void get(long double *p,int i)
{
int a,b,f,g,h,z;
long double t,c,d,*result,y;
for(a=1;a<i-1;a++)//消元循环
{f=a; //选主元开始
while(p[(f-1)*i+a]==0&&f<=(i-1))
{f++;
}
if(f!=a)
{
for(g=1;g<=i;g++)//第a和第f互换
{t=p[(a-1)*i+g];
p[(a-1)*i+g]=p[(f-1)*i+g];
p[(f-1)*i+g]=t;
}
}
for(b=a+1;b<i;b++)//先把第a行代人消第b行(b从a+1到j=i+1)
{if(p[(b-1)*i+a]==0) goto esc; //当下一个不用消的时候!
c=(p[i*(a-1)+a]/p[(b-1)*i+a]);
p[(b-1)*i+a]=0;
for(h=a+1;h<=i;h++)
{ y=p[i*(a-1)+h];
y=c*p[i*(b-1)+h];
p[i*(b-1)+h]=c*p[i*(b-1)+h]-p[i*(a-1)+h];//带入了b行
y=p[i*(b-1)+h];
y=y+1;
}
esc:
;}
}
result=new long double[i];//反代过程:开始
result[0]=0;
for(z=1;z<i;z++)
{d=p[(i-z)*i];
for(g=1;g<=z;g++)
{d=d-(result[g-1]*p[(i-z)*i-g+1]);
}
result[z]=(d/p[i*(i-z)-z]);
} //反代过程结束
if(cishu>TIME-2)cout<<"该方程的解为"<<endl;
for(z=i-1;z>0;z--)//打印结果:
{if(cishu>TIME-2)cout<<"X";
if(cishu>TIME-2)cout<<i-z;
if(cishu>TIME-2)cout<<"=";
if(cishu>TIME-2)cout<<fabs(result[z]);
jieguo[i-z]=result[z];
if(cishu>TIME-2)cout<<"\n";
}
return;
}

void get(long double *p,int i)
{
int a,b,f,g,h,z;
long double t,c,d,*result,y;
for(a=1;a<i-1;a++)//消元循环
{f=a; //选主元开始
while(p[(f-1)*i+a]==0&&f<=(i-1))
{f++;
}
if(f!=a)
{
for(g=1;g<=i;g++)//第a和第f互换
{t=p[(a-1)*i+g];
p[(a-1)*i+g]=p[(f-1)*i+g];
p[(f-1)*i+g]=t;
}
}
for(b=a+1;b<i;b++)//先把第a行代人消第b行(b从a+1到j=i+1)
{if(p[(b-1)*i+a]==0) goto esc; //当下一个不用消的时候!
c=(p[i*(a-1)+a]/p[(b-1)*i+a]);
p[(b-1)*i+a]=0;
for(h=a+1;h<=i;h++)
{ y=p[i*(a-1)+h];
y=c*p[i*(b-1)+h];
p[i*(b-1)+h]=c*p[i*(b-1)+h]-p[i*(a-1)+h];//带入了b行
y=p[i*(b-1)+h];
y=y+1;
}
esc:
;}
}
result=new long double[i];//反代过程:开始
result[0]=0;
for(z=1;z<i;z++)
{d=p[(i-z)*i];
for(g=1;g<=z;g++)
{d=d-(result[g-1]*p[(i-z)*i-g+1]);
}
result[z]=(d/p[i*(i-z)-z]);
} //反代过程结束
if(cishu>TIME-2)cout<<"该方程的解为"<<endl;
for(z=i-1;z>0;z--)//打印结果:
{if(cishu>TIME-2)cout<<"X";
if(cishu>TIME-2)cout<<i-z;
if(cishu>TIME-2)cout<<"=";
if(cishu>TIME-2)cout<<fabs(result[z]);
jieguo[i-z]=result[z];
if(cishu>TIME-2)cout<<"\n";
}
return;
}