Translate

2011/09/15

TRNSYSのプログラム的な側面


TRNSYSでBuilding Projectを選らんで新規に作ったプロジェクトを見てたら、Equationの一部にこんな式が含まれていました。

IT_H_0_0 = Max(Input4,0)
IB_H_0_0 = Max(Input5,0)

受け取った入力値と"0"で最大値を取っている、つまり0以下の値は0にまとめちゃってるわけですが、何のために?

Input4と5を辿っていくと、どちらも日射量関係の値。普通に考えればマイナスの値はないはずなのに?なぞは深まるばかり。

しばらく考えてて気が付いたんですが、TRNSYSもプログラムなので実数値の計算誤差はつきもの。小数点以下の小さい値で微妙な誤差が発生するときがまれにあります。プログラムを作った経験のある方だと、ああ、あれかと思える話ですが、理屈の上じゃマイナスにならないはずでも誤差がでることがあります。

よくある例はこんなの。0.1を10回足してみる。ちびっこでも解けそうな計算ですが、実際にEquationで書いてみると。。。

ten = 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1

答え:"+9.9999999999999989E-01"
(普通の十進表記に直すと"0.99999999999999989")

てな具合に小数点以下10数桁目で微小な誤差がでます。

話を戻すと、普通はプログラムで誤差が出るようならキャップを掛けるような処理を入れるんですが、どうも用心のために入れているようです。

上記のようにEquationで計算するときも、同じようなケースがあてはまります。計算上変な値がでるんだけど、って時にはMaxを使って誤差分を修正する方法が役に立ちます。
(そもそも計算式が間違ってないことを確認してからの対策ですけどね)

ちなみに値が0から1になる計算であれば"Min(Max(val,0),1)"というようにまとめて書くと一回で済みます。





0 件のコメント:

コメントを投稿