C语⾔实现⾼斯消去法和列主元⾼斯消去法
本篇主要实现⾼斯消去法和列主元⾼斯消去法
⾼斯消去法和列主元⾼斯消去法都是为了解线性⽅程组的有效⽅法,但列主元⾼斯消去法是⾼斯消去法的⼀个优化版本,强烈建议后⾯许多地⽅⽤到解⽅程组时,都⽤列主元⾼斯消去法。
⾼斯消去法:
c语言如何去学
我个⼈觉得,例⼦⽐数学公式更好让⼈理解本质。上述是线性代数的⾼斯消元法,⽽我们只需要⽤程序将这个代码实现出来。上述⽅程组,第⼆⾏减去第⼀⾏,第三⾏减去两倍第⼀⾏。那么可以推断,若第三⾏要消去第⼀个数,则让第⼀⾏每个数除上第⼀⾏第⼀个数并乘上第三⾏第⼀个数,再让第三⾏减去第⼀⾏,即可。
代码实现:
#include<stdio.h>
# define N 100
int main()
{
int k,n,i,j;
double a[N][N],b[N],m[N][N],x[N],c[N],s=0.0;
printf("请输⼊未知数的个数:"); //该⽅程组的未知数
scanf("%d",&n);
printf("请输⼊数据:"); //输⼊增⼴矩阵
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
{
scanf("%lf",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
b[i]=a[i][n];//将增⼴矩阵最后⼀列作为y的值
}
for(k=0;k<n-1;k++)
{
for(i=k+1;i<n;i++)
{ m[i][k]=1.0*a[i][k]/a[k][k];//这⼀步减少了计算机运算量,因为后⾯要⽤到
b[i]=b[i]-1.0*m[i][k]*b[k];//将y与每⼀⾏的变化保持⼀致
for(j=k;j<n;j++)
{
a[i][j]=a[i][j]-1.0*m[i][k]*a[k][j];//这⼀步实现消元,可⾃⼰⽤具体数值推导
}
}}
//可以在这⾥加两个循环,查看矩阵中每⼀个位置的数是多少。就是上⾯输⼊增⼴矩阵下⾯那个双循环
//⽅程回代过程
x[n-1]=1.0*b[n-1]/a[n-1][n-1];//先计算最后未知数,从下上算
for(i=n-2;i>=0;i--)
{ s=0; //这⼀步⾮常重要,每⼀步都要更新为0,不然s保留参与下⾯计算出错
for(j=i+1;j<n;j++)
{
c[j]=1.0*a[i][j]*x[j];//计算过程
s=c[j]+s;
}
x[i]=1.0*(b[i]-s)/a[i][i];//将每⼀⾏的⽅程除未知数其他全部放到等式右边
}
for(i=0;i<n;i++)
{
printf("x[%d]=%lf\n",i+1,x[i]); //将未知数按顺序打印出来
}
return 0;
}
列主元⾼斯消元法,只是将每⼀列的最⼤数先放到前⾯,因为消元的过程中,如第三⾏第⼀个要消去第⼀个数字,则要第⼀⾏每⼀个数除上第⼀个数再乘上第三⾏第⼀个数,⽽第⼀⾏第⼀个数太⼩则会引起误差,若为0,则不能做分母,因此有必要引⼊列主元⾼斯消元法。
列主元⾼斯消元法 :
代码实现:
#include<stdio.h>
# define N 100
int main()
{
//我的坏⽑病,参数过多,后⾯不⼀定有⽤上
int k,n,i,j,r,w,e,g;
double a[N][N+1],b[N],m[N][N],x[N],c[N],s=0,f,max,uu[N];
printf("请输⼊未知数的个数:");
scanf("%d",&n);
printf("请输⼊数据:");
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
{
scanf("%lf",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
b[i]=a[i][n];
}
/*验证代码是否正确*//可将这段代码放到任何⼀个位置进⾏正确性检验
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%lf ",a[i][j]);
}
printf("%lf\n",b[i]);
}*/
for(r=0;r<n-1;r++)//这⼀步开始寻每⼀列最⼤的数
{ k=r;
max=a[r][r];
for(w=r;w<n-1;w++)//寻,若到该列下⾯有⽐起始⼤的数,则进⾏标记
{
if(a[w+1][r]>=a[w][r])
{
max=a[w+1][r];
k=w+1; //若到下列⼤的数,标记
}
}
if(k>=r)//此时表⽰到
{
for(e=r;e<n;e++)//将下列最⼤的数的那⼀⾏与这列起始数的那⼀⾏所有数进⾏⾏更换 {
f=a[r][e];
a[r][e]=a[k][e];
a[r][e]=a[k][e];
a[k][e]=f;
}
f=b[r];//让y保持与⾏同变化
b[r]=b[k];
b[k]=f;
}
for(i=r+1;i<n;i++)//与上⾯相同,进⾏⾼斯消去法,因为列已经变化完毕 { m[i][r]=1.0*a[i][r]/a[r][r];
b[i]=b[i]-1.0*m[i][r]*b[r];
for(j=r;j<n;j++)
{
a[i][j]=a[i][j]-1.0*m[i][r]*a[r][j];
}
}}
//回代过程
x[n-1]=1.0*b[n-1]/a[n-1][n-1];
for(i=n-2;i>=0;i--)
{ s=0;
for(j=i+1;j<n;j++)
{
c[j]=1.0*a[i][j]*x[j];
s=c[j]+s;
}
x[i]=1.0*(b[i]-s)/a[i][i];
}
for(i=0;i<n;i++)
{
printf("x[%d]=%lf\n",i+1,x[i]);
}
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论