(農業)情報工学・課題 (2019/10/24)

水稲の生育予測プログラムの作成(2)(JSVersion)

改良型生育モデル
今回は、水稲の生育を予想するプログラムに改良を加える。基本とする考え方は、先週の【積算気温モデル】をベースにしている。
今回の課題では、品質と収量に関するモデルを組み込んでみる。また、日本の様々な地方(寒冷地や暖地)での栽培も模式化してみたい。 ただ、複雑なモデルを複数組み合わせて同時に動作させた場合、結果の評価が難しくなるため、それぞれのモデル自体は単純化している。そのため、現実の挙動とは異なる場合も含まれると思うが、あくまでモデル構築実験と割り切って理解して欲しい。

今回の課題で取り扱うのは、先週と同じく「単純積算気温モデル」とする。
代表的な品種である「コシヒカリ」を考え、田植えからの積算気温が1700度で出穂し、その後1000度で登熟が完了して、収穫日となるという前提は、先週と同一である。
今回は、さらに、収量(yield)に影響を与える因子(yieldFactor)と、価格(price)又は品質に影響を与える因子(priceFactor)をモデル化する。当初の因子は、どちらも初期値を1.0とし、影響があれば、少しずつ(0.001 から 0.1)程度、値を変化させる。
具体例で示す。(モデル化する場合には、自分で重要と思った物を組み込む。複数の因子をモデル化する事が好ましいが、ここに例示したすべての因子をモデル化しなくても無い。)
  1. 幼苗期に低温に晒されたため発生する生育障害 : 田植え後20日以内に例えば平均気温が15度以下(又は最低気温が10度以下)になった場合、1日につき(あるいは1度につき)yieldFactorを、0.01減らす。
  2. 登熟期の低温で発生する「イモチ」病 : 出穂後、平均気温が25度を下回った場合、yieldFactorを0.01減らす。【サンプルでは、予めこのモデルが組み込んである。なお平均気温25度でイモチが発生する可能性は殆ど無いが(実際には20度など)、プログラムの動作チェックのためにこの温度にしている。】
  3. 夏場の高温に晒された事による食味の低下 : 平均気温が28度を超えた場合、priceFactorを0.01減らす。
  4. 収穫日の当日雨が降った事による、胴割れ米の発生 : 収穫予定日の降水量が3mmを超えた場合、priceFactorを0.05減らす。収穫可能日まで、それを続ける。この場合、収穫可能日は、一日ずつ変化することになる。
  5. その他にも、コメの生育に関する各種の知見がある。興味のある人は、いろいろと、モデル化してみよう。
また、今回は気象データを複数用意した。自分のモデルが、どの地方で、高い売り上げとなるかを考えてみたい。気温データとしては札幌、十日町(新潟)、東京、滋賀(彦根)、宮崎。年としては、1993,1994,1995,1997,2003,2015,2016年のデータが用意してある。
なお2016年のみ閏年なので2月29日のデータが存在している。そのため、2016年のデータを利用するときは、田植え日を一日ずらす、結果の解釈の日付は一日ずらす。などの必要がある。
これ以外の地域のデータを作成することも可能なので、余裕と興味のある人は、いろいろな地方のデータを用いて、自分のモデルがどのような挙動を示すかを、調べて欲しい。但し、データに欠測値(空白や他の記号など)があると、今回のプログラムではエラーとなる。アメダスの生データは、そういった欠測値がかなり紛れ込んでいる。自分でデータを取得する際には、注意しよう。なお実用的なプログラムの場合、欠測値の取り扱いは、内挿、あるいは、平年値での代替などの方法がある。(内挿の方が簡単であり、また、欠測値が少ない場合には推定精度も高い)。(気象学上の平年値は近年の30年間の平均値としている。但し平年値の見直しは10年に一度なので、現在用いられている平年値は1981年ー2010年の平均である。)
プログラムの動作
今回の課題プログラムは、次のような動作を行う。
  1. HTMLとしての設定
  2. ファイル読込ボタン、実行ボタンなどの配置
  3. 初期設定・地域・品種データ・定植日の指定
  4. 気温データの読み込み(ファイル入力)
  5. 積算気温の算出、各種ファクターの計算
  6. シミュレーション結果の出力と読込イベントを待つ
  7. ファイル内容の表示関数
  8. 終了
