我用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]]时,它就可以工作很好,但在其他情况下则不然。如果有人可以帮助我编写此代码,我将不胜感激。