回答編集履歴

6

d

2020/12/07 06:09

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  - xn1=(b-np.dot(R,x))/D
20
20
 
21
- + xn1 = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
21
+ + x = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
22
22
 
23
23
  ```
24
24
 
@@ -38,16 +38,6 @@
38
38
 
39
39
 
40
40
 
41
- ```diff
42
-
43
- - xn1=(b-np.dot(R,x))/D
44
-
45
- + x=(b-np.dot(R,x))/D
46
-
47
- ```
48
-
49
-
50
-
51
41
  ## 追記
52
42
 
53
43
 
@@ -62,7 +52,7 @@
62
52
 
63
53
  * 1 / D だと対角成分以外の除算を行った場合に0割が発生するので、`np.linalg.inv(D)` で逆行列を計算するか、`D_inv = np.reciprocal(D, out=np.zeros(D.shape, float), where=D != 0)` で0でない要素だけ逆数をとります。
64
54
 
65
- * pow(10,-6) は、指数表記 10e-6 でも表せます
55
+ * pow(10,-6) は、指数表記 1e-6 でも表せます
66
56
 
67
57
 
68
58
 
@@ -82,7 +72,7 @@
82
72
 
83
73
 
84
74
 
85
- if np.linalg.norm(A @ x - b) <= 10e-6:
75
+ if np.linalg.norm(A @ x - b) <= 1e-6:
86
76
 
87
77
  break
88
78
 

5

d

2020/12/07 06:09

投稿

tiitoi
tiitoi

スコア21956

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

4

d

2020/12/07 04:46

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -35,3 +35,55 @@
35
35
  + i += 1
36
36
 
37
37
  ```
38
+
39
+
40
+
41
+ ```diff
42
+
43
+ - xn1=(b-np.dot(R,x))/D
44
+
45
+ + x=(b-np.dot(R,x))/D
46
+
47
+ ```
48
+
49
+
50
+
51
+ ## 追記
52
+
53
+
54
+
55
+ * 行列ベクトル積、行列積は numpy.dot() を使うほかに `@` 演算子でも計算可能です。
56
+
57
+ np.dot(A, x) → A @ x
58
+
59
+ np.dot(A, B) → A @ B
60
+
61
+ `@` 演算子を使ったほうがプログラムの見通しがよくなるかと思います。
62
+
63
+ * 1 / D だと対角成分以外の除算を行った場合に0割が発生するので、`np.linalg.inv(D)` で逆行列を計算しておきます。
64
+
65
+ * pow(10,-6) は、指数表記 10e-6 でも表せます
66
+
67
+
68
+
69
+ ```python
70
+
71
+ R = A - D # 対角成分以外
72
+
73
+ D_inv = np.linalg.inv(D)
74
+
75
+
76
+
77
+ x = np.zeros_like(b) # 初期値
78
+
79
+ for i in range(100):
80
+
81
+ x = D_inv @ (b - R @ x)
82
+
83
+
84
+
85
+ if np.linalg.norm(A @ x - b) <= 10e-6:
86
+
87
+ break
88
+
89
+ ```

3

d

2020/12/07 04:41

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -21,3 +21,17 @@
21
21
  + xn1 = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
22
22
 
23
23
  ```
24
+
25
+
26
+
27
+ あと以下もおかしいですね
28
+
29
+
30
+
31
+ ```diff
32
+
33
+ - i += i
34
+
35
+ + i += 1
36
+
37
+ ```

2

d

2020/12/07 04:21

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- ```
17
+ ```diff
18
18
 
19
19
  - xn1=(b-np.dot(R,x))/D
20
20
 

1

d

2020/12/07 04:19

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -3,3 +3,21 @@
3
3
 
4
4
 
5
5
  `print("D=",D)` の結果を見るとわかりますが、`D` の対角成分以外は0になっていますね。
6
+
7
+
8
+
9
+ 修正方法
10
+
11
+
12
+
13
+ 以下をDの逆行列の行列積に変更してください
14
+
15
+
16
+
17
+ ```
18
+
19
+ - xn1=(b-np.dot(R,x))/D
20
+
21
+ + xn1 = np.dot(np.linalg.inv(D), (b - np.dot(R, x)))
22
+
23
+ ```