01 条件分岐
条件によって処理を分ける条件分岐(conditional branching)は,シミュレーション中に「過渡を除く」「絶滅した個体群を除外する」など,動態の見え方を整えるために多用される.本章では if 文の基本を確認したうえで,前章 で描いた素朴な分岐図に条件分岐を組み込み,周期解やカオスの構造を見やすくする.
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) が実行される.
比較演算子と論理演算子¶
条件式は比較演算子と論理演算子を組み合わせて作る.
| 比較演算子 | 意味 |
|---|---|
== | 等しい |
!= | 等しくない |
<, <= | より小さい,以下 |
>, >= | より大きい,以上 |
| 論理演算子 | 意味 |
|---|---|
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
応用:分岐図のリファイン¶
前章 で離散ロジスティック成長モデルの素朴な分岐図(各 で最終世代の値だけプロット)を描いた.周期解の領域では複数の値を取るため,1点プロットでは構造が潰れて見えていた.
ここでは条件分岐を使って 過渡(transient)を除いた複数点を集める ことで,分岐図を完成させる.具体的には,各 について十分長く回したうえで,後半の世代だけを記録する.
# 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):
xx = x + r * (1 - x / K) * x
x = xx
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")