2017-09-21 3 views
-1

J'essaye de réduire une matrice à sa forme echlon en utilisant une fonction mais en appelant la fonction, elle change aussi ses arguments. Voici le codeAppel de fonction changeant son argument python

def GaussE(E,r): 
    N = np.size(r) 
    for i in range(0,N-1): 
     for j in range(i+1,N): 
      f=(E[j,i]/E[i,i]) 
      r[j]= r[j] -(f)*r[i]    
      for k in range(i,N):       
       E[j,k] = E[j,k]-(f*E[i,k]) 
    return(E,r) 
A = np.array([[5.10,8.70],[2.40,4.10]]) 
b = np.array([9.48,4.48]) 
print(A,b) 

sortie: [[5.1 8.7] [2.4 4.1]] [9,48 4,48]

X = GaussE(A[:],b[:]) 
print(A,b) # Why is A and b changing? they should not change 

sortie: [[5.10000000e + 00 8.70000000e +00] [0.00000000e + 00 5.88235294e-03]] [9,48 0,01882353]

Répondre

0

en python toutes ref variables ers à un objet. Il fait référence au pointeur d'objet afin qu'il utilise l'objet lui-même.
Dans cette fonction vous faites référence E comme E[j,k] et r comme r[j] et en attribuant à ce qui signifie que vous utilisez ce même objet et signifie que vous manipuler.
Essayez d'utiliser copy à la première de votre fonction (from copy import copy)

from copy import copy 

def GaussE(E,r): 
    E = copy(E) 
    r = copy(r) 
    N = np.size(r) 
    for i in range(0,N-1): 
     for j in range(i+1,N): 
      f=(E[j,i]/E[i,i]) 
      r[j]= r[j] -(f)*r[i]    
      for k in range(i,N):       
       E[j,k] = E[j,k]-(f*E[i,k]) 
    return(E,r) 
A = np.array([[5.10,8.70],[2.40,4.10]]) 
b = np.array([9.48,4.48]) 
print(A,b)