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 条件: に続けてインデントされたブロックは,条件が真のときだけ実行される.

# 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) が実行される.

関係演算子(比較演算子)と論理演算子

条件式は関係演算子 (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ではない

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 で最終数世代の値だけ別ループで記録し,プロットすることで描いた.

ここでは条件分岐を使って,最終数世代の値だけを記録する. これによりメインロジック(離散ロジスティック成長モデルに基づく個体数更新)を2回書くことを避ける.

# 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):
        x = x + r * (1 - x / K) * x
        if t >= 4000:
            r_list.append(r)
            x_list.append(x)

内側ループでは5000世代計算し,最後の1000世代(t4000t \ge 4000)だけを r_listx_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")
<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>