1

这是我使用高斯算法的代码,它似乎在“def MEG”中工作,但是在“def MEGPivoting”中,当我尝试用带有旋转的高斯算法交换我的行并打印新矩阵时,它打印出看起来像矩阵原来的。为什么?是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('\n\nSoluzione con pivoting = ')
print(x)
print('\n\nTempo impiegato: %f'%tempo)
4

0 回答 0