Contents — find the section you need

Change parameters and verify

Open the panel, then press Run to load Python. You can stop execution and reset parameters. Results are computed on this device. No Python installation is required.

Local execution steps below are optional for reproducing the source results; they are not required for the browser experiment.

The experiment controls are in English.

Open experiment panel in a new tab

Download reproduction source

在浏览器中尝试投影面积实验

上方面板无需安装 Python 即可运行这一合成图像实验。选择清晰、绿色标签、昏暗或截断场景;更改最小亮度 V、感兴趣区域和 mm/像素。九个预设涵盖全部七种已公开条件,外加一个过小的感兴趣区域和一个空选区。预设会重置每一个输入;手动更改阈值也会改变已恢复的昏暗案例。

请查看输入图像、画面内参照物、提取的掩膜以及误差叠加图。红色标记假阳性,蓝色标记假阴性。棕色边界标出输入图像上所选的感兴趣区域。将一个结果保存为 A,然后更改一个输入,以便在相同的显示比例下比较图像和指标。数据表给出的是水平像素游程(从零开始的 x/y 坐标和长度);它们能精确重建每个图像区域,而不进行降采样。可以共享条件或下载结果 JSON 以保留该实验。

图像仍是原始的 320×240 几何场景,没有上传真实照片或使用摄像头输入。原始的 NumPy 几何和测量函数被原样复用。浏览器版本只是用一份经过验证的三种固定 RGB 颜色查找表替代了 OpenCV 的转换/范围选择:背景色 (235,235,235)、目标色 (50,160,65) 和昏暗目标色 (20,60,25)。它们对应的 OpenCV 4.6.0 uint8 HSV 值为 (0,0,235)、(64,175,160) 和 (64,170,60)。这不是一个通用的 HSV 转换器。H 固定为 35–85,S 固定为 80–255;V 的最小值可在 0 到 255(含)之间调节。未应用任何形态学处理。

固定的排除标签的感兴趣区域为 (50,20,230,190);较小的感兴趣区域为 (140,60,20,30),单位为 x/y/宽度/高度像素。两者均不会根据植株自适应调整。比例尺范围为 0.1 到 1.0 mm/像素,作为一个假定的参考平面换算值,而非一次校准。更改比例尺时图像本身不变。touches_frame 中“是”显示为 1,“否”显示为 0;空选区的精度未定义(—)。一个被截断场景即使 IoU 为完美值,也无法说明画面之外的部分。这些输出并不测量生物量、生长量、胁迫状况或真实的叶片表面积。

原始下载内容和已保存的基线结果保持不变。以下本地复现说明为可选内容。浏览器适配器使用 NumPy 而不使用 OpenCV;请将其入口点、内核和调色板一并保存,以便在安装了 NumPy 的本地环境中运行。

leaf: experiment.py

leaf: leaf_kernel.py

leaf: palette.json

leaf: original.py

CEA 传感与流量——在何处测量二氧化碳和营养液

数值相同的显示可能指的是不同的地点和时间

水箱溶解氧与种植通道出口处的溶解氧是不同的。在将这种差异归因于根系耗氧之前,请先检查传感器观测的时间是否可比、校准是否一致,以及样本在传输过程中是否发生了变化。

根区指南 将电导率、pH 值、溶解氧和水平衡分开讨论。本文探讨的是在何处、如何进行比较。它沿用了温湿度传感器指南中关于滞后和校准的概念,并补充了二氧化碳、营养液和流量所特有的问题。

下方的布置表和调查步骤是我们提出的一种设计思路。它们不是设施测量数据,不是所需的传感器数量要求,也不是通用的作物报警阈值。

决定你需要观察哪些差异

目标 示例比较点 需要一并记录的内容
作物区二氧化碳 冠层附近、送风、排风或回风 高度、施气量、通风、门的开关、温度和相对湿度
电导率、pH 值和水温 混合水箱、种植通道进口和出口 源水、添加物、体积和循环情况
溶解氧 水箱、根系附近、通道出口 温度、曝气情况和传感器技术
液体流量 补给水、选定支路、排放 流量、位置和阀门状态
液位和压力 水箱、过滤器上下游 液位与体积的关系、压力基准和高程
空气流动 货架前后及不同高度 探头朝向、平均时长和风机状态

