マルチリニア式(テンソル)のアルゴリズム原理反復こちらを参照してください。確認したい場合は、原則として一部を共有を明らかにしない、メッセージを残してください
ガウス-ザイデル反復アルゴリズム:線形方程式のPythonの複数の反復アルゴリズム--Gauss -ザイデル反復アルゴリズムを実装
インポートのNPとしてnumpyの インポート時
1.1ヤコビ反復アルゴリズム
DEF Jacobi_tensor_V2(A、B、デルタ、M、N - 、M): スタート = time.perf_counter() #の開始タイミング = 0検索#に所定のステップ数以内収束をマーキングするための X-np.ones =(N-)#の反復を起動 Xが= np.ones(N-) #は、反復の中間結果を格納するために使用される D = np.ones(N-) #**アックスを格納するための対角部(M2)の M1、M1 = M2 = 2- M 用 I におけるレンジ(M): プリント(' X- ' 、X-) A = np.copy(A) #得**(M-2)のアックス 用 J における範囲(M-2): A = np.dot(A、X-) #)2-M(D与える** Dxの(M-2)+(L 'U- +')X **(M-2) のための J で範囲( N-): D [J] = [J、J] A [J、J] = M2 * A [J、J] #反復的に更新 するための J で範囲(N): X [J] =(B [J] -np.dot([J]、X-))/(M1 * D [J]) #は、精度要件を満たしているか否かを判断する 場合 np.max(np.fabs(XX))< デルタ: 探す = 1つの。 BREAKの X- = NP .copy(X) 終了 = time.perf_counter()#終了タイミング を印刷(「時間:」、END- スタート) を印刷(「反復は」、私は) を返す私は、開始・終了を、X-を探します
1.2生成関数生成関数とベクトルbの量:
DEF Creat_A(mは、N-): #はテンソル生成 サイズ= np.full(M、N-) X- = np.ones(N-) しながら 1 : #ランダムに生成されたテンソル所定形状A A = np.randomを。 randint(-49,50、サイズ= サイズ) #ループのうちその場合要件を満たすために、非特異かどうかをDxと**(M-2)を分析、 D = np.copy(A) のため I1 におけるレンジ(N): 用 I2 におけるレンジ(N): IF!I1 = I2: D [I1、I2] = 0 のための I における範囲(M-2 ): D = np.dot(D、X-) DET = np.linalg.det(D) IF DET =!0: BREAKの #対角テンソルAは、支配的なので、対角面10回延長された ため I1 における範囲(N) のために I2 で:レンジ(N) IF I1 == I2: [I1、I2] = [I1、I2] * 10 プリント(' A:' ) プリント(A) を返す#Aのおよび所与のXアックス**(M-1)に係る= Bは、 ベクトルBを生成DEF Creat_b(X、M): = np.copy(A) のための I における範囲(M-1 ): = np.dot(X) の印刷(' B:' ) プリントは、(A) を返します
1.3 S対称テンソル生成機能:
DEF Creat_S(M、N-): #は対称テンソルBの生成 サイズ= np.full(M、N-) S = np.zeros(サイズ) を印刷(' S ' 、S)の ための I 中範囲(4 ): #生成Nベクトルであり 、A = np.random.random(N)* np.random.randint(-5,6- ) B = np.copy(A) #回ランクの対称テンソルを取得する外積のために1-Aをmと量B のための J における範囲(1-M。 ): B = 外部(B、A) #異なるB重畳低ランクテンソルS S = S + B 印刷(' S:' ) プリント(S) リターンS DEF :(B)外 C = [] のための I におけるB: c.append(iは * A) リターンnp.array(c)を 返します
1.4実験A
DEF TEST_1(): デルタ = 0.01 #精密 。M = 3 #の順序 。N- = 3 #の寸法A M = 200である#の反復ステップの最大数 X_real np.array =([2,3,4 ]) A = Creat_A(M、N-) B = Creat_b(A、X_real、M) Jacobi_tensor_V2(A、B、デルタ、M、N-)