在计算norm_时,Python正在更新v0。我不明白为什么会这样,并且导致norm_为0。如果我在matlab中运行相同的代码,则该代码有效。 '''python
v = array([0, 0])
norm_ = 1
n = 0
while norm_ > tol:
v0 = v
v[0] = max(5.0 + 0.5 * lmbda * v[0] + 0.5 * lmbda * v[1], 10.0 + lmbda * v[1])
v[1] = -1 + lmbda * v[1]
norm_ = norm(v - v0, inf)
n += 1
'''
答案 0 :(得分:0)
就像在Python中一样,当您更改元素'v'时,每个变量都是一个引用,它将影响'v0',因为它指向同一对象。 我建议您使用复制来避免它:
v0 = array([0, 0])
v = copy(v0)
norm_ = 1
n = 0
while norm_ > tol:
v[0] = max(5.0 + 0.5 * lmbda * v[0] + 0.5 * lmbda * v[1], 10.0 + lmbda * v[1])
v[1] = -1 + lmbda * v[1]
norm_ = norm(v - v0, np.inf)
n += 1
答案 1 :(得分:0)
Numpy
对象一样, list
数组对象是其他对象(dtype)的可变容器。在您的代码段中,在每次迭代中,分配v0 = v
时,两个变量都指向相同的内存位置。因此,对其中之一进行变异会导致另一变异。要更改此行为,可以使用copy()
属性:
import numpy as np
a = np.array([0, 0])
b_1 = a
b_2 = a.copy()
print(b_1 is a) # True
print(b_2 is a) # False
因此最终代码必须为:
v = array([0, 0])
norm_ = 1
n = 0
while norm_ > tol:
v0 = v.copy()
v[0] = max(5.0 + 0.5 * lmbda * v[0] + 0.5 * lmbda * v[1], 10.0 + lmbda * v[1])
v[1] = -1 + lmbda * v[1]
norm_ = norm(v - v0, inf)
n += 1
旁注:要导入numpy
,请使用import numpy as np
作为约定。例如,它可以帮助您使用norm = np.norm(...)
,并使代码更易于阅读和调试。