首页 > 编程知识 正文

列主元高斯消去法例题详解,全选主元高斯消去法

时间:2023-05-06 19:18:06 阅读:166625 作者:1994

本论文主要实现yldzxc消去法和列主元yldzxc消去法

yldzxc消去法和列主元yldzxc消去法是了解线性方程组的有效方法,但列主元yldzxc消去法是yldzxc消去法的优化版,在以后的许多地方求解方程时强烈推荐使用列主元yldzxc消去法。

yldzxc消去法:

我个人认为比起公式,例子更能理解本质。 以上是线性代数的yldzxc消元法,我们只需要用程序实现这个代码。 上面的方程式从第二行中减去第一行,从第三行中减去两倍的第一行。 那么,如果第三行要清除第一个数,可以假设第一行中的每个数除以第一行中的第一个数,乘以第三行中的第一个数,然后从第三行中减去第一行。

代码实现:

# include stdio.h # definen 100 int main () {int k,n,I,j; double a[N][N]、b[N]、m[n]、x[N]、c[N]、s=0.0; printf ('请输入未知数的个数:'); //该方程的未知数Scanf('%d ',n ); printf ('请输入数据:'); //输入扩展矩阵for (I=0; in; I ) for(j=0; jn 1; j () scanf('%lf ',a[i][j]; }for(I=0; in; I(b ) I )=a ) I ) ) n ); //将放大矩阵的最后一列设为y的值(for ) k=0; kn-1; k ) for(I=k1; in; I ) m(I ) k )=1.0*a ) I ) ) k )/a ) k ); //在该步骤中,稍后将描述b[i]=b[i]-1.0*m[i][k]*b[k]; 使//Y与各行的变化一致的for(J=K; jn; j () a[I] ) j )=a[I][j]-1.0*m[I][k]*a[k][j]; //要在这个步骤中实现消息,可以自己用具体的数值导出}//在这里添加2个循环,可以调查矩阵的各个位置的数量是多少。 上述输入放大矩阵下的双环//方程的回归过程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=I1; jn; 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; in; I ) {printf(x(%d )=%lf(n ),i 1,x ) I ) }; //按顺序打印未知数(}return 0; )列主元yldzxc消元法只需先设置各列的最大数即可。 在撤消过程中,要在第三行的开头删除第一个数字,必须将第一行中的每个数除以上面的第一个数,然后乘以第三行中的第一个数。 如果第一行的前几个太小,则会引起误差,如果为0,则无法生成分母,因此需要引入列主元yldzxc消息元

列主元yldzxc消元法:

代码实现:

# include stdio.h # definen 100 int main ((/我的坏毛病是参数太多,后来int k、n、I、j、r、w、e、g; double a[N][N 1]、b[N]、m[n]、x[N]、c[N]、s=0、f、max、tmdcg[N]; printf ('请输入未知数的个数:'); scanf('%d ',n ); printf ('请输入数据:'); for(I=0; in; I ) for(j=0; jn 1; j () scanf('%lf ',a[i][j]; }for(I=0; in; I(b ) I )=a ) I ) ) n ); 确保(/)代码正确((//无论将此代码放在哪里,均检查准确性for ) I=0; in; I ) for(j=0; jn; j () printf('%lf ',a[i][j]; }printf('%lf(n ),b[i] ); ()/for ) r=0; rn-1; R(//在该步骤中,开始寻找各列的最大数量(K=R; max=a[r][r]; for(w=r; wn-1; w )//查找,如果在该列下发现大于开头的数,则返回(if ) a[w1][r]=a[w][r] ) {max=a[w 1][r]; k=w 1; //如果发现以下较大的数,则(if ) k=r )//此时,(for ) e=r; en; e//将以下最大数量的行与此列中第一个数量行的所有数量互换{f=a[r][e]; a[r][e]=a[k][e]; a[k][e]=f; }f=b[r]; 使//Y以与行相同的方式变化b[r]=b[k]; b[k]=f; (for ) I=r1; in; I ) ) /与上述相同,进行yldzxc消去法。 由于列已发生变化,{ 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; jn; 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=I1; jn; 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; in; I ) {printf(x(%d )=%lf(n ),i 1,x ) I ) }; }return 0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。