关闭

Gauss消元法(特解与通解)

201人阅读 评论(0) 收藏 举报
分类:

这里给出了加强版本的高斯消元算法的实现,当未知数的个数多于方程的数量时,则将方程的解表示为其余某些未知数与常数的线性组合,若可确定解,则给出常数解。

基本思路是:

(1)找到第i列不是0的元素,将它交换到第i行,然后将第i+1到n行的中的第i个元素全部消为0。经过n-1次循环,最后得到一个上三角矩阵。

(2)从最后一行开始进行展开,将下一行未知数解出,然后带入上一行,解出新的未知数的解的多项式,然后不停迭代。

(3)当方程的解只有特解时,得到的是只关于常数的一系列多项式。通解是关于后nR(A)个未知数的线性组合;


def gauss(a):
    ep = 0.1**(15)
    n = len(a)
    num = len(a[0])
    array = []
    for i in range(0,n):
        p = -1
        for k in range(i,n):
            if abs(a[k][i])>ep:p=k;break
        if p==-1:continue
        a[i],a[p] = a[p],a[i]
        if a[i]!=[0]*num:array.append(a[i])
        x = a[i][i]
        for j in range(i+1,n):
            if abs(a[j][i])<ep:continue
            k = -a[j][i]/(x)
            for m in range(i,num):a[j][m]+= k*a[i][m]
    a = array;n = len(a);num = len(a[0])
    for index in range(0,num-1):
        if a[-1][index]!=0:break
    last = deque()
    for k in range(0,num-index-2):last.append([1 if m==k else 0 for m in range(num-index-2)]+[0])
    for i in range(n-1,-1,-1):
        sum_1 = [0]*(num-index-2)
        constant = 0
        for item in zip(a[i][i+1:num-1],last):
            constant += item[0]*item[1][-1]#compute the constant
            for ind in range(len(item[1])-1):
                sum_1[ind] -= item[0]*item[1][ind]/a[i][i]
        sum_1.append((a[i][-1]-constant)/a[i][i])
        last.appendleft(sum_1)
    print(a,last)
#gauss([[1,1,2,3,3],[2,1,2,4,5],[1,1,4,5,3],[1,3,7,4,6]])
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:183395次
    • 积分:5748
    • 等级:
    • 排名:第4487名
    • 原创:403篇
    • 转载:8篇
    • 译文:0篇
    • 评论:12条
    最新评论