np.arange(0, 1, 0.1)
、つまり、h \in [0, 1)
の範囲で、1つ前の数列の比 a_i / a_{i - 1}
が 0.9 未満になる項は存在しないので、そもそも条件を満たすものはありません。
各 h_j における漸化式 a_{ij} = tanh(a_{i - 1, j} + h_j) で表される数列は numpy を使えば一度に計算できるので、h の値でループする必要はありません。
python
1import matplotlib.pyplot as plt
2import numpy as np
3
4n = 100 # 第何項まで求めるか
5h = np.arange(0, 1, 0.1)
6
7# 数列を格納する配列を用意する。
8A = np.empty((n + 1, len(h)))
9A[0] = 0.5 # 初項
10
11# 第 n 項までの数列を計算する。
12for i in range(1, n + 1):
13 A[i] = np.tanh(A[i - 1] + h)
14
15# 数列を描画する。
16fig, ax = plt.subplots(figsize=(10, 6))
17for i in range(len(h)):
18 ax.plot(np.arange(n + 1), A[:, i], "-o", label=f"h[{i}] = {h[i]:.2f}", ms=1)
19
20ax.set_xlim(0, 100)
21ax.legend(loc="right")
22plt.show()
23
24# 条件を満たすす値を抽出する。
25ratio = A[1:] / A[:-1] # 第 i 項 / 第 i - 1 項 を計算する。
26
27# を描画する。
28fig, ax = plt.subplots(figsize=(10, 6))
29for i in range(len(h)):
30 ax.plot(np.arange(n), ratio[:, i], "-o", label=f"h[{i}] = {h[i]:.2f}", ms=1)
31
32ax.set_xlim(0, 100)
33ax.set_ylim(0.8, 2.0)
34ax.axhline(y=0.9)
35ax.legend(loc="right")
36plt.show()
h の各値による数列
第 i 項 / 第 i - 1 項の比、青線がy=0.9
追記
ご指摘のように、増加関数なので2項の比をとったとき、分母が必ず小さくなり1を超えるためこの判定条件は間違っていることに気が付きました。そこで、判定条件をa_n/a_(n-1)<1.001と変更しました。
各 h の値で 第 i 項 / 第 i - 1 項 < 1.001 を満たす最初の項は以下のようにして求められます。
python
1import matplotlib.pyplot as plt
2import numpy as np
3
4n = 100 # 第何項まで求めるか
5hs = np.arange(0, 1, 0.1)
6
7# 数列を格納する2次元配列を用意する。
8# A[i, j] は a_{i, j} = tanh(a_{i - 1, j} + h_{j}) を表す。
9A = np.empty((n + 1, len(hs)))
10A[0] = 0.5 # 初項
11
12# 第 n 項までの数列を計算する。
13for i in range(1, n + 1):
14 A[i] = np.tanh(A[i - 1] + hs)
15
16# 条件を満たすす値を抽出する。
17thresh = 1.001
18conditions = A[1:] / A[:-1] < thresh # 第 i 項 / 第 i - 1 項 < 1.001 となるインデックス
19# print(conditions)
20# [[ True False False False False False False False False False]
21# [ True False False False False False False False False False]
22# [ True False False False False False False False False False]
23# [ True False False False False False False False False True]
24# [ True False False False False False True True True True]
25# [ True False False False True True True True True True]
26# [ True False False True True True True True True True]
27# [ True False False True True True True True True True]
28# [ True False True True True True True True True True]
29# [ True False True True True True True True True True]
30# [ True True True True True True True True True True]
31# [ True True True True True True True True True True]
32# ...
33
34# 最初に条件を満たすのは第何項かを求める。
35indices = np.argmax(conditions, axis=0) + 1
36
37for h, i in zip(hs, indices):
38 print(f"h = {h:.2f}, a[i] / a[i - 1] < {thresh} を満たす最初の項: {i}")
h = 0.00, a[i] / a[i - 1] < 1.001 を満たす最初の項: 1
h = 0.10, a[i] / a[i - 1] < 1.001 を満たす最初の項: 11
h = 0.20, a[i] / a[i - 1] < 1.001 を満たす最初の項: 9
h = 0.30, a[i] / a[i - 1] < 1.001 を満たす最初の項: 7
h = 0.40, a[i] / a[i - 1] < 1.001 を満たす最初の項: 6
h = 0.50, a[i] / a[i - 1] < 1.001 を満たす最初の項: 6
h = 0.60, a[i] / a[i - 1] < 1.001 を満たす最初の項: 5
h = 0.70, a[i] / a[i - 1] < 1.001 を満たす最初の項: 5
h = 0.80, a[i] / a[i - 1] < 1.001 を満たす最初の項: 5
h = 0.90, a[i] / a[i - 1] < 1.001 を満たす最初の項: 4
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/30 09:49
2019/07/30 10:03
2019/07/30 10:28
2019/07/30 11:27