固定点用于监测,便携式测量用于绘制空间分布。在移动式调查中保留一个固定参考点,以区分时间变化。将位置 ID 与传感器 ID 分开分配,这样更换传感器就不会破坏位置历史记录。

二氧化碳自校准是否适合种植条件?

紧邻二氧化碳出气口的测量值不应自动代表整个冠层。请记录该点与施气、送/排风以及人员呼吸之间的关系。用于诊断施气设备的测量点,与用于评估作物状况的测量点,目的是不同的。

请检查校准算法。2018 年 Sensirion SCD30 现场校准说明 描述了 ASC 算法使用一个对应 400 ppm 的最低浓度,并要求定期暴露于该浓度下。

我们的推断是,持续富集二氧化碳的房间可能不满足这一假设。这涉及的是文档中记载的算法,而非所有二氧化碳传感器。请遵循所选型号和固件的说明,并规划与参考气体或已校准仪器的比较。历史上的 400 ppm 假设并不能保证是当前的室外校准值。

内置于二氧化碳设备中的温度/相对湿度输出,可能描述的是其外壳内部环境,而非有代表性的冠层空气。请将用于环境补偿的输入值与用于评估作物环境的测量值区分开来。

电导率、pH 值和溶解氧需要不同的检查方式

美国地质调查局多参数仪器手册 将存储、维护、校准、测量和报告联系在了一起。其针对天然水体的适用范围并不能确立作物设定值,也不能证明其适用于某种特定营养液。

以下提出的检查清单应用了这一通用方法;实际程序和溶液必须与仪器说明书相匹配。

参数 需核实的项目
电导率 电导率标准液及其温度、预期范围、电极常数和温度补偿
pH 值 与量程相符的缓冲液、温度、电极/接口状态和存放方式
溶解氧 光学或电化学方法、校准条件、压力/盐度补偿、膜或帽的状态
全部 调整前误差、清洁/调整后的结果、标准液标识、日期和稳定时间

在标准液中读数一致,并不能证明安装后的读数具有代表性。应在添加物加入后立即调查气泡、沉积物、滞留液体和局部浓度差异。

溶解氧技术种类很重要。YSI 的测量指南 说明光学传感器不消耗氧气,其测量原理本身没有搅拌需求,尽管流动可以改善响应时间。不要假定电化学设备和光学设备具有相同的流动要求。即使是光学传感器,也仍然需要采集能够代表目标根系环境的液体样本。

采样管路会将“较旧”的液体带给传感器

远程流通池会使显示时间与采样点处的实际条件产生差异。对于一段合成管路体积为 0.50 L、流量恒定为 0.25 L/min 的情况,假设理想置换、不发生混合或弥散:

t_{transport}=V_{line}/Q=0.50/0.25=2.0\ \mathrm{min}
Diagram 1 · Use the button to switch views
概念性示意图,将样品传输、传感器响应和日志接收分开表示,合成传输时间为两分钟。

这两分钟仅描述理想的管路传输时间。流通池混合、传感器响应和通信延迟是额外的影响因素。

将流量提高到 0.50 L/min,会将这一理想时间缩短为一分钟。实际管路和流通池会发生混合;温度和气体交换也可能改变样品状态。将时间戳平移两分钟,并不一定能还原原始条件。

请分别记录采样位置、管路/流通池配置、流量、仪器测量时间和接收时间。在不同采样点之间切换时,也要检查上一个样品的残留影响。

比较水泵指令、流量、液位和压力

水泵开启并不是流量测量。总输送量和各支路的输送量是不同的观测值。请遵循所选流量计对直管段、满管、量程和气泡的要求。

利用水箱几何形状将液位换算为体积。对于恒定横截面,体积变化等于面积乘以液位变化;这一换算并不适用于底部倾斜的容器。基于压力的液位测量还需要考虑密度和参考压力。

过滤器压差可以支持比较,但它同样取决于流量。当运行条件不同时,压差上升本身并不能证明发生了堵塞。请记录测量高程、表压与绝对压力之别以及单位。

使用水平衡残差发现不一致之处

