(農業)情報工学・課題 (2023/11/16)

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

パラメータの指定
今回の講義では(先週までの課題が完成しているものとして)イネの生育モデリングについての追加の学習は行わない。
その代わり、GoogleAppsScriptについて、更に学習を深める。
具体的には、解析結果の書き出しと、パラメータを少しずつ変化させて、感度解析を行う手法を紹介する。
計算結果の出力
先週までの計算結果の出力は、次の関数を使ってログ画面(Logger.log)への出力か、ブラウザー上のメッセージボックス(Browser.msgBox)であった。
  //情報表示関数(デバック時はLogger,完成時はBrowserに出力)  
  function showMsg(msg) { 
    if (debug) {
      Logger.log(msg); }  
    else{
      Browser.msgBox(msg);  
    }
  }
今回の課題ではこの部分を、次のoutputResults関数でスプレッドシート(Result)に書き込むこととする。なお、書き込むときに引き渡すオブジェクト(文字列)はresultsとなっている。
  //結果出力関数(デバック時はLogger, 完成時はResultシートに出力)
  function outputResults(results){
    if (debug) {
      Logger.log(results); }
    else{
      let ss = SpreadsheetApp.getActiveSpreadsheet();
      let sheet = ss.getSheetByName('Result'); //シートResultを指定
      for(let i=0; i<results.length; i++){
        sheet.appendRow(results[i]);
      }
    }
  }
 実用プログラムの作成に当たって、かなり苦労するのが、ファイルからの入力部分とファイルへの出力分である。今回利用しているコンテナバインド型のGASの場合には、この部分をGoogleドライブ上のコンテンツを利用する事によって、かなり簡潔に記述できるのは大きなメリットである。
ただ、現在のスプレッドシートに書き込む方式は一行ずつappendRowしているためかなり動作が遅い。大量のデータを書き込む場合などには、GASの実行制限(1回の計算時間6分以内、一日の読み書き回数6万回以内)に抵触する可能性があるので注意してもらいたい。
なお、スプレッドシートに書き込む「回数」を減らすには、書き込む内容の行数と列数を定めた2次元のオブジェクト(配列)を用意し、そのオブジェクトにsetValuesメソッドで書き込み、そのオブジェクトをスプレッドシートとして出力する事になるが、今回はその手法の学習はしない。
パラメータスタディ
前回の課題では、各種の計算パラメータをスプレッドシートに記述して与えた。
今回は、計算パラメータを徐々に変化させる事によって、モデルの挙動を確認する「感度解析:Sensitivity Study」を実行することとする。その際には、次の指定を行う必要がある。 このような条件を指定した上で、シミュレーションを指定回数実行し、出穂日、登熟日、収穫日、売上金額の変化を確認する事を目標とする。
また生育モデル(例えばイモチモデル)についても、どの温度モデル(平均、最高、最低)を利用するかや、感受温度を設定する、といった選択が出来るように変更を考えたい。
今回のcalc03.gsは、これらを組み込んだプログラムである。
プログラムの本体:calc03.gs
プログラムの本体(文字化けの時はこのファイルをダウンロードして、解凍して利用。):calc03.txt
プログラムの構成は、次のようになっている。calc03の構成
  1. グローバル領域で、共通変数の定義
  2. 情報表示関数(今回は不使用)
  3. 情報書き出し関数(デバッグ時はLogger出力、実行時はシートResultに書き出し)
  4. 共通情報の書き出し
  5. パラメータスタディの見出し書き出し
  6. パラメータスタディの結果書き出し:シミュレーション1回毎に出力
  7. 共通(基礎)データをシートmainから読み取る
  8. 気象データを TEMP_FILEで指定されたシートから読み取る
  9. イモチの計算モデル。気温データからyFactorを計算し、返す
  10. シミュレーション実行関数:結果はsimulationResultオブジェクトとして返す。
  11. 実行ボタンクリック時に動作する関数:事実上のメイン関数
現在のプログラムは、このままで動作するようになっている。
  1. 気温データとmainシート:calc03.xlsx
  2. 感度解析組み込み済みのプログラムスクリプト: calc03.gs
  3. (文字化けの時はこのファイルを利用する) calc03.txt
実行に当たっては、次の手順で自分のGoogleドライブ上に持ってくる必要がある。 現在このプログラムは、実際にシミュレーションを行う様になっている。しかも、イモチ病の発生モデルも組み込んである。このプログラムを使って様々なシミュレーションを行う事が出来ると思われるので、今回はそのシミュレーションを課題とする。
今回の課題
提出物:
  1. 実行結果:ワードなどに貼り付けて、提出する。実行結果に対するコメントも書く。
  2. なお提出にあたって、イネの生育診断プログラム授業(Rice00〜Rice03)に関する「感想や意見」を記入してもらいたい。

応用課題(挑戦課題)
なお、プログラム自体の変更を行いたい場合には、応用課題として、例えば田植え初期の低温障害モデルの組み込みなどに挑戦することもできる。実際のプログラミングでは、複数の段階の作業が必要である。 まず自分の組み込みたいモデルに関する変数名を決めるところから始めることになる。サンプルとして用意したプログラムの低温障害のモデルの例でみる。ここでは変数は3つ用意している。 参考プログラム(calc03_02.gs):低温障害を組み込んだプログラムの例(動作保証していません。:シートmainにも、3つの変数を追加する必要がある。)
参考プログラム-文字化け対応(calc03_02.txt)