teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

d

2020/12/07 06:09

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ```diff
10
10
  - xn1=(b-np.dot(R,x))/D
11
- + xn1 = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
11
+ + x = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
12
12
  ```
13
13
 
14
14
  あと以下もおかしいですね
@@ -18,11 +18,6 @@
18
18
  + i += 1
19
19
  ```
20
20
 
21
- ```diff
22
- - xn1=(b-np.dot(R,x))/D
23
- + x=(b-np.dot(R,x))/D
24
- ```
25
-
26
21
  ## 追記
27
22
 
28
23
  * 行列ベクトル積、行列積は numpy.dot() を使うほかに `@` 演算子でも計算可能です。
@@ -30,7 +25,7 @@
30
25
  np.dot(A, B) → A @ B
31
26
  `@` 演算子を使ったほうがプログラムの見通しがよくなるかと思います。
32
27
  * 1 / D だと対角成分以外の除算を行った場合に0割が発生するので、`np.linalg.inv(D)` で逆行列を計算するか、`D_inv = np.reciprocal(D, out=np.zeros(D.shape, float), where=D != 0)` で0でない要素だけ逆数をとります。
33
- * pow(10,-6) は、指数表記 10e-6 でも表せます
28
+ * pow(10,-6) は、指数表記 1e-6 でも表せます
34
29
 
35
30
  ```python
36
31
  R = A - D # 対角成分以外
@@ -40,6 +35,6 @@
40
35
  for i in range(100):
41
36
  x = D_inv @ (b - R @ x)
42
37
 
43
- if np.linalg.norm(A @ x - b) <= 10e-6:
38
+ if np.linalg.norm(A @ x - b) <= 1e-6:
44
39
  break
45
40
  ```

5

d

2020/12/07 06:09

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -29,7 +29,7 @@
29
29
  np.dot(A, x) → A @ x
30
30
  np.dot(A, B) → A @ B
31
31
  `@` 演算子を使ったほうがプログラムの見通しがよくなるかと思います。
32
- * 1 / D だと対角成分以外の除算を行った場合に0割が発生するので、`np.linalg.inv(D)` で逆行列を計算しておきます。
32
+ * 1 / D だと対角成分以外の除算を行った場合に0割が発生するので、`np.linalg.inv(D)` で逆行列を計算するか、`D_inv = np.reciprocal(D, out=np.zeros(D.shape, float), where=D != 0)` で0でない要素だけ逆数をとります。
33
33
  * pow(10,-6) は、指数表記 10e-6 でも表せます
34
34
 
35
35
  ```python

4

d

2020/12/07 04:46

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -16,4 +16,30 @@
16
16
  ```diff
17
17
  - i += i
18
18
  + i += 1
19
+ ```
20
+
21
+ ```diff
22
+ - xn1=(b-np.dot(R,x))/D
23
+ + x=(b-np.dot(R,x))/D
24
+ ```
25
+
26
+ ## 追記
27
+
28
+ * 行列ベクトル積、行列積は numpy.dot() を使うほかに `@` 演算子でも計算可能です。
29
+ np.dot(A, x) → A @ x
30
+ np.dot(A, B) → A @ B
31
+ `@` 演算子を使ったほうがプログラムの見通しがよくなるかと思います。
32
+ * 1 / D だと対角成分以外の除算を行った場合に0割が発生するので、`np.linalg.inv(D)` で逆行列を計算しておきます。
33
+ * pow(10,-6) は、指数表記 10e-6 でも表せます
34
+
35
+ ```python
36
+ R = A - D # 対角成分以外
37
+ D_inv = np.linalg.inv(D)
38
+
39
+ x = np.zeros_like(b) # 初期値
40
+ for i in range(100):
41
+ x = D_inv @ (b - R @ x)
42
+
43
+ if np.linalg.norm(A @ x - b) <= 10e-6:
44
+ break
19
45
  ```

3

d

2020/12/07 04:41

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -9,4 +9,11 @@
9
9
  ```diff
10
10
  - xn1=(b-np.dot(R,x))/D
11
11
  + xn1 = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
12
+ ```
13
+
14
+ あと以下もおかしいですね
15
+
16
+ ```diff
17
+ - i += i
18
+ + i += 1
12
19
  ```

2

d

2020/12/07 04:21

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  以下をDの逆行列の行列積に変更してください
8
8
 
9
- ```
9
+ ```diff
10
10
  - xn1=(b-np.dot(R,x))/D
11
11
  + xn1 = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
12
12
  ```

1

d

2020/12/07 04:19

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,3 +1,12 @@
1
1
  D に値が0の要素があるため、`xn1=(b-np.dot(R,x))/D` で0除算が発生して、エラーになっています。
2
2
 
3
- `print("D=",D)` の結果を見るとわかりますが、`D` の対角成分以外は0になっていますね。
3
+ `print("D=",D)` の結果を見るとわかりますが、`D` の対角成分以外は0になっていますね。
4
+
5
+ 修正方法
6
+
7
+ 以下をDの逆行列の行列積に変更してください
8
+
9
+ ```
10
+ - xn1=(b-np.dot(R,x))/D
11
+ + xn1 = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
12
+ ```