此处的边界是仅限水箱本身。Q_{in} 包括所有流入水流,Q_{out} 包括所有流出水流,包括循环供给和回流。这与上一篇文章的整个系统边界不同。该合成示例将蒸发等其他项设为零。

r=(V_1-V_0)-\sum_i(Q_{in,i}-Q_{out,i})\Delta t_i

使用 L/min 和分钟为单位,得到的残差 r 单位为 L。在我们最初的示例中,流入为 1.0 L/min,流出为 0.2 L/min,持续五分钟。预测增加量为 4 L,而由液位推算出的体积却只从 100 L 升至 101 L。残差为 −3 L。

这促使我们去调查未记录的水流、流量/液位偏差、计时差异或被遗漏的损耗。这并不能证明存在泄漏。

from math import isfinite


def transport_minutes(line_l, flow_l_min):
    if not all(isfinite(x) for x in (line_l, flow_l_min)):
        raise ValueError("finite values required")
    if line_l < 0 or flow_l_min <= 0:
        raise ValueError("nonnegative volume and positive flow required")
    return line_l / flow_l_min


def residual_l(v0, v1, intervals):
    if not all(isfinite(v) and v >= 0 for v in (v0, v1)):
        raise ValueError("invalid tank volume")
    if not intervals:
        raise ValueError("intervals required")
    predicted = 0.0
    for minutes, inflow, outflow in intervals:
        if not all(isfinite(x) for x in (minutes, inflow, outflow)):
            raise ValueError("finite interval values required")
        if minutes <= 0 or min(inflow, outflow) < 0:
            raise ValueError("invalid interval")
        predicted += (inflow - outflow) * minutes
    return (v1 - v0) - predicted


print(f"transport: {transport_minutes(0.50, 0.25):.1f} min")
print(f"residual: {residual_l(100, 101, [(5, 1.0, 0.2)]):.1f} L")

将其保存为 measurement_check.py,运行 python3 measurement_check.py,可得到 2.0 min 和 -3.0 L。流量在每个区间内保持恒定,且各区间被假定为无缺口、无重叠地覆盖了整个观测周期。这个小示例不接受时间戳输入,因此无法自动验证这一假设。

将最终体积改为 104 L,残差就变为零。在相同流量下,将五分钟拆分为两分钟和三分钟,结果不变。对于实测数据,遇到不完整的积分区间时应将其判定为无效,而不是把缺失的流量当作零处理。

假设每个端点体积的误差范围为 0.5 L,每个流量的误差范围为 0.1 L/min,且持续时间是精确的。五分钟内残差误差的最坏情况贡献为 0.5+0.5+5(0.1+0.1)=2.0 L。仅凭这些假设无法解释 3 L 的差异。这是一个用于说明的误差范围,并非产品精度或统计置信区间。在诊断故障之前,请先验证这些误差范围和被遗漏的项。

将循环与通风区分开

循环是使室内空气流动和混合;通风则是与室外进行空气交换。北卡罗来纳州立大学的温室指南 将两者分开处理。不要把循环风机的额定流量当作室外交换量计入二氧化碳平衡。

对于冠层风速调查,请记录探头朝向、位置、平均时长、照明和风机状态。货架前方的流速并不能确立其后方的流速。请同时保留空间差异、波动情况和平均值,并在作物生长改变了气流路径时重新进行调查。单次风速测量并不能直接预测蒸腾或病害情况。

对测量链进行调试

  1. 定义观测目的和边界;统一位置 ID、单位和时间。
  2. 与标准液或参考仪器进行比较,并保留调整前后的结果。
  3. 通过同位测量调查仪器差异,与空间调查分开进行。
  4. 将运行日志与观测值进行比较,区分传输、响应和通信延迟。
  5. 使用水平衡和多项测量来发现不一致之处,然后调查各种可能的原因。

这为之后的控制和估算建立了观测基础。植株图像估算也需要同样的纪律性:在将表观变化解读为生长之前,请保留图像的拍摄时间、光照和视角信息。

CEA 植株图像——测量投影面积,区分叶面积

照片中绿色更多是否意味着叶片更多?

