Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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 が成り立つのは i=16,17,,29i = 16, 17, \dots, 29 のときで,そのときだけ 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ではない

elseelif

条件が偽のときの処理は 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

応用:分岐図のリファイン

前章 で離散ロジスティック成長モデルの素朴な分岐図(各 rr で最終世代の値だけプロット)を描いた.周期解の領域では複数の値を取るため,1点プロットでは構造が潰れて見えていた.

ここでは条件分岐を使って 過渡(transient)を除いた複数点を集める ことで,分岐図を完成させる.具体的には,各 rr について十分長く回したうえで,後半の世代だけを記録する.

# 01-05. 分岐図 ifバージョン
import matplotlib.pyplot as plt
K = 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世代(t4000t \ge 4000)だけを r_listx_list に追加している.これにより,周期 kk の解では kk 個,カオスでは多数の点が同じ rr に対して並ぶ.

plt.figure(dpi=200)
plt.plot(r_list, x_list, ".", markersize="1")
plt.title("Bifurcation diagram (transient removed)")
plt.xlabel("r")
plt.ylabel("x")
<Figure size 1280x960 with 1 Axes>

演習

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")
<Figure size 1280x960 with 1 Axes>