01 条件分岐
条件分岐 (conditional branching)は,シミュレーション中に条件に応じて振る舞いを変えたい場合によく用いられる.
if 文¶
if 条件: に続けてインデントされたブロックは,条件が真のときだけ実行される.
# 01-01. if文
for i in range(30):
if i > 15:
print(i)16
17
18
19
20
21
22
23
24
25
26
27
28
29
i > 15 が成り立つのは のときで,そのときだけ print(i) が実行される.
関係演算子(比較演算子)と論理演算子¶
条件式は関係演算子 (relational operator)と論理演算子 (logical operator)を組み合わせて作ることが多い.
| 関係演算子 | 意味 |
|---|---|
== | 等しい |
!= | 等しくない |
<, <= | より小さい,以下 |
>, >= | より大きい,以上 |
| 論理演算子 | 意味 |
|---|---|
and | 両方が真 |
or | どちらかが真 |
not | 否定 |
# 01-02. 関係演算子と論理演算子
for i in range(10):
print("i=", i)
if i > 5:
print(" iは5より大きい")
if i == 3:
print(" iは3と等しい")
if i >= 3 and i <= 6:
print(" iは3以上6以下")
if not (i == 1 or i == 2):
print(" iは1または2ではない")i= 0
iは1または2ではない
i= 1
i= 2
i= 3
iは3と等しい
iは3以上6以下
iは1または2ではない
i= 4
iは3以上6以下
iは1または2ではない
i= 5
iは3以上6以下
iは1または2ではない
i= 6
iは5より大きい
iは3以上6以下
iは1または2ではない
i= 7
iは5より大きい
iは1または2ではない
i= 8
iは5より大きい
iは1または2ではない
i= 9
iは5より大きい
iは1または2ではない
else と elif¶
条件が偽のときの処理は else: で,2つ以上の場合分けは elif:(else if)を用いる.
# 01-03. 偶奇判定
for i in range(50):
if i % 2 == 0:
print("even")
else:
print("odd")even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
even
odd
# 01-04. 3の倍数
for i in range(50):
if i % 3 == 0:
print("3の倍数")
elif i % 3 == 1:
print("余り1")
else:
print("")3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
3の倍数
余り1
応用:分岐図の改善¶
前回 は離散ロジスティック成長モデルの分岐図を各 で最終数世代の値だけ別ループで記録し,プロットすることで描いた.
ここでは条件分岐を使って,最終数世代の値だけを記録する. これによりメインロジック(離散ロジスティック成長モデルに基づく個体数更新)を2回書くことを避ける.
# 01-05. 分岐図 ifバージョン
import matplotlib.pyplot as pltK = 100
r_list = []
x_list = []
for i in range(150, 300):
x0 = 10
r = i / 100
x = x0
for t in range(5000):
x = x + r * (1 - x / K) * x
if t >= 4000:
r_list.append(r)
x_list.append(x)内側ループでは5000世代計算し,最後の1000世代()だけを r_list,x_list に追加している.
plt.figure(dpi=200)
plt.plot(r_list, x_list, ".", markersize="1")
plt.title("Bifurcation diagram (transient removed)")
plt.xlabel("r")
plt.ylabel("x")
演習¶
Solution to Exercise 1
K = 100
r_list = []
x_list = []
for i in range(2800, 3001):
x0 = 10
r = i / 1000
x = x0
for t in range(5000):
x = x + r * (1 - x / K) * x
if t >= 4000:
r_list.append(r)
x_list.append(x)
plt.figure(dpi=200)
plt.plot(r_list, x_list, ".", markersize="1")
plt.title("Bifurcation diagram (zoomed)")
plt.xlabel("r")
plt.ylabel("x")