(農業)情報工学・課題 (2020/11/12)

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

パラメータの指定
今回の講義では(先週までの課題が完成しているものとして)イネの生育モデリングについての追加の学習は行わない。
その代わり、JavaScriptプログラミングについて、更に学習を深める。
具体的には、パラメータを、Web画面入力として、与える方法についてである。また、パラメータを少しずつ変化させて、感度解析を行う手法を紹介する。
Web画面入力
前回の課題では、各種のパラメータを、プログラム中に書き込んで与えた。この方法ではプログラムが完成していても、異なった田植え日での計算や、異なった積算気温の品種名を指定したりする場合には、プログラムを直接編集して実行しなければならず、かなり煩雑である。このためプログラムを実行する際に、パラメータを与える方法としてウェブブラウザ上で指定する方法を導入する。
具体的には、ブラウザで指定する際にボタンと入力フィールドを利用する。入力フィールドにはあらかじめ初期値(valueで指定)が設定されている(数値はプログラム中に埋め込んであるので、任意に変更可能である)。具体的な実行時の画面イメージは次のようになる。この図中に四角で囲ってある文字がその入力フィールドに対応する変数名である。

この画面を表示しているプログラム全体のイメージは次のようになっている。
プログラム全体のイメージ(1)

プログラム全体のイメージ(2)

実際のプログラム(Calc03.html)の構造を次に示す。()内は該当する行番号を示している。
  1. HTMLの宣言、ボタン類の配置(1-20)
  2. 実行ボタンの配置(25-30)
  3. JavaScript部分(31-)
  4. 変数の宣言、初期値の設定(31-56)
  5. 作業用変数の設定(57-65)
  6. 以下は関数(66-)
  7. 画面表示関数(67-71)
  8. デバッグ用表示関数(73-85)
  9. モデル情報の表示関数(87-98)
  10. シミュレーション結果の表示関数(100-113)
  11. 共通情報の表示関数(115-128)
  12. 変数の初期化関数(130-140)
  13. パラメータの数値読み取り関数(142-153)
  14. 実行ボタンクリック時の動作関数(155-173)
  15. ボタン2クリック時の動作関数(175-187)
  16. ファイルロード時に非同期実行される関数(189-237)
現在このプログラムは、気温データを指定して実行ボタンを押すと、実際にシミュレーションを行う様になっている。しかも、イモチ病の発生モデルも部分的に組み込んである。しかし、このままただ単に各種の気温データを読み込ませて、実行させるだけではプログラミングの技量の向上は望めないので、諸君には自分のモデルを組み込むという課題をこなして欲しい。
実際のプログラミングでは、次の数段階の作業が必要である。
  1. HTML部分でのボタンの追加配置(1)
  2. JavaScript部分で、変数の定義(2)
  3. HTMLのボタンに初期値を設定(3)
  4. ブラウザで追加モデルを表示(4)
  5. シミュレーション独自モデル情報の表示(5)
  6. 生育シミュレーション部分(田植えから出穂までの期間)でモデルの動作を記述(6)
  7. 生育シミュレーション部分(出穂から登熟までの期間)でモデルの動作を記述(7)
まず自分の組み込みたいモデルに関する変数名を決めるところから始めることになる。サンプルとして用意したプログラムのイモチのモデルの例でみる。ここでは変数は二つ用意した。 まず、(1)で、二つの変数を読み込むためのボタンの作成を行う。この段階はHTML文書の編集作業である。ボタンはinputタグで記述している。ここで、valueで指定しているのは初期値となる。 JavaScriptではinputタグ内に記述したidを使って、内容を読み込んでいる。idはユニークであれば任意に付けられるが、プログラムの読みやすさから考えると、JavaScriptで利用する変数名と同じにしておくことが好ましい。なおHTML内では、 <!-- と --> に挟まれた部分がコメントになる。

(2)で、JavaScript内の変数宣言部分になる。 (3)は、ボタン部分に初期値を表示するための記述である。
(4)では、読み取ったモデルの情報を、ブラウザに出力している。
(5)の部分は、OnSimulationButtonClick関数の内部の記述になる。即ち、ボタンクリックのイベント発生時の動作の記述である。ここでは、まず、(1)にある、該当するid名の入力フィールドのvalueを読み取る。必要に応じて整数として(parseInt)あるいは実数として(parseFloat)読み取って、JavaScriptの変数に代入する。 (6)の部分が、ようやく実際の数値計算になる。イネの生育は1年のループの中で計算されているが、田植え後なのか、出穂後なのか、を考慮して、必要な部分で生育モデルのプログラミングを行う。今回のイモチの例で見ると、イモチ計算は、出穂から収穫までの期間部分に置いている。また、imochiModelの数値によって、計算内容を変更している。
    if (imochiModel==1 && minToday < imochiTemp){ // イモチモデル=1
      yieldFactor -= 0.01;
      debugPrint('イモチ発生(1:最低気温)',today,yieldFactor,priceFactor,meteo);

    }else if(imochiModel==2 && maxToday < imochiTemp){ // イモチモデル=2
      yieldFactor -= 0.01;
      debugPrint('**イモチ発生(2:最高気温)',today,yieldFactor,priceFactor,meteo);

    }else if(imochiModel==3 && aveToday < imochiTemp){ // イモチモデル=3
      yieldFactor -= 0.01;
      debugPrint('**イモチ発生(3:平均気温)',today,yieldFactor,priceFactor,meteo);
    }
  

今回の課題
自分の独自のパラメータとは、前回の課題で行ったような稲の生育障害などのモデルをプログラムに組み込むことである。
例えば、次のような例が考えられる。
例えば、幼苗期の低温障害モデルを考えるとすれば、
  • lowTempModel : 低温障害モデルを使うかどうかの変数(0:使わない、1:最低気温、2:最高気温、3:平均気温)
  • lowTemp : 低温障害の感受温度を指定
  • lowTempTerm : 低温障害の感受期間を指定
などが考えられる。
このモデルでは、感受温度変数 (例:lowTemp) だけで無く、幼苗期間(即ち低温感受性の期間)を指定する変数(例:lowTempTerm) が必要である。田植え後20日間など。。。
提出物:
  1. プログラム(必要に応じて、コメントを書き込むこと)
  2. 実行結果(自分の組み込んだモデルが動作していることが分かるもの)
  3. なお提出にあたって、イネの生育診断プログラム授業(Rice00〜Rice03)に関する「コメント」を記入する。
<課題ファイルへのリンク>

参考:2019年のRice04の授業内容は、ここ
東大のWWW提供実験が終了したため、自分のウェブページにプログラムを掲載するというこの授業の内容は今年度は扱わない。ここでの紹介に留めるが、感度解析の部分があるので、興味のある人はこのプログラム(Calc04.html)を使って見てもらいたい。なお昨年度版は、一部の変数の名称などが異なっている。