【发布时间】:2021-01-30 12:22:54
【问题描述】:
我得到了他的错误,无法找出原因。显然这段代码在 Python 2 中工作,我使用的是 Python 3.7,这似乎是问题所在?有人能够解释这里出了什么问题吗?
A = np.array([[10,12],[12,10]])
b= np.array([2,1])
x0 = np.array([0., 0.])
tol = 10 ** (-15)
max_iter = 20
w = 1.5
def SOR(A, b, x0, tol, max_iter, w):
if (w<=1 or w>2):
print('w should be inside [1, 2)');
step = -1;
x = float('nan')
return
n = b.shape
x = x0
for step in range (1, max_iter):
for i in range(n[0]):
new_values_sum = np.dot(A[i, :i], x[:i])
old_values_sum = np.dot(A[i, i+1 :], x0[ i+1: ])
x[i] = (b[i] - (old_values_sum + new_values_sum)) / A[i, i]
x[i] = np.dot(x[i], w) + np.dot(x0[i], (1 - w))
if (np.linalg.norm(x - x0) < tol):
if (np.linalg.norm(np.dot(A, x)-b ) < tol):
print(step)
break
x0 = x
print("X = {}".format(x))
print("The number of iterations is: {}".format(step))
return x
x = SOR(A, b, x0, tol, max_iter, w)
print(np.dot(A, x))
我得到以下错误信息:
Error: x[i]=(1-w)*x[i]-w*(np.dot(A[i,:],x)-b[i]-A[i,i]*x[i])/A[i,i]
ValueError: setting an array element with a sequence.
尝试用上面的代码实现 SOR 方法,为什么会出现这个错误?
【问题讨论】:
-
请提供预期的MRE。显示中间结果与预期结果的偏差;包括您的初始调试跟踪:错误点的违规值是什么,它们与您的需要有何不同。我们应该能够将您的代码块粘贴到文件中,运行它并重现您的问题。
-
x/x0是一个 (2,) 形状数组;x[i]是一个号码的插槽。显然,在您的错误行中,分配的 RHS 正在生成一个具有多个值的数组。您需要自行评估它并检查值和shape,然后找出为什么它不是您所期望的。这只是一个基本的调试步骤 - 检查问题行中的值。
标签: python arrays python-3.x numpy loops