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

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

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

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

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

実際のプログラム(Calc03.html)の構造を次に示す。
  1. HTMLの宣言、ボタン類の配置
  2. 実行ボタンの配置
  3. JavaScript部分
    変数の宣言、初期値の設定
  4. 作業用変数の設定
  5. 入力フィールドからのデータの読込(OnButtonClick1関数の開始)
  6. ブラウザへの書き出し
  7. 気象データの読込
  8. 生育シミュレーション
  9. 結果の書き出し(OnButtonClick1関数の終了)
  10. 気温データ内容の表示関数(OnButtonClick2)
現在このプログラムは、気温データを指定して実行ボタンを押すと、実際にシミュレーションを行う様になっている。しかも、イモチ病の発生モデルも部分的に組み込んである。しかし、このままただ単に各種の気温データを読み込ませて、実行させるだけではプログラミングの技量の向上は望めないので、諸君には自分のモデルを組み込むという課題をこなして欲しい。
実際のプログラミングでは、次の数段階の作業が必要である。
  1. HTML部分でのボタンの配置(1)
  2. JavaScript部分で、変数の定義(2)
  3. HTMLのボタンで初期値を表示(3)
  4. ボタン関数内で1.の入力フィールド内容を2.の変数に読み込む(4)
  5. シミュレーション独自モデル情報の表示(5)
  6. 生育シミュレーション部分(田植えから出穂までの期間)でモデルの動作を記述(6)
  7. 生育シミュレーション部分(出穂から登熟までの期間)でモデルの動作を記述(7)
  8. ブラウザにモデル内容を記述(8)
まず自分の組み込みたいモデルに関する変数名を決めるところから始めることになる。サンプルとして用意したプログラムのイモチのモデルの例でみる。ここでは変数は二つ用意した。 まず、(1)で、二つの変数を読み込むためのボタンの作成を行う。この段階はHTML文書の編集作業である。ボタンはlabelタグとinputタグで記述している。ここで、valueで指定しているのは初期値となる。 JavaScriptではinputタグ内に記述したidを使って、内容を読み込んでいる。idはユニークであれば任意に付けられるが、プログラムの読みやすさから考えると、JavaScriptで利用する変数名と同じにしておくことが好ましい。なおHTML内では、 <!-- と --> に挟まれた部分がコメントになる。

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

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

<課題ファイルへのリンク>