地球の気候変動と非線形性

世界的な規模で地球の気候変動が問題になっている。人間活動がこの変動に深く関わっているからだ。

地球の気候の変動は様々な要因で起こる。地球に対する太陽の影響の変化、地球内部の活動の変化と言った自然要因もある。勿論人間活動もその一つである。気候変動の特徴は非線形性にあると思う。

非線形性が強い現象にカオスがある。これを初めて見つけた気象学者のローレンツはこの現象を「バタフライ効果」と呼んだ。何処かで蝶がする一振りの羽ばたきが何処かで竜巻を起こす原因になる。

身近な例でカオスを説明しようとすると「パイこね」がある。パイの生地を捏ねるには生地を伸ばして重ねるという作業を繰り返す。このパイの生地に二つの砂糖の粒を隣接して置いておく。このパイ捏ねの作業を続けていると隣接した砂糖粒は見る間に離れて行き過去に隣接していたとは思えないような振る舞いする。これがカオスである。

この砂糖粒の一つが自然要因だけの地球の気候で、隣接する砂糖粒が人間活動を伴なった地球の気候と考えてみよう。僅かにことなるだけである。しかし時間が経つと二つは似てもつかない振る舞いをする。これが地球の気候だ。

「これくらいは僅かなので大丈夫」という考えは将来もその差が僅かであると予断している。これを「線形思考」という。しかし地球の気候変動が強い非線形性を持っているとしたら、「線形思考」ではなく、「非線形思考」が必要になる。

バナナは人類が最古に改良した種無し果実

「栽培植物と農耕の起源」(中尾佐助著)によれば、今、日常に食しているバナナは人類が種ありの野生バナナを改良して種無しバナナにしたものだ。その改良が行われたのは今から5000年も前のことだ。

野生のバナナは学名をムサ・アクミタータ(Musa acuminata)と言う。大きな果実だが中にはアズキ粒ぐらいの種がぎっしりと入っている。

「栽培植物と農耕の起源」(中尾佐助著)にはこれを種無しにしたプロセスが詳しく述べられている。このプロセスは長い時間が必要だった。

 

大崎・宮城県古川農業試験場:水稲開発挑み100年

今朝の地方紙の記事のタイトルである。

もみ殻が紫色をしたブータンの稲の写真が印象的な記事である。冷害に強い遺伝子を持った種子を保存する。またこの稲が冷害に耐えられる調べる「耐冷性検定圃場」での実験の写真もある。水温は18.5~19度と冷たい。

この試験場ではササニシキ、ひとめぼれ、だて正夢の宮城県産の稲品種の開発に関わってきた実績がある。

Pythonのタートル・グラフィックス(4):クローンkameなしの複雑再帰

先のkameの複雑な再帰描画をクローンを使わないで行うことを考える。まず問題の所在を明確にするためにプログラムにデバッグ用のprint文を追加した。プログラムの一部を載せる(再帰の深さは浅くしてある)。

def kame( position, size):
space = ' '*4*(int(200/size)-1)
print(space, 'draw kame',position.ycor(), size)
sugata( position, size)
if size > 75:
position.fd(size/2)
kame(position, size/2)
position.bk(size)
kame(position, size/2)
print(space, 'returning', position.ycor(), size)

この出力は以下のようになる:


 draw kame 0.0 200
     draw kame 100.0 100.0
             draw kame 150.0 50.0
             returning 150.0 50.0
             draw kame 50.0 50.0
             returning 50.0 50.0
     returning 50.0 100.0
     draw kame -150.0 100.0
             draw kame -100.0 50.0
             returning -100.0 50.0
             draw kame -200.0 50.0
             returning -200.0 50.0
     returning -200.0 100.0
 returning -200.0 200

draw kame 100に対応する(再帰のレベルが同じ)描画がdraw kame -150となっておりこれがずれの原因になる。

そこで関数kameに渡したオブジェクトpositionの属性がこのkame関数のなかで最終的に変化がなかったようにダミーの動きをいれる。プログラムは以下のようになる。


#coding: utf-8

import turtle

def sugata( center, size):
    for i in range(6):
        painter = center.clone()
        painter.fd(size)
        painter.rt(120)
        painter.fd(size)
        center.rt(60)

def kame( position, size):
    #space = ' '*4*(int(200/size)-1)
    #print(space, 'draw kame',position.ycor(), size)
    sugata( position, size)
    if size > 10:
        position.fd(size/2)
        kame(position, size/2)
        position.bk(size)
        kame(position, size/2)
        position.fd(size/2) #ダミーの動き
    #print(space, 'returning', position.ycor(), size)

    
if __name__ == '__main__':
    
    turtle.clearscreen()
    position = turtle.Turtle()
    position.ht()
    position.lt(90)
    kame( position, 200)

【結果の描画」

クローンkameなしの再帰描画の完成図

期待した通りの結果が得られた。

 

Pythonのタートル・グラフィックス(3):クローンkameによる複雑再帰

「Turbo Graphics」(安齋利洋・伊吹龍著;1987年)にはもう少し複雑なkameの再帰描画の例が載っている。プログラムをなぞってPythonで書くと以下のようになる:


#coding: utf-8

import turtle

def sugata( center, size):
    for i in range(6):
        painter = center.clone()
        painter.fd(size)
        painter.rt(120)
        painter.fd(size)
        center.rt(60)

