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

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

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

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

Q&A

解決済

1回答

1985閲覧

python:for構文でiとjをループさせる。

kunikuni96

総合スコア16

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

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

0グッド

0クリップ

投稿2019/07/30 05:48

編集2019/07/30 10:04

前提・実現したいこと

以下のようにソースコードで
h[10]でifの条件を満たす、数列aのi番目の要素を求めました。
今度は数列h[10]だけでなく、すべてのhでifの条件を満たす数列aのi番目の要素を求めたいです。
そこで、2つ目のソースコードのようにh[j]としてfor構文の中でhがj番目の時に条件を満たすaのi番目の要素を求める方法を考えました。

該当のソースコード

python

1a = {'0': 0.5} 2m = a['0'], 3h=np.arange(0,1,0.01) 4for i in range(1, 100): 5 a[str(i)] = np.tanh(a[str(i - 1)]+h[10]) 6 if a[str(i)]/a[str(i-1)]<1.001 7: 8 break 9print(a[str(i)])

次の条件を求めるソースコード

python

1a = {'0': 0.5} 2m = a['0'], 3h=np.arange(0,1,0.01) 4for j in range(0,99): 5 for i in range(1, 100): 6 a[str(i)] = np.tanh(a[str(i - 1)]+h[j]) 7 if a[str(i)]/a[str(i-1)]<1.001: 8 break 9print(a[str(i)])

知りたいこと

hがj番目の時にifの条件を満たす数列m_jを求めたいです。

m_j→hがj番目の時のa[str(i)]の値

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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 06:36

編集2019/07/30 10:28
tiitoi

総合スコア21956

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

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

kunikuni96

2019/07/30 09:49

ご指摘のように、増加関数なので2項の比をとったとき、分母が必ず小さくなり1を超えるためこの判定条件は間違っていることに気が付きました。そこで、判定条件をa_n/a_(n-1)>1.001と変更しました。
kunikuni96

2019/07/30 10:03

何度もすみません。不等号の向きが逆でした。
tiitoi

2019/07/30 10:28

追記しました。各 h の値で第 i 項 / 第 i - 1 項 < 1.001 を満たす最初の項を求めたい場合は上記のように探せます。
kunikuni96

2019/07/30 11:27

ありがとうございました。解答をじっくり読んで自分でも理解できるように努力します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問