当叶片朝向、重叠、光照或摄像机位置发生变化时,同一株植物可能占据不同的可见区域。因此,我们的第一个估算任务仅限于图像中所选区域的投影面积。它并不直接估算叶片表面积、质量、产量或胁迫程度。

前一篇传感指南 将空间、仪器和时间差异分开讨论。图像同样需要记录采集和处理过程。此处使用重叠的椭圆作为合成输入;没有实测的植株照片,也没有训练模型。受控示例可以在对真实植株设计评估之前暴露出失败原因。

先定义量的含义

对于一个目标像素值为一的二值掩膜 M(u,v),像素计数为 N=\sum_{u,v}M(u,v)。给定一个假定的各向同性比例尺 s [mm/像素],参考平面等效面积为:

A_{proj}=Ns^2

我们的合成基线包含 14,738 个像素。在 0.5 mm/像素的比例尺下,这相当于 3,684.50 mm²。该比例尺是为说明而给出的,并非自动测得。

量 本页测量的内容 不是什么
掩膜像素计数 被选中的像素数量 由轮廓所围成的几何面积
参考平面投影面积 像素计数乘以比例尺的平方 弯曲叶片的实际表面积
可见并集 从上方可见的目标区域 各重叠叶片面积之和
绿色区域 由颜色筛选出的候选区域 对叶片的可靠语义识别

PlantCV 的尺寸分析 同样根据标注区域计算属性,并支持通过像素尺寸进行换算。请将区域提取与单位换算分开处理。我们的代码直接计数像素,并不调用 PlantCV。

保持采集条件和比例尺的一致性

请记录摄像机位置和朝向、焦距、图像尺寸、曝光、白平衡、光照、植株 ID 和时间戳。如果曝光或白平衡为自动模式,也请记录该状态。将一个固定阈值应用于变化的图像条件,可能会把颜色变化误变成表观面积变化。

一段已知长度为 100 mm、在画面中跨越 200 像素,则该位置的比例尺为 0.5 mm/像素。请将参照物置于测量平面内,并尽量使摄像机与之垂直对齐。如果需要考虑畸变或透视,请使用摄像机校准和适当的平面校正。若水平和垂直方向比例尺不同,需要使用 Ns_xs_y。

地面上的参照物不一定与其上方生长的叶片共享同一比例尺。平面校正并不能使三维冠层变得共面。当这些假设不成立时,应报告固定采集条件下的像素计数或参考平面等效面积,而不要声称测得的是物理叶面积。

使用 0.6 而非 0.5 mm/像素,会使同一掩膜的面积乘以 1.44:增加 44%。正确的区域提取仍可能伴随错误的单位换算。

选择颜色候选区域

OpenCV 教程 演示了转换到 HSV 空间并使用 inRange 进行颜色范围选择的方法。选出绿色并不等同于识别出叶片。

输入图像为 320×240 像素。在 OpenCV 的 8 位 HSV 表示中,本示例选择 H 35–85、S 80–255 和 V 100–255。H 并非直接以 0–360 的角度输入。我们生成的数组是 RGB 格式,因此转换使用 COLOR_RGB2HSV;请勿将该转换不加区分地套用到 imread 返回的 BGR 图像上。

核心代码只有三行。图像生成、条件比较和验证部分包含在完整下载包中。

hsv = cv2.cvtColor(rgb, cv2.COLOR_RGB2HSV)
mask = cv2.inRange(hsv, (35, 80, min_v), (85, 255, 255)) != 0
pixels = int(np.count_nonzero(mask))

未应用形态学填充或小连通域去除。如果要增加此类处理,请检查它是否会改变狭窄叶片或叶片间隙相对于参考掩膜的结果。

在相同几何条件下比较各种失败情况

生成的参考是三个椭圆在画面内的可见并集。重叠部分只计数一次,画面之外的部分被排除。

合成基线、绿色背景标签和左侧变暗场景,假阳性标记为红色,假阴性标记为蓝色。

红色标出被选为目标的背景;蓝色标出被漏检的目标像素。绿色区域保留其输入颜色。这些是合成图形,而非植株照片。

