目次 — 知りたいところから読む

入力を変えて確かめる

実験パネルを開き、実行を押すとPythonを読み込みます。停止と初期値へのリセットができます。結果はこの端末内で計算します。Pythonのインストールは不要です。

下にあるローカル実行の手順は、配布ソースを再現するための任意の手順です。ブラウザ実験には不要です。

実験パネルを別タブで開く

再現用ソースをダウンロード

ブラウザで条件を変える

上のパネルで気温、点灯中・消灯中の相対湿度、点灯中PPFD、開始時刻と点灯時間を変更できます。初期値は本文の合成CSVと同じVPD・DLIを再現します。Pythonのインストールは不要です。

固定オフセットUTC+09:00の00時から翌00時まで、必ず24時間を計算します。点灯時刻は30分刻みで、深夜をまたぐ点灯にも対応します。気温は一日一定、湿度は点灯・消灯で切り替え、消灯時PPFDは0です。0時間は一日中消灯、24時間は一日中点灯です。開始時刻を変えても、点灯時間とPPFDが同じならDLIは同じです。

上図は空気VPD、下図は光の積算で、その終点がDLIです。VPDの指標は各区間の時間加重平均です。数値表には区間平均PPFDも表示します。A/B比較と条件共有で湿度と光を別々に変更できます。これは空気VPDと区間平均光量の計算であり、葉温・蒸散・生育・収量の予測ではありません。

ブラウザは完全な合成スケジュールを生成し、CSVアップロードや欠測データの修復は行いません。欠測を拒否する検証は以下の任意の配布テストで確認できます。同じブラウザ用実行コードと既存の解析コードを同じフォルダに保存すれば、ローカルでも初期値を再現できます。

結果から見る

同じ合成データから、空気VPDは約 1.584 kPa、DLIは 11.52 mol m⁻² day⁻¹になる。気温25°C、相対湿度50%、照明は08:00から翌00:00までPPFD 200、それ以外はゼロとする。温湿度は一日一定。これは栽培施設の実測ではなく、単位と積分を検算するための架空データである。

変更 確認する結果 意味
基準条件 VPD約1.584、DLI 11.52 二つの量は別々に計算する
RHを100%へ 空気VPD 0 この式で空気が飽和した場合
点灯中PPFDを100へ DLI 5.76 光量だけが半分
08–09時の行を削除 エラー 欠測を消灯に置き換えない

前提となる栽培空間の境界は環境制御農業入門で整理した。このLabは観測量の計算を扱い、生育・収量の予測や機器への制御指令は行わない。

空気VPD:RHの数字だけでは決まらない

FAO-56の飽和水蒸気圧式(式11)を使う。温度Tは°C、圧力はkPaとし、同じ気温での飽和水蒸気圧と実際の水蒸気圧の差を計算する。

e_s(T)=0.6108\exp\left(\frac{17.27T}{T+237.3}\right),\qquad VPD_{air}=e_s(T)(1-RH/100)

25°Cで飽和水蒸気圧を約3.168 kPaとすると、RH50%でその半分、約1.584 kPaになる。式を日平均の温湿度へ一度だけ適用した値は、各時刻で求めたVPDの平均と一般には一致しない。

ここでは葉温を使っていないので葉と空気のVPDとは呼ばない。植物の蒸散量をVPDだけで決めるモデルでもない。葉温や気流などの影響まで検討する場合はモデルを分ける。MSUのVPD資料も併せて参照する。

DLI:時間間隔を掛けて積み上げる

PurdueのDLI解説に沿って、PPFDを一日で積算する。CSVの各行は、開始から終了までの区間平均PPFDを表す。瞬間測定値を線形補間する台形則のデータではない。

DLI=10^{-6}\sum_i PPFD_i\,(t_{end,i}-t_{start,i})

時間差を秒で計算するので、一定200で16時間なら 200 × 16 × 3600 / 1e6 = 11.52。区間を短く分割しても、平均値が同じなら積算値は変わらない。

区間(UTC+09:00) 時間 PPFD 積算への寄与 (mol m⁻²)
00–05時 5時間 0 0
05–08時 3時間 0 0
08–09時 1時間 200 0.72
09–15時 6時間 200 4.32
15–翌00時 9時間 200 6.48

不等間隔なので、行数だけで平均して24時間を掛ける方法は使えない。瞬間値しかない観測データを使う場合は、測定間隔と欠測の上限を定義した別の積分方法が必要になる。

入力の約束

列 単位・意味 この教材で受け付ける範囲
start / end UTCオフセット付きISO 8601、区間開始・終了 同じ固定オフセットの00時から翌00時まで連続
temp_c 区間内で一定と仮定する気温、°C 0–50
rh_pct 同じ気温での相対湿度、% 0–100
ppfd_umol_m2_s 区間平均、μmol m⁻² s⁻¹ 0–3000

温度と光の上限は教材の入力範囲であり、全作物の推奨条件や式の普遍的な有効範囲ではない。空欄、NaN、無限大、負のPPFD、行の重複・逆順・隙間、24時間に満たないデータは拒否する。夏時間のある日をこの固定24時間モデルへ無言で変換しない。実測では測定位置、校正、センサーの時間応答も記録する。

任意:ローカルでコードとデータを動かす

実験一式ZIPを展開して、そのフォルダで次を実行する。Python 3.10以降、標準ライブラリのみ。追加パッケージも通信も不要。上のブラウザ実験だけでも計算を確認できる。

python3 generate.py
python3 experiment.py synthetic.csv > result.json
python3 -m unittest -v

generate.pyは合成CSVを再作成するため、入力を変更する前に別名で保存する。実験はCSVを読み、VPDと区間ごとの積算をJSONへ出す。期待値はexpected.json、ファイルのハッシュと入力条件はmanifest.jsonで確認できる。

主な計算は次の部分で、入力検証を含む完全なコードはexperiment.pyにある。

es = 0.6108 * math.exp(17.27 * temp_c / (temp_c + 237.3))
air_vpd_kpa = es * (1 - rh_pct / 100)
dose_mol_m2 += ppfd * interval_seconds / 1_000_000

条件を変えて、挙動を確かめる

  1. CSVをコピーし、全行のRHを100へ変える。VPDだけが0になり、DLIは11.52のままか確かめる。
  2. 点灯区間のPPFDを半分にする。DLIが5.76になり、VPDは変わらないことを確認する。
  3. 点灯中の行を一つ削除する。積算値を返さず、隙間を指摘するエラーになる。
  4. RHに0.5を入れると、プログラムは0.5%として受理する。50%のつもりなら約3.15 kPaという誤った入力由来の結果になる。範囲検査だけでは単位の取り違えを発見できない。

配布テストは12件。独立した丸め基準値、湿度の境界、光量の比例、区間分割の不変性、不正値と欠測を検査する。テスト成功は栽培への適合を保証しない。同じDLIが同じ生育を意味するわけでもない。

次は温度計測とサンプリングを参照し、「実測をこのCSV形式へ変換するとき、どの情報が失われるか」を整理するとよい。

次に読む

前提を確認するCEA植物環境・光設計 — 光合成と光量・分布・光質シリーズの次の内容へ進むCEA気候収支Lab — 熱・水蒸気・CO₂を分けて保存する同じ分野を別の観点から読むCEAアクアポニックス — 魚・微生物・植物の水質境界