課題プログラムは、前回同様、5. 積算気温の算出、各種ファクターの計算部分が未完成である。
つまり、本プログラムの中心部分が、完成していないのである。
この最も重要な部分を、各自、自分でプログラミングし、実行して提出することが今回の課題である。

【参考】今回のプログラムの最終的な出力は1haあたりの売上(10a当たり収穫量*10 x 60kgの価格/60)として産出している。日本の農家の平均耕作面積は2.98ha。つまり農家の売上は、ここで得られる数値の約3倍である。なお、価格と収量は2018年時点での標準的な数値である。
【反当収量】:1反(=10a)当たりの玄米の収穫量。現在では1反で10俵(600kg)取ることが目標である。なお農地を貸し出す場合の貸借料は1反で1俵が相場である。
【一合、一升、一斗、(一俵)、一石】: 1合は180ccであるが、玄米では約150gになる。1升は10合、1斗は10升(斗酒なお辞せず)、10斗で1石である。なお1俵は4斗である。ここで1石とはどのくらいの玄米量であるか。1人が1食に食べる食事の量は1合弱が基本である。となると1年では1x3x365で1000合程度(1石)を食べることになる。(但し現在の茶碗では1合は茶碗2杯分程度に相当する。)ごはんとして食べるときは、水の量を白米の容積の1.2-1.4倍追加している。今、1.2倍とすると1合のご飯は(コメ150g+水180g)=330g程度になる。ちなみにココイチのカレーでの標準盛りのグラム数は300gである。(^・^)


プログラム中の、主要な変数名とその意味は、以下の通りである。
Variables in Calc02.html
変数名説 明備 考
variety品種名プログラム冒頭で定義(コシヒカリ)
taueDate田植え日(日付連番)プログラム冒頭で定義(109)
targetEarTempSum出穂に必要な積算温度プログラム冒頭で定義(1700)
targetToujukuTempSum登熟に必要な出穂後の積算温度プログラム冒頭で定義(1000)
currentEarTempSum出穂までの積算気温の作業用
targetEarTempSumと比較
計算中に利用
CurrentToujukuTempSum登熟に必要な積算気温の作業用
targetToujukuTempSumと比較
計算中に利用
yieldOfRice平均的な収量(kg/10a)プログラム冒頭で定義(530kg)
priceOfRice平均的な価格(円:60kgあたり)プログラム冒頭で定義(13000円)
meteo[date][1]date日目(日付連番)の最低気温
366日型で提供
気温ファイルから読込
meteo[date][2]date日目(日付連番)の最高気温
366日型で提供
気温ファイルから読込
meteo[date][3]date日目(日付連番)の平均気温
366日型で提供
気温ファイルから読込
meteo[date][4]date日目(日付連番)の降水量
366日型で提供
気温ファイルから読込
c[i]各月の日数
応用課題用
プログラム中で定義済み
shussuiDate出穂日(日付連番)計算して算出する
toujukuDate登熟日(日付連番)計算して算出する
shukakuDate収穫日(日付連番)計算して算出する
yieldFactor収量に影響を与えるファクター(因子)計算して算出する
priceFactor価格(品質)に影響を与えるファクター(因子)計算して算出する
annualSales1ha当たりの売り上げ金額(所得では無い)計算して算出する