条件 选中像素数 平面等效面积 [mm²] IoU 解读
clean 14,738 3,684.50 1.000 与合成参考一致
green_tag 15,538 3,884.50 0.949 增加了 800 个背景像素
green_tag_roi 14,738 3,684.50 1.000 在此布局中排除了标签
dim 7,428 1,857.00 0.504 漏检近一半,但形状未变
dim_lower_v 14,738 3,684.50 1.000 V 最小值 40 恢复了该暗色区域
wrong_scale 14,738 5,305.68 1.000 掩膜正确,但换算结果偏大 44%
clipped 13,016 3,254.00 1.000 与画面内参考一致,但不代表整个物体

固定的 green_tag_roi 起点为 (50,20),宽度 230,高度 190 像素。选择它是为了避开这个合成标签,而不是作为一个与作物无关的通用感兴趣区域。超出该感兴趣区域的生长部分会被排除在外,即使它们是真正的目标像素。

降低最小 V 值并不是一个万能的修正方法。它在这里恢复了昏暗的目标区域,但在真实场景中可能会纳入深绿色的背景。请勿针对每张图像的已知答案去调优阈值,然后仅在这些相同图像上报告准确率。

分别评估面积和位置

对于预测 P 和参考 G,交并比 (IoU) 衡量空间重叠程度:

IoU=\frac{|P\cap G|}{|P\cup G|}

多选和漏选的像素数量相等时,即使位置错误,面积误差也会为零。参考 [0,1,1,0] 和预测 [1,1,0,0] 各包含两个选中像素,但其 IoU 为 1/3。

输出还包括精确率(选中像素中正确的比例)和召回率(参考像素中被恢复的比例)。mask_area_error_percent 是相对于参考值的像素计数误差,而非源自比例尺校准的物理误差。对于 wrong_scale,该值仍为零。未定义的比值——包括两个空掩膜之间的 IoU——在 JSON 中为 null,而不是被假定为满分。

touches_frame 标记的是接触图像边缘的选中像素。对于 clipped 情形,其值为真。它并不能检测出所有不完整的物体:分割过程可能漏掉边缘像素,或者内部感兴趣区域可能切除了目标的一部分。即使该标记为假,也请检查图像和感兴趣区域。

下载与复现

下载完整压缩包、Python 源代码、预期结果、README 和清单文件。该压缩包包含输入图像、参考图像、提取的掩膜和误差叠加图,全部均可从相同的源代码重新生成。

测试环境:Linux x86_64、Python 3.12.3、NumPy 1.26.4 和 OpenCV 4.6.0。依赖版本已固定以便复现,并非对其他操作系统或 Python 版本的认证。

解压压缩包后,运行:

python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python experiment.py --self-test
.venv/bin/python experiment.py --verify expected.json --out reproduced

在 Windows 上,请将 .venv/bin/python 替换为 .venv\Scripts\python.exe。输出目录必须不存在;已有的输出不会被覆盖。会保存结果 JSON 以及每种条件对应的 PNG 文件。基线输出包含在 samples/ 目录下。

使用以下命令更改最小 V 值:

.venv/bin/python experiment.py --min-v 40 --out lower-v

只有 dim_lower_v 始终使用 40;其他条件使用所提供的数值。更改后的结果会有意与基线 expected.json 比较失败。请勿期望在更改实验设置后基线验证仍能通过。

七项测试涵盖了一个已知矩形、面积相等但位置不同的掩膜、空掩膜、七种情形之间的关系、无效输入、被修改的预期结果以及感兴趣区域缺省情况。原始下载包不含真实照片导入功能;浏览器适配器已在上方提供。

在实测植株上评估之后,再做出生物学论断

以下是我们提出的下一阶段评估方案,并非本合成示例已完成的工作。

  1. 保留植株 ID、日期、照明、摄像机几何参数和原始图像。
  2. 定义目标成员资格,包括茎或衰老叶片是否计入,并制作人工参考掩膜。
  3. 将用于阈值开发的图像与用于评估的图像分开。考虑按植株或采集日期划分,而不是仅仅分开相邻的视频帧。
  4. 按光照、背景、重叠和截断情况分别报告误差,并保留面积指标、IoU 和误差叠加图。
  5. 若要估算实际叶面积或干重,需收集相应的独立参考测量数据,并将该映射关系作为一个单独的模型进行验证。

