Python列表中的值被覆盖
我正在计算某种不同大小的矩阵a的一些值。即后向误差、前向误差、条件数和误差放大率(均为无穷范数)。我的值被计算出来,然后我试图将它们放入列表中,通过增加矩阵A的大小进行循环。问题是,每次循环后,列表中的值都会被当前条件数覆盖,我不明白为什么。这是我的密码Python列表中的值被覆盖,python,list,linear-algebra,Python,List,Linear Algebra,我正在计算某种不同大小的矩阵a的一些值。即后向误差、前向误差、条件数和误差放大率(均为无穷范数)。我的值被计算出来,然后我试图将它们放入列表中,通过增加矩阵A的大小进行循环。问题是,每次循环后,列表中的值都会被当前条件数覆盖,我不明白为什么。这是我的密码 import numpy as np import math as m from scipy import io, integrate, linalg, signal from scipy.sparse.linalg import eigs
import numpy as np
import math as m
from scipy import io, integrate, linalg, signal
from scipy.sparse.linalg import eigs
sizes = [50, 100, 200, 300, 400]
forward_errors = sizes
backward_errors = sizes
magnification_factors = sizes
cond_numbers = sizes
number = 0
for n in sizes:
A = np.zeros((n, n))
# fill out matrix
i = 0
while(i < n):
j = 0
while(j < n):
A[i, j] = 1.0 / (abs(i - j)**2.0 + 1.0)
j = j + 1
i = i + 1
# fill out x_exact
x_exact = np.ones((n, 1))
# calculate b
b = A.dot(x_exact)
# calculate x_approx
x_approx = linalg.solve(A, b)
# calculate forward error
forward_error = linalg.norm(x_approx - x_exact, ord=np.inf)
print("forward_error = " + str(forward_error))
# calculate residual, backwards error
r = b - A.dot(x_approx)
#print("r = " + str(r))
# calculate error magnification
error_mag = ((forward_error * linalg.norm(b, ord=np.inf)) /
(linalg.norm(r, ord=np.inf) * linalg.norm(x_exact, ord=np.inf)))
#print("error_mag = " + str(error_mag))
# calculate inf-norm condition number of A
cond_number = linalg.norm(A, ord=np.inf)
print("cond_number = " + str(cond_number))
forward_errors[number] = forward_error
print(forward_errors)
backward_errors[number] = r
magnification_factors[number] = error_mag
#print("magnification_factors = " + str(magnification_factors))
cond_numbers[number] = cond_number
print("cond_numbers = " + str(cond_numbers))
#TODO figure out why these 4 are getting overwritten by cond_number
number = number + 1
#TODO figure out why these 4 only print the condition numbers string
print("forward_errors = " + str(forward_errors))
print("backward_errors = " + str(backward_errors))
print("magnification_factors = " + str(magnification_factors))
print("cond_numbers = " + str(cond_numbers))
我把所有的打印语句都放在测试的注释后面,这就是我如何发现所有内容都被条件编号所取代的原因。我怀疑这一定是一些简单的Python的东西,我没有得到。我只是不明白为什么或者在哪里所有的东西都被覆盖了,这对我来说太奇怪了。感谢您的阅读。这是由于Python处理变量引用的方式造成的 你什么时候做的
sizes = [50, 100, 200, 300, 400]
forward_errors = sizes
backward_errors = sizes
magnification_factors = sizes
cond_numbers = sizes
您基本上是共享变量size
引用,而不是它的值。这意味着向前错误
,向后错误
,放大系数
和条件数
对于Python来说是完全相同的变量
你有一些选择来解决这个问题 1-使用复制库
from copy import deepcopy
sizes = [50, 100, 200, 300, 400]
forward_errors = deepcopy(sizes)
backward_errors = deepcopy(sizes)
magnification_factors = deepcopy(sizes)
cond_numbers = deepcopy(sizes)
2-简单地重复这些值
sizes = [50, 100, 200, 300, 400]
forward_errors = [50, 100, 200, 300, 400]
backward_errors = [50, 100, 200, 300, 400]
magnification_factors = [50, 100, 200, 300, 400]
cond_numbers = [50, 100, 200, 300, 400]
您可以找到有关该主题的更多信息
sizes = [50, 100, 200, 300, 400]
forward_errors = [50, 100, 200, 300, 400]
backward_errors = [50, 100, 200, 300, 400]
magnification_factors = [50, 100, 200, 300, 400]
cond_numbers = [50, 100, 200, 300, 400]