高斯消元-解求精技术(Python)

来源:互联网 发布:莆田云计算机房 编辑:程序博客网 时间:2024/06/06 07:22

第一次写CSDN博客,以前年幼无知玩新浪博客,文章仅代表个人观点,如有错误,欢迎各位大佬指出。废话不多说,马上献上这次博客的内容!

最近刚学习了高斯消元,老师要求我们用Python实现高斯消元的解求精技术。所谓高斯消元的解求精技术主要包含以下三种:

  • 使用更多有效位
  • 交换主元
  • 缩放

一、使用更多有效位

大家都知道,对于病态方程组,是不能使用高斯消元法对其进行求解的。
那么,最简单的解决办法就是在计算中使用更多的有效位。
在此,我就不深入解释了,大家有空可以尝试一下。

二、交换主元

在方程的规范化过程中,会出现除零的问题。

所谓除零问题,就是:在方程组相应的系数矩阵中,主对角线的值出现0或全为0时,用编程方式实现高斯消元法时,就要对各个方程的顺序进行调整,称为除0。

因为计算机是不会像人类一样,知道出现0,就会自动地将方程调换顺序,对计算机来说,实现高斯消元还要加上除零这个步骤。这个时候,就需要交换主元。

首先要确定主元下的列的最大系数。
1.将最大系数的行和原主元的行进行交换,成为新的主元行,这个方法称为部分交换主元
2.将行和列都进行最大值的选择搜索并交换,成为新主元的行和列,这个方法称为完全交换主元
一般来说,常使用部分交换主元法。

例如:
使用高斯消元法求解方程组:
0.0003 x1 + 3.0000 x2 = 2.0001
1.0000 x1 + 1.0000 x2 = 1.0000
准确解应为: x1 = 1/3,x2 = 2/3

# coding=utf-8# 高斯消元法# 0.0003x1+3.0000x2=2.0001# 1.0000x1+1.0000x2=1.0000# 交换主元def gauss():    matrix1 = [[0.0003, 3.0000], [1.0000, 1.0000]]    matrix2 = [2.0001, 1.0000]    result = [0, 0]    k = 0    p = k    big = matrix1[k][k]    for i in range(k+1, 1):        dummy = matrix1[i][k]        if dummy > big :            big = dummy            p = i    if p != k :        for j in range(k, 1):            dummy = matrix1[p][j]            matrix1[p][j] = matrix1[k][j]            matrix1[k][j] = dummy        dummy = matrix2[p]        matrix2[p] = matrix2[k]        matrix2[k] = dummy    for w in range(0, 0):        for i in range(w+1, 1):            factor = matrix1[i][w]/matrix1[w][w]            for j in range(w+1, 1):                matrix1[i][j] = matrix1[i][j] - factor * matrix1[w][j]            matrix2[i] = matrix2[i] - factor * matrix2[w]    for w in range(0, 1):        result[w] = matrix2[w] / matrix1[w][w]    for i in range(0, 0):        sum = matrix2[i]        for j in range(i+1, 1):            sum = sum - matrix1[i][j] * result[j]        result[i] = sum / (matrix1[i][j] * 10000)    print resultif __name__ == '__main__':    res = gauss()    print res

各位大佬请注意!

程序运行结果是有问题的,但是由于我不会改,于是就这样了,代码仅供参考。
结果求得: x1 = 6667.000000000001, x2 = 0
跪求知道原因的大佬指出错误,交流学习。

三、缩放

将某行方程组的系数进行缩小或放大,可以使得行列式的大小标准化,还可以减小舍入误差。
但是需要注意的是,缩放的目的只是判断是否需要交换主元,并不是为了真正的缩小放大方程系数。
缩小或放大系数后模拟高斯消元解方程的过程,若合适,再交换主元,而不是缩放。


希望有更多的人跟我探讨这个程序的解决办法!再次感谢!