时间序列上投影面积的变化可能来自姿态或重叠情况。产生一个图像指标并不能确立生长速率或胁迫状况。请先使该观测具有可复现性,再使用参考数据检验它究竟代表了什么。

CEA 根区——分离电导率、pH 值、氧气和水平衡

当水位下降时,应该补充什么?

一份营养液从 100 L 降至 90 L。仅凭这一观测无法区分蒸发、植株吸水、泄漏或排水。它同样不能确立养分吸收情况。恢复体积和恢复养分成分是两个不同的决策。

在光环境指南之后,本文探讨根系环境。它介绍了一个再循环溶液系统;这不是作物配方,也不是自动加药的实现方案。所有数值示例均为合成数据。

根区是根系与周围环境交换水分、养分和气体的区域。水箱读数是有用的,但不一定能代表根系表面、通道末端或基质内部的情况。

将五项测量分开处理

测量项 含义与单位 单独一项无法确立的内容
电导率 电导率,例如 mS/cm 单独的硝酸盐、钾或钙浓度
pH 值 与氢离子活度相关的对数量 达到目标 pH 值所需的酸或碱量
溶解氧 (DO) mg/L 或饱和度百分比 氧气向根系表面的输送速率
水温 测量位置的摄氏温度 空气温度或整个根系的温度分布
体积和流量 例如 L 和 L/min 各单项养分的吸收量

这是一份测量规划表。可接受的条件取决于作物、生长阶段和生产系统。

电导率无法还原成分组成

1 mS/cm = 1,000 µS/cm = 1 dS/m。 请记录单位。电导率也会随液体温度变化:请保留测得的温度、补偿设置和参考温度,并区分经补偿和未经补偿的读数。

正如俄克拉荷马州立大学水质检测指南 所说明的,电导率无法揭示各单独盐分的浓度。单次读数无法区分某一养分的耗尽与另一离子的累积。

由电导率换算出的“ppm”显示同样不是对各单项养分的测量。请记录其换算系数,并将其与实验室浓度检测结果区分开来。需要了解成分时,应使用源水和溶液分析。

俄克拉荷马州立大学养分管理指南 指出,源水检测、盐分浓度、pH 值、碱度和养分比例都是相关因素。我们在操作层面的推断是:不要将电导率回到设定值视为原始配方已恢复的证明。

分别记录 pH 值和碱度

pH 值描述的是当前的酸碱状态。由于它是对数量,两个 pH 读数按体积加权的平均值通常并不能给出混合后溶液的 pH 值。美国地质调查局:pH 值与水

碱度衡量的是酸中和能力。当两种水的碱度不同时,即使它们的初始 pH 值相同,在加入相同量的酸后也可能产生不同的响应。美国地质调查局:碱度与水

一条“每当 pH 误差达到 0.5 个单位就添加相同剂量”的规则,混淆了这两个量。要评估一次干预,请记录源水、水箱体积、添加的物质及其用量,以及混合后测量的时间。下面的水平衡计算无法计算出所需的剂量。

氧气需要一条输送路径

平衡状态下的溶解氧溶解度取决于水温、大气压力和盐度。美国地质调查局 DOTABLES 利用这些条件计算溶解度。在压力和盐度相同的情况下,水温越高,平衡时所能保持的溶解氧通常越少。在比较 mg/L 和饱和度百分比时,请检查换算条件。

根系呼吸需要氧气。康奈尔大学水培叶菜指南 讨论了根系供氧和水温问题。一个表面上看似充足的水箱溶解氧读数,并不能证明密集根团内部也是同样的条件。请记录循环、曝气和取样位置,包括种植通道进口和出口之间的差异。

Diagram 2 · Use the button to switch views
带有外部输入与损耗、内部循环以及独立的水箱与根区观测点的概念性再循环系统。

对于一个包围整个系统的边界而言,内部循环并不是外部水输入。该示意图并不意味着完全混合或氧气均匀分布。

对于使用基质的情况,保水能力和通气路径同样重要。仅凭水箱溶解氧无法确立基质的通气状况。请勿将下方针对单一液体舱室的计算直接套用到基质内部。

