私は線形方程式を解くためのヤコビ法を実行するためのコードを書こうとしています(私の方法はこれを行うための最も効率的な方法ではないことを理解していますが、なぜそれが機能しないのかを理解しようとしています)。
問題をデバッグしようとしましたが、次の問題に気づきました。xnew [i]に新しい値が割り当てられる32行目の2回目の反復では、x [i]が参照されていなくても、同じ値がx [i]にも割り当てられるため、コードは2回の反復後に終了します。forループが最初に実行されたときではなく、2回目の反復でこれが発生するのはなぜですか?これを修正する方法はありますか?
前もって感謝します
import numpy as np
A = np.array(
[[0.93, 0.24, 0],
[0.04, 0.54, 0.26],
[1, 1, 1]])
b = np.array([[6.0], [2.0], [10.0]])
n , m = np.shape(A)
x = np.zeros(shape=(n,1))
xnew = np.zeros(shape=(n,1))
iterlimit = 100
tol = 0.0000001
for iteration in range(iterlimit):
convergence = True
for i in range(n):
sum=0
for j in range(n):
if j != i:
sum = sum + (A[i,j] * x[j])
#on second iteration (iteration =1) below line begins to
#assign x[i] the same values as it assigns xnew[i] causing the
#convergence check below to not run and results in a premature break
xnew[i] = 1/A[i,i] * (b[i] - sum)
if abs(xnew[i]-x[i]) > tol:
convergence = False
if convergence:
break
x = xnew
print("Iteration:", iteration+1)
print("Solution:")
print(np.matrix(xnew))
x = xnew
この行はに割り当てxnew
られx
ます。xnewの内容ではなく、配列自体です。したがって、最初の反復の後、メモリ内の同じ配列x
をxnew
参照します。
代わりに試してください x[:] = xnew[:]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加