【发布时间】:2021-06-21 16:14:11
【问题描述】:
我正在对某种类型的三对角矩阵进行 LU 分解,但我遇到了一个我完全无法理解的 Python 问题。
def trisolve2(b):
length = len(b)
# Solve Ly = b
y = b.copy()
for i in range(1, length):
print('y[' + str(i) + '] = ' + str(b[i]) + ' - (-' + str(i) + ' / (' + str(i+1)
+ ')) * ' + str(y[i-1]))
y[i] = b[i] - (-1 * i / (i+1)) * y[i-1]
print("y = " + str(y))
# Solve Ux = y
x = y.copy()
for i in range(length - 2, 0, -1):
print("x = " + str(x))
x[i] = (y[i] + x[i+1]) / ((i+2) / (i+1))
return x
test_b = np.array([[1], [0], [0], [0], [1]])
print("b = " + str(test_b))
test_x = trisolve2(test_b)
print("x = " + str(test_x))
我希望当 i = 1 时,y[i] 被分配到 1/2,它甚至看起来应该与我放在那里的打印语句一样,但由于某种原因我无法包装我的绕着它走永远不会改变。 y 保持 b,x 保持 y 不变。输出是:
b = [[1]
[0]
[0]
[0]
[1]]
y[1] = [0] - (-1 / (2)) * [1]
y[2] = [0] - (-2 / (3)) * [0]
y[3] = [0] - (-3 / (4)) * [0]
y[4] = [1] - (-4 / (5)) * [0]
y = [[1]
[0]
[0]
[0]
[1]]
x = [[1]
[0]
[0]
[0]
[1]]
x = [[1]
[0]
[0]
[0]
[1]]
x = [[1]
[0]
[0]
[0]
[1]]
x = [[1]
[0]
[0]
[0]
[1]]```
【问题讨论】:
-
我怀疑这与多维 numpy 数组的工作方式有关,而不是与 for 循环的机制有关——它闻起来很像引用与值的问题。
-
尝试使用
deepcopy()而不是copy() -
您使用的是什么版本的 Python?如果是 Python 2.x(没有
from __future__ import division),那么i / (i+1)不会像你想的那样:它总是会返回零。如果是这种情况,请尝试在您的打印语句中包含表达式b[i] - (-1 * i / (i+1)) * y[i-1]的实际评估值,以了解原因。
标签: python list numpy for-loop linear-algebra