<課題ファイルへのリンク>
課題データをまとめてダウンロードする!Rice02.zip
デスクトップにダウンロードすれば、解凍時にRice02フォルダが作成され、その中に以下の関連ファイルが保存される
これらの中で、1993年(平成5年)は日本が記録的な冷害を体験した年である。この年にはコメの生産量が約30%減となり、海外からコメを緊急輸入する事態となった。また、1994年は一転して猛暑の年であった。また、2016年はこれまでの観測で最も平均気温が高い年となった。
(参考:日本の平均気温の平年値との偏差は、1993(-0.52),1994(+0.56),1995(-0.19),1997(+0.10),2003(-0.06),2015(+0.69),2016(+0.88)となっている。気象庁ー日本の年平均気温偏差

なお、他の地点の気象データを手に入れたい場合には、次のウェブサイトから入手することが出来る。

課題の提出にあたって
プログラムはJavaScriptで作成する。
今回の課題の提出は、
  1. 作成したプログラム(Calc02.html)。必要に応じて注釈(コメント)を付けること。
  2. 実行結果(最低でも2つ以上の気象データで実行する)。テキストファイルまたはワードファイル
    実行結果には、自分の組み込んだモデルの説明と、結果の解釈を記述すること。
    【重要】自分の組み込んだモデルが、動作している事を確認する。
の2点を送信することである。
健闘を祈る。
実行結果の表示方法
実行結果は、ブラウザ上に書き出されている。従って、ブラウザに表示されているテキストを「選択」して、エディターなどで「貼り付け」て、保存すれば良い(コピペ)。ワードで作成する事も可能である。
プログラム中には、自分の思い通りに動作したことを示すメッセージがある事が好ましい。現在のモデルでは、outFrame.innerHTMLに文字列を追加することによって、プログラムの動作確認を行なっている。
なお、このinnerHTMLに書き込まずに、console.logとして表示する方法もある。
JavaScriptでの文字列
JavaScriptの文字列は、文字列リテラルと呼ばれる、ダブルクオート"、シングルクオート'、バッククオート`、で囲って利用する。バッククオートはテンプレートリテラルという構文が使える。
moji = "ABC";
moji = 'ABC';
moji = `ABC`;
どの文字列リテラルでも共通であるが文字列リテラルは同じ記号が対になる。対になっていない文字列リテラルを、文字列の中に入れることが出来る。
moji = "I'm OK!";
moji = 'This is "ABC."';
また、文字列の中にリテラルと同じ記号が出現した場合は、\(バックスラッシュ)を使いエスケープする必要がある。
moji = 'I\'m OK!';
文字列の連結は、+で行う。
moji = 'this is ' + 'a pen.';
文字列に変数の値を直接連結することも出来る。
date = 109;
moji = 'Today = ' + date;
バッククオートで囲った場合には、${ }演算子を用いて、変数を直接書き込むことが出来る。
moji = `Today = ${date}`
HTMLの基礎
JavaScriptは、基本的にブラウザ上で読み込まれるHTML文書に埋め込まれている。したがって、基本的なHTMLの知識が必要である。HTMLとは、Hyper Text Mark-up Languageの省略形で、「エイチ・ティー・エム・エル」と呼ぶ。
通常の文章に、タグ< >即ちかぎ括弧をつけて、表現力を豊かにした文章である。通常のテキスト(文章)を超越した(ハイパー)なテキストを作成するということから、「ハイパーテキスト」と呼ばれている。
HTMLとブラウザの関係は、はいぱあワークブックでの記述(Webサイトを作る技術)を参考にしてもらいたい。なお、Calc01.htmlとCalc02.htmlでは、CSSは用いていない。
HTMLの特徴としては、他の文章や画像などを、自由に文章の中に埋め込むことができる。(例:ここをクリックすると、ヤフーのトップページが表示される。)
この仕組みを「ハイパーリンク」と呼ぶが、HTMLはそのハイパーリンクなども自由に書き込むことのできる言語のことである。
HTMLTESTのページでは、タグの機能を学ぶことが出来るので、実際にいくつか試してみよう。ただし、この記述方式は、やや古いHTML形式のため、CSSを活用していないので注意してもらいたい。