def kame( position, size):
    sugata( position, size)
    if size > 10:
        position.fd(size/2)
        kame(position, size/2)
        position.bk(size)
        kame(position, size/2)

    
if __name__ == '__main__':
    
    turtle.clearscreen()
    position = turtle.Turtle()
    position.ht()
    position.lt(90)
    kame( position, 200)

描画は以下のようになる:

kameの再帰描画

ご覧のように再帰の描画がずれたものになっている。

このずれの原因として考えられるものはオブジェクトを関数に渡す仕様がTurboPascalとPythonとで異なることにあるように思われた。そこで

def kame( positionT, size):
position = positionT.clone()

として関数の中で実引数が影響を受けないようにした。結果の描画は以下のようになる:

kameの再帰描画

これで期待した通りになったが、描画のアルゴリズムを変えてクローンを使わないことにしたい。

Pythonのタートル・グラフィックス(2):kameの単純再帰描画

Pythonのタートル・グラフィックス(1)で採り上げたKameの単純な再帰プログラムを考える。プログラムは以下のようなものである:


#coding: utf-8

import turtle

def sugata( center, size):
    for i in range(6):
        painter = center.clone()
        painter.fd(size)
        painter.rt(120)
        painter.fd(size)
        center.rt(60)

def kame( position, size):
    sugata( position, size)
    if size > 10:
        kame(position, size/2)
    
if __name__ == '__main__':
    
    turtle.clearscreen()
    position = turtle.Turtle()
    position.ht()
    position.lt(90)
    kame( position, 200)

実行結果の描画

kame2の描画

期待した結果である。

稲の「穂刈」と「根刈」

稲の刈り入れの季節である。今では刈り入れは稲の根元から刈り取る「根刈」である。

「栽培植物と農耕の起源」(中尾佐助著)の中でこの「根刈」と対比して「穂刈」を紹介している。原始的な農業では「穂刈」が一般的である。それは穂の脱落性(触れると落ちる)と出穂期(いっせいに穂がでるかどうか)の性質が、脱落性があり、出穂期が揃っていないからである。脱落性がなくなり出穂期がいっせいになるような改良がされると収穫方法も「穂刈」から「根刈」に移行する。

日本でも米の収穫は奈良時代までは「穂刈」で、平安時代になると「根刈」に移行したと言われている。

 

ノルウェーが締約国会議へ:NATO加盟国で初

今日の新聞の記事のタイトルである。

ノルウェー政府は来年3月開催予定の核兵器禁止条約締約国会議にオブザーバー参加をすることを明らかにした。北大西洋条約機構(NATO)の加盟国が会議への参加を表明するのは初めての由。

同国内では政府が条約に署名するよう求める声が高まっている。2019年の調査では有権者の78%が政府は条約に署名すべきたと回答。

ノルウェーでは政権交代が実現。中道左派・労働党と中央党の少数連立政権が誕生。この政府による参加表明である。

Pythonのタートル・グラフィックス(1):kameによるカメの描画

LibreLogoに関するブログを書いていたらPythonのタートル・グラフィックスことが気になった。

書架を見たら「Turbo Graphics」(安齋利洋・伊吹龍著;1987年)という昔使った本が目についた。これはTurbo Pascalを使ったグラフィックスの本である。この中にタートル・グラフィックスの例題が沢山あるので今回はこれらをPythonのタートル・グラフィックスで書いてみた。なるべく忠実に例題をなぞるようにした。

例題1:kame


#coding: utf-8

import turtle

def sugata( center, size):
    for i in range(6):
        painter = center.clone()
        painter.fd(size)
        painter.rt(120)
        painter.fd(size)
        center.rt(60)

def kame( position, size):
    sugata( position, size)
    
if __name__ == '__main__':
    
    turtle.clearscreen()
    position = turtle.Turtle()
    position.ht()
    position.lt(90)
    kame( position, 200)

多少気になったのは以下の部分である:

painter = center.clone()

Pascalでは単なる代入文でpainter=centerとなっている。Pythonでは代入文によるオブジェクトの代入はできない。copyモジュールのcopyメソッドを使ってみたが描画の一部が消えてしまう。deepcopyではTkinterのエラーがでる。Pythonのタートル・グラフィックのドキュメントにあったclone()で期待した通りの描画が得られた。clone()とcopyメソッドの相違は不明。

【結果の描画】

kame

なお描画ではカメ印(?)は隠してある。

Pythonでマクロ:LibreLogoで日本語プログラミング(2)

もう一つ実例を考える。

【実例2】


TO sugata nagasa
  REPEAT 2 [
    FORWARD nagasa
    LEFT 120 ]
  HOME
END

TO kame nagasa
  kakudo = 0
  REPEAT 6 [
    sugata nagasa
    kakudo = kakudo + 60
    RIGHT kakudo  ]
END

PENCOLOR “black”
HOME
kame 200

日本語化すると:


やるべきこと sugata nagasa
  繰り返し 2 [
    前へ nagasa
    左へ120 ]
  定位置へ
記述終わり

やるべきこと kame nagasa
  kakudo = 0
  繰り返し 6 [
    sugata nagasa  ;やるべきことsugata実行
    kakudo = kakudo + 60
    右へ kakudo  ]
記述終わり

ペンの色 “black”
定位置へ
kame 200 ;やるべきことkame実行

HOMEは「定位置へ」とした。インデントを使うと少し見やすくなる。

【結果の描画】

カメの描画