めも

主にUnity

最適な換気量

二酸化炭素濃度と人間のパフォーマンスの関係

二酸化炭素濃度と人間のパフォーマンスには確かに相関関係があるである。上の2つの図からは、建築基準法で指定されている1000ppmであっても認知機能に影響があることがわかる。この現象には、NLRP3とIL-1βなるものが関係していると一番下の図に書いてあるが、よくわからなかった。

二酸化炭素濃度わずかでも高いと認知機能に限らず様々な問題が起きると一番下の図の論文は主張している。

出典:Associations of Cognitive Function Scores with Carbon Dioxide, Ventilation, and Volatile Organic Compound Exposures in Office Workers: A Controlled Exposure Study of Green and Conventional Office Environments | Environmental Health Perspectives | Vol. 124, No. 6 https://ehp.niehs.nih.gov/doi/10.1289/ehp.1510037#pane-pcw-references

出典:Is CO2 an Indoor Pollutant? Direct Effects of Low-to-Moderate CO2 Concentrations on Human Decision-Making Performance https://www.semanticscholar.org/paper/Is-CO2-an-Indoor-Pollutant-Direct-Effects-of-CO2-on-Satish-Mendell/309e7ebea6e880cd2393bc38596933813022d335

出典:Direct human health risks of increased atmospheric carbon dioxide | Nature Sustainability https://www.nature.com/articles/s41893-019-0323-1

人間からの二酸化炭素発生量

エネルギー代謝率(RMR) 作業程度 二酸化炭素発生量[m^3/(h・人)]
0 安静時 0.0132
0~1 極軽作業 0.0132~0.0242
1~2 軽作業 0.0242~0.0352
2~4 中等作業 0.0352~0.0572
4~7 重作業 0.0572~0.0902

「5.1 完全混合濃度に基づく基本必要換気量」http://tkkankyo.eng.niigata-u.ac.jp/HASS/5_1.html より引用

非定常濃度方程式