分开记录水分和溶质账目

选择一个包围整个再循环系统的边界,包括水箱、管路和种植通道。在一个时间区间内,设外部添加量为 V_{in},液体排放量为 V_{out},蒸发加上输送给植株的水量为 V_w,单位均为 L。

V_1=V_0+V_{in}-V_{out}-V_w

不要将内部水泵循环计入补给水。若采用仅限水箱的边界,则应明确计入其流出和回流的水量。

对于一种被追踪的溶质,质量为 M [mg],浓度为 C=M/V [mg/L]:

M_1=M_0+M_{in}-M_{out}-U-R

U 为转移给植株的量;R 为从液相中净去除的量,例如沉淀。从液相中去除并不意味着物质被销毁。液体排放会同时带走水分和溶质,这与蒸发不同。对于连续排放,应使用 M_{out}=\int C_{out}(t)Q_{out}(t)dt 以考虑浓度的变化。

以下这个原创的算术示例用于检验这套账目方法。它不是实测的植株吸收速率、施肥配方或电导率预测值。初始状态为 100 L 溶液中含 10,000 mg 某成分:浓度为 100 mg/L。假设没有添加也没有沉淀。

合成情形 最终体积 最终溶质质量 最终浓度
A:损失 10 L 水;溶质不变 90 L 10,000 mg 111.11 mg/L
B:向植株转移 10 L 水和 2,000 mg 90 L 8,000 mg 88.89 mg/L
C:排放 10 L 均匀溶液 90 L 9,000 mg 100.00 mg/L

相同的体积下降幅度可能伴随浓度上升、下降或不变。为 A 补加 10 L 不含该追踪溶质的水,可以将其恢复到 100 mg/L,但 B 只能恢复到 80 mg/L。恢复体积并不能恢复溶质质量。

用 Python 复现这一比较

将以下内容保存为 root_zone.py,运行 python3 root_zone.py。仅需要 Python 标准库。

from math import isfinite


def concentration(volume_l, mass_mg):
    if not (isfinite(volume_l) and isfinite(mass_mg)):
        raise ValueError("finite values required")
    if volume_l <= 0 or mass_mg < 0:
        raise ValueError("positive volume and nonnegative mass required")
    return mass_mg / volume_l


initial_v, initial_m = 100.0, 10000.0
initial_c = concentration(initial_v, initial_m)
cases = {
    "A": (initial_v - 10, initial_m),
    "B": (initial_v - 10, initial_m - 2000),
    "C": (initial_v - 10, initial_m - 10 * initial_c),
}
for name, (volume, mass) in cases.items():
    print(f"{name}: {concentration(volume, mass):.2f} mg/L")
print(f"B + water: {concentration(cases['B'][0] + 10, cases['B'][1]):.2f} mg/L")

输出为 111.11、88.89、100.00 和 80.00 mg/L。将 B 中去除的 2,000 mg 改为 1,000 mg:体积损失之后,浓度变为 100 mg/L。即使浓度未变,也可能已经发生了吸收。体积为零或剩余质量为负会引发错误。

这段代码不计算电导率、pH 值或溶解氧。对单一成分的正确账目核算,并不能验证多成分化学平衡或作物响应。

决定接下来要观察什么

以下是我们提出的观测组合方案,而非自动加药规则。

观测现象 后续检查
电导率上升而体积下降 补给和排放历史、液温和补偿、水质及溶液成分
电导率稳定但植株状况发生变化 各单项成分、根区溶解氧和温度、流量、光照和历史记录
调整后 pH 值再次发生变化 混合和测量时间、源水碱度、添加历史
水箱和出口处溶解氧不同 同步读数、传感器状态、循环、曝气和根系分布

请将时间、位置、单位和校准信息与水量、补给、排放和添加物一并关联记录。详细的传感器布置、单项养分管理和加药控制是后续步骤。此处的基础是要将观测到的浓度与系统中剩余的质量区分开来。

What to read next

回顾因采样而丢失的变化。采样和混叠:为什么更快的轮询还不够Review the backgroundCEA 气候控制——温度、湿度、传感器、响应与耦合Continue the seriesCEA 养分投配——水箱核算、水泵校准与状态控制