質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3827閲覧

Python ガウス消去法の中に出てくるZeroDivisionErrorが解決できません

Akiranaba

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/06/25 08:29

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

手元で計算過程を出力してみましたが、ガウス消去法で計算している過程で対角成分が 0 になるケースが実際に発生しています。

python

1def forwardelimination (a, b): 2 for k in range(0, N, 1): 3 for i in range(k, N - 1, 1): 4 print(a) 5 aik = a[i][k] / a[k][k]

のようにしてみればどんな値になっているのかわかると思います。

ところで、ここまで forif がネストしていると大変読みにくいので、いくつかの関数に分解するか処理を見直すことをおすすめします。

投稿2018/06/25 08:43

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkgrei

2018/06/25 11:10

ループ2回目でいきなり0ですね。
guest

0

自己解決

前進消去法の関数内の2つ目のfor文の範囲が間違っていました.消去するのはピボット選択された行以降の行でした.下が訂正したものになります

python

1#ピボット選択付き前進消去法# 2def forwardelimination (a, b): 3 for k in range(0, N, 1): 4 for i in range(k + 1, N, 1): 5 aik = a[i][k] / a[k][k] 6 for j in range(k, N ,1): 7 a[i][j] -= a[k][j] * aik 8 b[i] -= b[k] * aik 9 #ピボット選択# 10 for k in range (0, N, 1): 11 pivot_i = k 12 pivot_val = 0.0 13 for i in range(k, N, 1): 14 if (abs(a[i][k]) > pivot_val): 15 pivot_i = i 16 pivot_val = abs(a[i][k]) 17 if (pivot_i != k): 18 tmp = 0.0 19 for j in range(0, N, 1): 20 tmp = a[pivot_i][j] 21 a[pivot_i][j] = a[k][j] 22 a[k][j] = tmp 23 tmp = b[i] 24 b[i] = b[k] 25 b[k] = tmp 26

投稿2018/06/30 08:41

Akiranaba

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問