Shau00n
@Shau00n (Shun Kobayashi)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PMV計算式のアルゴリズム書き換えが分かりません!

PMV計算式の書き換えを模索しているのですが、うまくいきません!

PMVという指数は6つの要素から求めることができます。今回、PMVの計算式を利用しPMVの値を先に0と設定し、6つの要素の1つ着衣量の値を導き出そうとしています。
ですが、数式の書き換え部分で手が止まってしまい、手も足も出ない状況です。

ですので、アルゴリズムや、数学が得意な方に助けていただきたいです。

PMVとは

PMVは、温熱環境の快適性に影響を与える6つの要素の全てを考慮した、温熱環境の快適性の評価指標です。
ちなみに、温熱環境の快適性に影響を及ぼす6つの要素とは下書きのものです

  • 気温
  • 湿度
  • 放射温度
  • 気流
  • 着衣量
  • 代謝量

PMVに関する参考サイトは下書きのものです。

参考サイトリンク

今回やりたいこと

PMV指数計算式は下書きのサイトを参考にさせていただきました。
下書きのコードをpmv の値を0に設定し、lclの値を求めるアルゴリズムにしたいです。

参考サイトリンク

index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Document</title>

<meta name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 11.0.0.0 for Windows">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Style-Type" content="text/css"><title>PMV calculation</title></head><body>

<h1>PMV and PPD Calculation</h1>

<hr>

<form name="js">
代謝量 Metabolic rate: <input name="txtm" value="58.2" type="text"> [W/m2]<br>
外部仕事 External work: <input name="txtw" value="0.0" type="text"> [W/m2]<br>
気温 Air temperature: <input name="txtta" value="20.0" type="text"> [degree Celsius]<br>
放射温度 Radiant temperature: <input name="txttr" value="20.0" type="text"> [degree Celsius]<br>
相対湿度 Relative humidity: <input name="txtrh" value="50.0" type="text"> [%]<br>
衣服の熱抵抗 Clothing: <input name="txtcl" value="1.0" type="text"> [clo]<br>
気流速 Air velocity: <input name="txtva" value="0.2" type="text"> [m/s]<br>
<input value="Calc." onclick="pmvcalc()" type="button"><br>
</form>
index.html
function pmvcalc()
{
  try
  {
    //テキストボックスの数値を変数に格納する
    var m = eval(document.js.txtm.value);
    var w = eval(document.js.txtw.value);
    var ta = eval(document.js.txtta.value);
    var tr = eval(document.js.txttr.value);
    var rh = eval(document.js.txtrh.value);
    var lcl = eval(document.js.txtcl.value);
    var va = eval(document.js.txtva.value);

    eps = 0.00001;
    mw = m - w;

    //アントワーヌの式による蒸気圧計算
    ppk = 673.4 - 1.8 * ta;
    ppa = 3.2437814 + 0.00326014 * ppk + 2.00658 * 0.000000001 * ppk * ppk * ppk;
    ppb = (1165.09 - ppk) * (1 + 0.00121547 * ppk);
    pa = rh / 100 * 22105.8416 / Math.exp(2.302585 * ppk * ppa / ppb) * 1000.0;

    //fcl=着衣表面積/裸体表面積の比の計算
    if (lcl > 0.5) {
      fcl = 1.05 + 0.1 * lcl;
    } else {
      fcl = 1.0 + 0.2 * lcl;
    }

    //衣服表面温度tclの初期値
    tcl = ta;
    tcla = tcl + 1.0;

    //着衣表面温度の算出
    while (Math.abs(tcla - tcl) > eps) {
      tcla = 0.8 * tcla + 0.2 * tcl;
      hc = 12.1 * Math.sqrt(va);
      if (2.38 * Math.sqrt(Math.sqrt(Math.abs(tcl - ta))) > hc) {
        hc = 2.38 * Math.sqrt(Math.sqrt(Math.abs(tcl - ta)));
      }
      tcl = 35.7 - 0.028 * mw - 0.155 * lcl * (3.96 * 0.00000001 * fcl * (Math.pow((tcla + 273.15), 4) - Math.pow((tr + 273.15), 4)) + fcl * hc * (tcla - ta));
    }

    //PMVの計算
    pm1 = 3.96 * 0.00000001 * fcl * (Math.pow((tcl + 273.15),4) - Math.pow((tr + 273.15),4));
    pm2 = fcl * hc * (tcl - ta);
    pm3 = 0.303 * Math.exp(-0.036 * m) + 0.028;
    if (mw > 58.15) {
      pm4 = 0.42 * (mw - 58.15);
    } else {
      pm4 = 0;
    }
    pmv = pm3 * (mw - 3.05 * 0.001 * (5733.0 - 6.99 * mw - pa) - pm4 - 1.7 * 0.00001 * m * (5867.0 - pa) - 0.0014 * m * (34.0 - ta) - pm1 - pm2);
    ppd = 100.0 - 95.0 * Math.exp(-0.0335 * Math.pow(pmv,4) - 0.2179 * pmv * pmv);

    //小数点以下2桁に直す
    pmv = pmv * 100;
    pmv = Math.round(pmv);
    pmv = pmv / 100;

    ppd = ppd * 100;
    ppd = Math.round(ppd);
    ppd = ppd / 100;

    //結果表示
    alert("PMV: "+pmv+"   PPD: "+ppd + " [%]");
  }
  catch(e)
  {
    alert("数値を入れてください");
  }
}

お願い

コード内にあるfunction pmvcalc()pmvの値を0と設定し、lclの値を求めるようなアルゴリズムを考えていただきたいです。最悪、lclのような着衣に関する指数が取れれば、上のコードの原型がなくてもよいです。

自分は下書きの部分で詰まってしまい、打開策が全く思いつきません。

//fcl=着衣表面積/裸体表面積の比の計算
    if (lcl > 0.5) {
      fcl = 1.05 + 0.1 * lcl;
    } else {
      fcl = 1.0 + 0.2 * lcl;
    }

アルゴリズムや、数学が得意な方、無理難題だとは思いますが、解決していただけると大変助かります。

返信お待ちしています、ご回答のほどよろしくお願いいたします。

0

1Answer

lcl から pmv を計算する式」が単純であれば,
そこから「pmv から lvl を計算する式」を作れるかもしれません.
しかし,コードを見る限りでは式が複雑すぎるので,
この方法は難しそうです(もしかしたら難しいどころか不可能かもしれません).

別の策として,「lcl から pmv を計算する式」を使って,
pmv がほぼ 0 になるような lcl の値」を探すという方法があります.
具体的なアルゴリズムとしては二分法とかニュートン法とかがあります.
とりあえず二分法が比較的簡単に実装できるのでおすすめします.

1Like

Comments

  1. @Shau00n

    Questioner

    ご回答ありがとうございます。
    「lcl から pmv を計算する式」を使って,
    「pmv がほぼ 0 になるような lcl の値」を探すという、発想の転換のような方法を
    教えていただきありがとうございます。
    に分記法などがあるということは知識として知っていましたが、書き換える方法を探していたため、完全に頭から抜け落ちていました。
    この度はご回答ありがとうございます。

Your answer might help someone💌