高斯消元法是线性代数中的一个算法可用来求解线性方

上传人:枫** 文档编号:473693504 上传时间:2024-01-21 格式:DOCX 页数:9 大小:16.43KB
返回 下载 相关 举报
高斯消元法是线性代数中的一个算法可用来求解线性方_第1页
第1页 / 共9页
高斯消元法是线性代数中的一个算法可用来求解线性方_第2页
第2页 / 共9页
高斯消元法是线性代数中的一个算法可用来求解线性方_第3页
第3页 / 共9页
高斯消元法是线性代数中的一个算法可用来求解线性方_第4页
第4页 / 共9页
高斯消元法是线性代数中的一个算法可用来求解线性方_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《高斯消元法是线性代数中的一个算法可用来求解线性方》由会员分享,可在线阅读,更多相关《高斯消元法是线性代数中的一个算法可用来求解线性方(9页珍藏版)》请在金锄头文库上搜索。

1、高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求 出可逆方阵的逆矩阵。高斯消元法的原理是:若用初等行变换将增广矩阵 化为,则AX = B与CX = D是同解方程组。所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解。以上是线性代数课的回顾,下面来说说高斯消元法在编程中的应用。首先,先介绍程序中高斯消元法的步骤:(我们设方程组中方程的个数为equ,变元的个数为var,注意:一般情况下是n个方程,n个变 元,但是有些题目就故意让方程数与变元数不同)1. 把方程组转换成增广矩阵。2. 利用初等行变换来把增广矩阵转换成行阶梯阵。枚举k从0到equ

2、 - 1,当前处理的列为col(初始为0),每次找第k行以下(包括第k行),col列中 元素绝对值最大的列与第k行交换。如果col列中的元素全为0,那么则处理col + 1列,k不变。3. 转换为行阶梯阵,判断解的情况。 无解当方程中出现(0, 0,,0, a)的形式,且a != 0时,说明是无解的。 唯一解条件是k = equ,即行阶梯阵形成了严格的上三角阵。利用回代逐一求出解集。 无穷解。条件是k k)。显然如果akk特别小的话,不仅有可能损失精度,还有可能 造成出。为了避免这种情况,我们需要选取主元:在系数矩阵右下角选取n-k+1阶子矩阵中绝对值最大的元素a”,交换第行与第i行,交换第

3、k列与殉列。注意到列的交换会使得解的顺序混乱,因此我们需要记录列的交换过程,以便 最后还原。当然由于交换后akk的绝对值是最大的,所以如果akk=我们就可以直接终止 计算了,因为这时无法找到唯一的一组解。(选取主元的过程并不影响时间复杂度,整个过 程的时间复杂度仍然是O(n3)高斯约当消元法高斯约当消元法是一种不需要回代的消元法,可以算是高斯消元法的一种改进,它与高斯消 元法唯一的不同是:高斯约当消元法每次不仅要把主对角线以下的元素消为0,还要把主对角 线以上的元素消为0。自然消完后系数矩阵只有主对角线上有非0元素,所以就不需要回代了。其他解法除了高斯消元法与高斯约当消元法外,我们还可以使用迭

4、代法或者共轭梯度法来解线性方程 组。练习题1. zoj2296 Spread Sheet2. hdu2449 Gauss Elimination3. NOIP2004 虫食算参考资料1 徐士良数值分析与算法机械工业出版社2 何江舟用高斯消元法解线性方程组下面讲解几道OJ上的高斯消元法求解线性方程组的题目:POJ 1222 EXTENDED LIGHTS OUThttp:/ 1681 Painters Problemhttp:/ 1753 Flip Gamehttp:/ 1830开关问题http:/ 3185 The Water Bowlshttp:/ 接套模板求解即可。但是,当出现无穷解时,需

5、要枚举解的情况,因为无法判断哪种解是题目要 求最优的。POJ 2947 Widget Factoryhttp:/ 注意:当方程组唯一解时,求解过程中要保证解在3, 9之间。POJ 1166 The Clockshttp:/ 数,故在求解过程中不能进行取余(因为取余可能导致解集变大),但最后求解集时,还是需要进 行取余操作,那么就不能保证最后求出的解是正确的在discuss里提问了好几天也没人回答. 希望哪位路过的大牛指点下POJ 2065 SETIhttp:/ 可。(虽然AC的人很少,但它还是比较水的一道题,)POJ 1487 Single-Player Gameshttp:/ 觉.)解方程组

6、的思想还是很好看出来了 (前提是通读题目不下5遍.),但如果把树的字符串表达式转换 成方程组是个难点,我是用栈+递归的做法分解的。首先用栈的思想求出该结点的孩子数,然 后递归分别求解各个孩子。这题解方程组也与众不同首先是求解浮点数方程组,要注意精度问题,然后又询问不确定的变 元,按前面说的方法求解。一顿折腾后,这题居然写了6000+B.而且冏的是巨人C+ WA,G+ AC,可能还是精度的问题 吧看这题目,看这代码,就没有改的欲望hdu OJ 2449http:/ 1个多小时主要就是写一个分数类,套个高精模 板(偷懒点就Java.)搞定注意下0和负数时的输出即可。fze OJ 1704http:

7、/ #include #include using namespace std;const int maxn = 105;int equ, var; /有equ个方程,var个变元。增广阵行数为equ,分别为0到equ - 1,列数为var + 1, 分别为0到var.int amaxnmaxn;int xmaxn; / 解集.bool free_xmaxn; /判断是否是不确定的变元.int free_num;void Debug(void)(int i, j;for (i = 0; i equ; i+)(for (j = 0; j var + 1; j+)(cout aij ;cout e

8、ndl;cout endl;inline int gcd(int a, int b)(int t;while (b != 0)(t = b;b = a % b;a = t;return a;inline int lcm(int a, int b)(return a * b / gcd(a, b);/高斯消元法解方程组(Gauss-Jordan elimination).(-2表示有浮点数解,但无整数解,-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)int Gauss(void)(int i, j, k;int max_r; /当前这列绝对值最大的行.int col; /当前处理的列.int ta, tb;int LCM;int temp;int free_x_num;int free_index;/转换为阶梯阵.col = 0; /当前处理的列.for (k = 0; k equ & col var; k+, col+)( /枚举当前处理的行./找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差) max_r = k;for (i = k + 1; i abs(amax_rcol) max_r = i;if (max_r

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号