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

質問編集履歴

3

コード記載

2020/08/03 04:43

投稿

wandora
wandora

スコア0

title CHANGED
File without changes
body CHANGED
@@ -78,9 +78,9 @@
78
78
  U, A, Uh = svd(gram_H)
79
79
 
80
80
  SNR = 0
81
+ Ps = 1.0
81
82
  sigma = math.sqrt( Ps / (2 * math.pow(10.0, SNR/10)))
82
83
 
83
- Ps = 1.0
84
84
  Pn = 2*sigma*sigma
85
85
  r0 = Ps/Pn
86
86
  ```

2

コード記載

2020/08/03 04:43

投稿

wandora
wandora

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,21 +1,28 @@
1
1
  ### ある条件を満たすリストと定数を求めたい
2
2
 
3
- a = [a1, a2, a3]
3
+ s = [s1, s2, s3]
4
- b = [b1, b2, b3]
4
+ t = [t1, t2, t3]
5
5
 
6
6
  が与えられた時、 以下の条件を満たす p = [p1, p2, p3] と h を求めたいです。
7
7
 
8
8
  (条件)
9
- ・ pk = max{ bk(ak - h), 0 } k = 1,2,3
9
+ ・ pk = max{ tk(sk - h), 0 } k = 1,2,3
10
10
  ・ h は p1 + p2 + p3 = 1 を満たす為の定数
11
11
 
12
+ この条件下で出来るだけ p を 0 にしないようなコードを書きたいと考えております。
13
+ (0 を許可するコードなら既に書けております)
12
14
 
13
15
  どういったコードが考えられますでしょうか。
14
16
  考え方でもご教授頂けると幸いです。
15
17
  よろしくお願い申し上げます。
16
18
 
17
19
 
20
+ 返信が遅れまして大変申し訳ございません。
21
+ またご回答くださり誠に有難うございます。
22
+ 以下、コードです。
18
23
 
24
+
25
+ ```python
19
26
  def calculate_send_power(bits, A, r0, a, b):
20
27
  num_stream = len(bits)
21
28
  over = 0
@@ -44,4 +51,66 @@
44
51
  if len(p) != num_stream:
45
52
  p = calculate_send_power(bits[:-1], A, r0, a, b)
46
53
 
47
- return p
54
+ return p
55
+
56
+ if __name__ == '__main__':
57
+ for bits in bit_pattern:
58
+ num_stream = len(bits)
59
+ p = calculate_send_power(bits, A, r0, a, b)
60
+
61
+ if len(p) != num_stream:
62
+ for i in range(num_stream - len(p)):
63
+ p.append(0)
64
+ ```
65
+
66
+ かなり分かりにくいかと思いますが、 calculate_send_power() における over が s を表し、under が t を表し、 xi が h を表しているとお考えください。
67
+
68
+ 以下にそれぞれの変数を述べておきます。
69
+ ```ここに言語を入力
70
+
71
+ a = [0,0,1/2,0,3/8,0,7/24,0,15/64]
72
+ b = [0,0,2,0,10,0,42,0,170]
73
+
74
+ bit_pattern = [[8], [6, 2], [4, 4], [4, 2, 2], [2, 2, 2, 2]]
75
+
76
+ H = (4,4)の複素行列 実部、虚部ともに正規分布に従う乱数
77
+ gram_H = np.conjugate(H.T) @ H
78
+ U, A, Uh = svd(gram_H)
79
+
80
+ SNR = 0
81
+ sigma = math.sqrt( Ps / (2 * math.pow(10.0, SNR/10)))
82
+
83
+ Ps = 1.0
84
+ Pn = 2*sigma*sigma
85
+ r0 = Ps/Pn
86
+ ```
87
+
88
+ このコードは bit_pattern = [[8], [6, 2], [4, 4], [4, 2, 2], [2, 2, 2, 2]] のそれぞれに割り当てる電力(電力総和 = 1)を決定するもので以下のようになります。
89
+
90
+
91
+ |bits|p(ower)|sum|
92
+ |:--|:--:|--:|
93
+ |[8]|[1.000]|1.0|
94
+ |[6, 2]|[0.453, 0.546]|1.0|
95
+
96
+ 以下に実行結果を述べます。
97
+ ```ここに言語を入力
98
+ for bits in bit_pattern:
99
+ num_stream = len(bits)
100
+ tmp = 0
101
+ p = calculate_send_power(bits, A, r0, a, b)
102
+ if len(p) != num_stream:
103
+ for i in range(num_stream - len(p)):
104
+ p.append(0)
105
+
106
+ print("bits = {} , power = {}, sum = {}".format(bits, p, sum(p)))
107
+
108
+ >>>
109
+ bits = [8] , power = [1.00], sum = 1.0
110
+ bits = [6, 2] , power = [0.39036578941718647, 0.6096342105828132], sum = 1.0
111
+ bits = [4, 4] , power = [0.6905457297074978, 0.30945427029250216], sum = 1.0
112
+ bits = [4, 2, 2] , power = [0.4747411414947003, 0.35540013052184316, 0.1698587279834565], sum = 1.0
113
+ bits = [2, 2, 2, 2] , power = [0.3157712110211322, 0.40062777763337526, 0.2836010113454926, 0], sum = 1.0
114
+ ```
115
+
116
+ と出来ているのですが、 bits = [2, 2, 2, 2] の4項目に割り当てる電力が 0 になってしまいます。この条件下で出来るだけ p を 0 にしないようなコードを書きたいと考えており、考え方でもご教授頂けると幸いです。よろしくお願い申し上げます。

1

a

2020/08/03 04:30

投稿

wandora
wandora

スコア0

title CHANGED
File without changes
body CHANGED
@@ -12,4 +12,36 @@
12
12
 
13
13
  どういったコードが考えられますでしょうか。
14
14
  考え方でもご教授頂けると幸いです。
15
- よろしくお願い申し上げます。
15
+ よろしくお願い申し上げます。
16
+
17
+
18
+
19
+ def calculate_send_power(bits, A, r0, a, b):
20
+ num_stream = len(bits)
21
+ over = 0
22
+ under = 0
23
+ for k in range(num_stream):
24
+ rk = A[k] * r0
25
+ ak = a[bits[k]]
26
+ bk = b[bits[k]]
27
+ mk = bits[k]
28
+
29
+ over += bk/rk * math.log(ak * mk * rk / bk)
30
+ under += bk/rk
31
+
32
+ xi = (over - 1) / under
33
+ p = []
34
+
35
+ for k in range(num_stream):
36
+ rk = A[k] * r0
37
+ ak = a[bits[k]]
38
+ bk = b[bits[k]]
39
+ mk = bits[k]
40
+
41
+ if bk/rk * (math.log(ak * mk * rk / bk) - xi) > 0:
42
+ p.append(bk/rk * (math.log(ak * mk * rk / bk) - xi))
43
+
44
+ if len(p) != num_stream:
45
+ p = calculate_send_power(bits[:-1], A, r0, a, b)
46
+
47
+ return p