我自己的python中的Gauss-Jordan代码无法正常运行

时间:2019-12-15 15:59:18

标签: python

我用python编码了Gauss-Jordan进程。幸运的是,它适用于某些矩阵,但不适用于某些矩阵。其余的是矩阵3 * 3的代码说明。 (以下3个功能是问题末尾编写的主要代码的子部分。)

功能#1 采用列号 i ,如果存在,则将1设为第一个非零成员。

def Make_Unit(counter,i):
    global j
    for j in range(counter , 3):
        if j==0 and A[j,i] !=0:
            A[j,:]=np.true_divide(A[j,:],A[j,i])
            break
        else:
            if A[j,i] !=0:
                A[j,:]=np.true_divide(A[j,:],A[j,i])
                break
    return A

功能#2 从上一步中获取矩阵的(j,i)元素,并将其上下元素设为零。

def Making_Zero_Up_Down(i,A):
    for k in range(3):
        if k==j:
            continue
        A[k,:]=((-A[k,i])*A[j,:])+A[k,:]
    return A

功能#3 将上一步的行位置更改为更高的位置。

我不知道为什么计数器无法正常工作,并且当我在 counter + = 1 之后在此处打印时,python会打印出我认为不合理的数字

def Change_Rows(counter,i,A):
    if A[j,i] !=0:
        A[[j , counter]] = A[[counter,j]]
        counter+=1
    return A

现在,我想将它们放在一起以按以下方式运行高斯-乔丹的整个过程:

import numpy as np
A=np.array([[2.0,3.0,4.0],
   [4.0,4.0,7.3],
   [7.0,9.0,0.1]])


def Making_Unit_Column(A,i,counter):

    def Make_Unit(counter,i):
        global j
        for j in range(counter , 3):
            if j==0 and A[j,i] !=0:
                A[j,:]=np.true_divide(A[j,:],A[j,i])
                break
            else:
                if A[j,i] !=0:
                    A[j,:]=np.true_divide(A[j,:],A[j,i])
                    break
        return A
    A=Make_Unit(counter,i)
    def Making_Zero_Up_Down(i,A):
        for k in range(3):
            if k==j:
                continue
            A[k,:]=((-A[k,i])*A[j,:])+A[k,:]
        return A
    A=Making_Zero_Up_Down(i,A)
    def Change_Rows(counter,i,A):
        if A[j,i] !=0:
            A[[j , counter]] = A[[counter,j]]
            counter+=1
        return A 
    A, counter=Change_Rows(counter,i,A)



def whole_process(A):
    i=0
    counter=0
    while i<3:
        Making_Unit_Column(A,i,counter)
        i+=1
    return(A)

当A是具有严格小于2个非零条目的列的矩阵,例如A = [[0,2,0],[3,0,0],[0,0,8]]时,它就可以工作很好,但在其他情况下则不然。如果有人可以帮助我编写此代码,我将不胜感激。

0 个答案:

没有答案