前提・実現したいこと
python3.xで、連立一次方程式をPivot選択付きGauss消去法で解こうとしています。前進消去法の計算過程でエラーが出てしまいます。
Ax=bについては、Aは5次元ヒルベルト行列、x=(1,1,1,1,1)'、bはxの値に伴ってAの列ごとの和を成分に持つ5次元ベクトルです。
発生している問題・エラーメッセージ
File "<ipython-input-195-0db97456e826>", line 1, in <module> forwardelimination(a,b) File "<ipython-input-194-b8398e40a32d>", line 4, in forwardelimination aik = a[i][k] / a[k][k] ZeroDivisionError: float division by zero
該当のソースコード
python
1N = 5 2a = [[0 for i in range(5)] for j in range(5)] 3b = [0 for i in range(5)] 4 5#ヒルベルト行列(A)の作成# 6def makehilbertmatrix (N, a): 7 for i in range(0, N, 1): 8 for j in range(0, N, 1): 9 a[i][j] = 1 / (i + 1 + j + 1 - 1) 10 11#ベクトルbの作成# 12def makeb (a, b): 13 for i in range(0, N, 1): 14 for j in range (0, N, 1): 15 b[i] += a[i][j] 16 17#ピボット選択付き前進消去法# 18def forwardelimination (a, b): 19 for k in range(0, N, 1): 20 for i in range(k, N - 1, 1): 21 aik = a[i][k] / a[k][k] 22 for j in range(k, N ,1): 23 a[i][j] -= a[k][j] * aik 24 b[i] -= b[k] * aik 25 #ピボット選択# 26 for k in range (0, N, 1): 27 pivot_i = k 28 pivot_val = 0.0 29 for i in range(k, N, 1): 30 if (abs(a[i][k]) > pivot_val): 31 pivot_i = i 32 pivot_val = abs(a[i][k]) 33 if (pivot_i != k): 34 tmp = 0.0 35 for j in range(0, N, 1): 36 tmp = a[pivot_i][j] 37 a[pivot_i][j] = a[k][j] 38 a[k][j] = tmp 39 tmp = b[i] 40 b[i] = b[k] 41 b[k] = tmp 42 43#関数の実行# 44makehilbertmatrix(N, a) 45makeb(a, b) 46forwardelimination(a, b)
試したこと
ピボット選択の部分を外して実行しましたが同様のエラーが出ます。
それぞれのa[k]kを表示させると
python
1def func (a, b): 2 for k in range(0, N, 1): 3 for i in range(k, N - 1, 1): 4 print(a[k][k]) 5 6 7func(a,b) 80.3333333333333333 90.3333333333333333 100.3333333333333333 110.3333333333333333 120.5 130.5 140.5 150.25 160.25 170.14285714285714285
このようになり、0は入っていません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/25 11:10