1.原理:
高斯消去法是利用矩阵的初等行变换将系数矩阵化成一个上三角矩阵,同时,增广矩阵后面的右端向量也跟着变化。其实质是将线性方程组进行一系列的相加相减等变化通过矩阵反映出来的过程。高斯消去法包括两个步骤,即消元和回代。当矩阵变成上三角矩阵后,可以从右下角开始依次解出方程组的xn,xn-1…x1这也就是回代的过程。 (1) 归一化:
对j=k+1…n的数值 a[k][j]/a[k][k]赋值给a[k][j] 同时b[n]也跟着变化:b[k]/a[k][k]赋值给b[k] (2) 消元:
对a[i][j]赋值为a[i][j]-a[i][k]
(i=k+1…n;j=k+1…n)
同时b[i]赋值为b[i]-a[i][k]b[k] (i=k+1…n) (3) 回代: 从最后一个xn开始 有x[n-1]=b[n-1]/a[n-1][n-1]
且依次用已经往上迭代可解出的值b[k]…b[0]。 2.源程序如下:
#include #define N 10 //矩阵大小范围 /* * 使用已经求出的x,向前计算x(供getx()调用) * float a[][] 系数矩阵 * float x[] 方程组解 * int i 解的序号 * int n 矩阵大小 * return 公式中需要的和 */ float getm(float a[N][N], float x[N], int i, int n) { float m = 0; int r; for(r=i+1; r return m; } /* * 解方程组,计算x * float a[][] 系数矩阵 * float b[] 右端项 * float x[] 方程组解 * int i 解的序号 * int n 矩阵大小 * return 方程组的第i个解 */ float getx(float a[N][N], float b[N], float x[N], int i, int n) { float result; if(i==n-1) //计算最后一个x的值 result = float(b[n-1]/a[n-1][n-1]); else //计算其他x值(对于公式中的求和部分,需要调用getm()函数) result = float((b[i]-getm(a,x,i,n))/a[i][i]); return result; } void main() { float a[N][N]; //系数矩阵 float b[N]; //右端项 float x[N]; //方程组解 int i,j,k; int n=N; //矩阵大小 /*用户手工输入矩阵*/ printf(\"请输入系数矩阵的大小:\"); scanf(\"%d\ printf(\"请连续输入矩阵值:\"); for(i=0; i printf(\"请输入右端项:\"); for(i=0; i /*显示原始矩阵*/ printf(\"\\n原始矩阵\\n\"); for(i=0; i printf(\"\\n\\n\"); /*进行高斯消去*/ for(i=0; i b[i]=(float)(b[i]/a[i][i]); a[i][i]=1; for(k=i+1;k b[k]=(float)(b[k]-a[k][i]*b[i]); } for(j=i+1;j /*显示处理后矩阵*/ printf(\"高斯消去后矩阵\\n\"); for(i=0; i /*回代方式解方程组*/ for(i=n-1; i>=0; i--) { x[i] = getx(a,b,x,i,n); } /*显示方程组解*/ printf(\"\\n\\n方程组解\\n\"); for(i=0; i 3.运行结果: 根据提示依次输入矩阵大小,然后输入线性方程组系数矩阵以及方程组的右端项。运行结果如下: 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- banwoyixia.com 版权所有 湘ICP备2023022004号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务