室内ガス濃度$K$、導入外気ガス濃度(定数)$K_o$、単位時間あたりガス発生量(定数) $M $、単位時間あたり換気量(定数)$Q$、部屋の容積(定数)$V$に対し、 $$ \begin{equation} V\frac{dK}{dt}=Q(K_o-K)+M \end{equation} $$ 変形して $$ K'+\frac{Q}{V}K=\frac{QK_o+M}{V} $$ ところで $$ (e^{\frac{Q}{V}t}K)'=e^{\frac{Q}{V}t}(K'+\frac{Q}{V}t) $$ より、 $$ (e^{\frac{Q}{V}t}K)'=e^{\frac{Q}{V}t}(\frac{QK_o+M}{V}) $$ 積分して $$ \begin{cases} K=K_o+\frac{M}{Q}+Ce^{-\frac{Q}{V}t} && Q \neq 0 \\ K=\frac{M}{V}t+C && Q = 0 \end{cases} $$ 初期条件$K(0)=K_o$とすれば、 $$ \begin{cases} K=K_o+\frac{M}{Q}(1-e^{-\frac{Q}{V}t})<K_o+\frac{M}{Q} && Q \neq 0 \\ K=\frac{M}{V}t+K_o && Q = 0 \end{cases} $$ 許容室内ガス濃度$ K_m $を設定すると、必要換気量$ Q_m $は、 $$ Q_m=\frac{M}{K_m-K_o} $$

最適制御

春秋ならば窓を開け放して$ Q $を大きくしたいが、夏冬は空調機を使う。空調機が使う電力(と電気代)が換気量に比例すると仮定する。 これは、外温$ T_o $ と室温$ T_r $が一定であり、外気を空調機に通してから室内に入れることと同等である。すると、$ Q $の最小化が問題になるが、窓を開けたり閉じたりするよりも、一定量の換気を常にした方が、排気のCO2濃度の平均が高いため、$ Q $が低下し電気代が下がる。したがって、一定量の換気をし続けた方がいいということになる。

代入

$M=0.0132 $m3/h, $K_o=400 \cdot 10^{-6}, K_m= 1000 \cdot 10^{-6}$とする。$ M $には適宜人数を掛ける。

必要換気量

$$ Q_m=22\ \mathrm{[m^{3}/h]} $$

Bang-Bang制御する場合に窓を開ける頻度

$$ \frac{(K_m-K_o)V}{M}=\frac{V}{22}\ \mathrm{[m^{3}/h]} $$

1畳は1.62m2、部屋の高さは普通2.4-2.5mであるから、$n$畳の場合$\frac{1.62 \cdot 2.4}{22} n=0.286 n$時間ごとに換気する。

面積[畳] 時間[h]
4 1.14
6 1.72
8 2.29
10 2.86

参考文献:「必要換気量の求め方|三菱電機 空調・換気・衛生」https://www.mitsubishielectric.co.jp/ldg/ja/air/guide/support/knowledge/detail_01.html

この値は本当に正しいか?

筆者はNDIR式のCO2モニタを購入し検証したところ、換気のない6畳間洋室で420ppmから1020ppmに上昇するのに2時間半程度かかった。(部屋にこもり続けた。)これは理論値の1.45倍である。図のグラフはやや上に凸であるように見えるため、部屋が完全に密閉されているわけではないことが原因であろう。

ここ数日CO2モニタを眺めていた感想だが、筆者の6畳間洋室では以下のようであるに思えるが、数値は時により変動し、部屋に居続けるのも大変であり、夜間はPCを落としているのでログが取れずうまく検証できていない。さらに、都市部では排気ガスと交通量の変化の影響で、時間帯により外気のCO2濃度は25-50ppm異なる、ご飯を食べたあとは消化により代謝が上がりCO2濃度の増加が早まるなど、他の誤差要因も存在する。

窓の状態 Q
密閉 20
2つ5mm 30
2つ12mm 40

将来

All forcing agents CO2 equivalent concentration.svg EfbrazilCC 表示-継承 4.0, リンクによる

数十年後では大気中のCO2濃度は無視できないほど上昇する可能性があり、その場合上の計算を改める必要があるだろう。

プロット

二酸化炭素濃度の時間推移

換気後を初期条件とした場合における、換気量と二酸化炭素濃度の最大値の関係

# Licensed under CC0: https://creativecommons.org/publicdomain/zero/1.0/deed.en
from numpy.typing import ArrayLike
import numpy as np
import matplotlib.pyplot as plt
import matplotx.styles
from pandas import Series, Timedelta, TimedeltaIndex
import pandas as pd

plt.style.use(matplotx.styles.dracula)

def calc_k(k_o: float, m: float, q: float, v: float, t: ArrayLike) -> ArrayLike:
    """Calculate the concentration of a fluid in a room.

    Parameters
    ----------
    k_o : float
        Concentration of the fluid in the outside air.
    m : float
        Generation rate of the fluid.
    q : float
        Ventilation rate of the room.
    v : float
        Volume of the room.
    t : ArrayLike
        Time.

    Returns
    -------
    ArrayLike
        Concentration of the fluid in the room at time t.
    """
    if q == 0:
        return k_o + m / v * t
    elif q < 0:
        raise ValueError("q must be positive.")
    return k_o + m / q * ( 1 - np.exp(-q / v * t) )

def calc_k_fin(k_o: float, m: float, q: float) -> float:
    """Calculate the concentration of a fluid in a room.

    Parameters
    ----------
    k_o : float
        Concentration of the fluid in the outside air.
    m : float
        Generation rate of the fluid.
    q : float
        Ventilation rate of the room.

    Returns
    -------
    float
        Concentration of the fluid in the room at time t=np.inf.
    """
    if q == 0:
        return np.inf
    elif q < 0:
        raise ValueError("q must be positive.")
    return k_o + m / q

k_o = 420e-6
m = 0.0132 # per hour
ns = [4, 6, 8, 10]

# plot change in concentration over time
t = np.linspace(0, 3, 480)
qs = [0] + (22 * (2. ** np.arange(-3, 3))).tolist()
fig, axes = plt.subplots(len(ns), 1, figsize=(10, 16))
for n, ax in zip(ns, axes):
    ax.set_title(f"{n} tatami mats")
    ax.set_ylabel("CO2 Concentration (ppm)")
    ax.set_xlabel("Time (h)")
    v = n * 1.62 * 2.44
    for q in qs:
        k = calc_k(k_o, m, q, v, t)
        k = Series(k, t) * 1e6
        k.plot(label=f"q={q}", legend=True, ax=ax, grid=True)
fig.tight_layout()

# plot final concentration vs ventilation rate
fig, axes = plt.subplots(len(ns), 1, figsize=(10, 16))
qs = 22 * (2. ** np.linspace(-3, 3, 100))
for n, ax in zip(ns, axes):
    ax.set_title(f"{n} tatami mats")
    ax.set_ylabel("Final CO2 Concentration (ppm)")
    ax.set_xlabel("Ventilation Rate (m^3/h)")
    ax.grid(visible=True, which="major", axis="both")
    ax.grid(visible=True, which="minor", axis="both", linestyle="--")
    Series([calc_k_fin(k_o, m, q) * 1e6 for q in qs], qs).plot(ax=ax, grid=True, logx=True, logy=True)
fig.tight_layout()