python中带枢轴的高斯消除



这是我的高斯算法代码,它似乎在"def-MEG";,但在";def MEG数据透视";当我尝试用gauss算法和pivoting交换行并打印新矩阵时,它会像原来一样打印seek矩阵。为什么?for cicle有问题还是其他问题?为什么新矩阵是第一个矩阵的副本?

import numpy as np
import time
#Eliminazione di Gausss senza pivoting
def MEG(A,b):
#calcolo dimensione vettore
n = len(A)
#ciclo fino alla penultima colonna (dove non eliminiamo nulla)
for j in range(n-1):
#ciclo per le righe (partendo dalla seconda)
for i in range(j+1, n):
#calcolo del coeff m
m = A[i][j]/A[j][j]
A[i][j] = 0
for k in range(j+1,n):
#formula Gauss
A[i][k] = A[i][k] - m*A[j][k]
#anche per i termini b
b[i] = b[i] - m*b[j]
return A

#Costruisco l' algoritmo
def MEGPivoting(A,b):
n = len(A)
for j in range(1,n-1):
#individuo l' elemento pivot
amax = abs(A[j][j])
imax = j
for i in range (j+1, n):
if abs(A[i][j]>amax):
amax = abs(A[i][j])
imax = i
#eventuale scambio di riga
if imax > j:
for k in range (j, n):
#scambio
A[j][k],A[imax][k] = A[imax][k],A[j][k]
b[j],b[imax]=b[imax],b[j]
print('matrice con riga scambiate')
print(A)

#metodo di eliminazione di Gauss
MEG(A,b)
return  A 

#Creo la matrice
n = 5
M = 10
A = np.random.rand(n,n)*2*M - M 
print('Matrice = ')
print(A)
xsol = np.ones(n) #vettore incognite tutti 1
inizio = time.time()
b = np.dot(A,xsol) #vero vettore incognite ricavato da A*xsol
x = MEGPivoting(A,b)
fine = time.time()
#tempo totale
tempo = fine-inizio
print('nnSoluzione con pivoting = ')
print(x)
print('nnTempo impiegato: %f'%tempo)

Python以一种传递地址的方式执行操作,因此当您将数组a传递给MEGPivoting()方法时,必须在内部执行复制操作。在该方法开始时,在计算n = len(A)时,还尝试插入命令A = np.copy(A)。这将精确地用于制作矩阵的副本,以便在执行操作时不会修改原始矩阵a,而是对其副本执行操作。您还需要将其添加到MEG()方法中。显然,您还必须使用命令b = np.copy(b)复制已知b的向量。

代码应该是这样的:

#Eliminazione di Gausss senza pivoting
def MEG(A,b):
A = np.copy(A) # copia della matrice A
b = np.copy(b) # copia del vettore dei termini noti b
# calcolo dimensione vettore
n = len(A)
#ciclo fino alla penultima colonna (dove non eliminiamo nulla)
for j in range(n-1):
#ciclo per le righe (partendo dalla seconda)
for i in range(j+1, n):
#calcolo del coeff m
m = A[i][j]/A[j][j]
A[i][j] = 0
for k in range(j+1,n):
#formula Gauss
A[i][k] = A[i][k] - m*A[j][k]
#anche per i termini b
b[i] = b[i] - m*b[j]
return A

def MEGPivoting(A,b):
A = np.copy(A) # copia della matrice A
b = np.copy(b) # copia del vettore dei termini noti b
n = len(A)
for j in range(1,n-1):
# pivot
amax = abs(A[j][j])
imax = j
for i in range (j+1, n):
if abs(A[i][j]>amax):
amax = abs(A[i][j])
imax = i
# scambio di riga
if imax > j:
for k in range (j, n):
#scambio
A[j][k],A[imax][k] = A[imax][k],A[j][k]
b[j],b[imax]=b[imax],b[j]
print('matrice con riga scambiate')
print(A)

# di eliminazione di Gauss
MEG(A,b)
return  A 

相关内容

  • 没有找到相关文章

最新更新