戻る

クラスモジュールを利用してシンプルなコードを書く

今回は、クラスモジュールを利用して、コードをシンプルにしてみた。
例として、化学での気体の状態方程式で、気体の密度を計算してみた。
気体の密度は、化学便覧に載っているPVTの圧縮係数Zから求めた密度を実測値として、実在気体の状態方程式SRK式を利用して、密度の計算値を求めた。
SRK式に関しては、リンクを参照してください。
今回は、方程式の根を求めるのに、二分法を利用しました。

SRK式のクラスモジュール リスト名(csrk
Option Explicit

Dim p As Double, pc As Double
Dim t As Double, tc As Double
Dim w As Double, m As Double

Const r = 0.08206

Public Function mi()

mi = 0.48 + 1.574 * w - 0.176 * w ^ 2#

End Function

Public Function alfai()
Dim aa As Double

        aa = mi() * (1 - (t / tc) ^ 0.5) + 1#
        alfai = aa ^ 2#

End Function

Public Function alfaci()

      alfaci = 0.42747 * r ^ 2# * tc ^ 2# / pc

End Function

Public Function ai()

ai = alfaci * alfai


End Function

Public Function bi()

 bi = 0.08664 * r * tc / pc
 
End Function

Public Function f(v As Double) As Double

f = p * (v ^ 3#) - r * t * (v ^ 2#) + (-p * (bi() ^ 2#) - r * t * bi() + ai()) * v - ai() * bi()

End Function


Public Function nibun(pp As Double, tt As Double) As Double

Dim va As Double, vb As Double, vc As Double
Dim zmin As Double, zmax As Double

Const e = 0.0000000001



zmin = 0.000001
zmax = 15

p = pp
t = tt

va = zmin * r * t / p
vb = zmax * r * t / p

If (f(va) * f(vb) > 0) Then

nibun = 0

Exit Function

End If

Do While True

    vc = (va + vb) / 2

    If (f(va) * f(vc) < 0) Then

        If Abs((va - vc) / vc) < e Then

            Exit Do

        Else

            vb = vc

        End If

    Else

        If Abs((vb - vc) / vc) < e Then

            Exit Do

        Else

            va = vc

        End If

    End If

Loop


nibun = 1 / vc * m




End Function


Public Property Get ppc() As Double

ppc = pc

End Property

Public Property Let ppc(ByVal vNewValue As Double)

pc = vNewValue

End Property

Public Property Get ttc() As Double

ttc = tc

End Property

Public Property Let ttc(ByVal vNewValue As Double)

tc = vNewValue

End Property

Public Property Get ww() As Double

ww = w

End Property

Public Property Let ww(ByVal vNewValue As Double)

w = vNewValue

End Property

Public Property Get mm() As Double

mm = m


End Property

Public Property Let mm(ByVal vNewValue As Double)

m = vNewValue

End Property

クラスモジュールを利用するための標準モジュールのリスト
Option Explicit

Const r = 0.08206
Const mpa = 0.101325

Public Function srk(p As Double, t As Double, pc As Double, tc As Double, m As Double, w As Double) As Double

Dim a As New csrk

a.ppc = pc
a.ttc = tc

a.mm = m
a.ww = w

p = p / mpa

srk = a.nibun(p, t)


End Function


Public Function realgas(p As Double, t As Double, m As Double, z As Double) As Double

p = p / mpa

realgas = p * m / z / r / t


End Function

Public Function gosa(s As Double, d As Double) As Double

gosa = (d - s) / s * 100

End Function

見ても解るように、標準モジュールに全部書いても、書けない事ないです。
でも、個人的には、SRK式をクラスモジュールにした方が簡潔になると思います。
計算は、プロパン、二酸化炭素、水素、窒素、アンモニア、酸素に関して、計算してみました。
計算結果は、以下の物性値を利用しました。
計算結果のZのテーブルの黄色い部分は、圧縮係数が0.5以下を意味して、
相対誤差の赤い部分は、相対誤差−5%より小さいかか5以上%の所を意味します。
計算結果 分子量 臨界圧力(atm) 臨界温度(K) 偏心係数 コメント
プロパン 44.10 42.0 370.0 0.152 圧縮係数が黄色い所と相対誤差の赤い所大体同じ所にあるみたいでした。
結構高圧でも-5%より大きい所があった
二酸化炭素 44.01 72.9 304.1 0.225 プロパンと同様に、圧縮係数と相対誤差の大きさに同じような所があった
水素 2.016 12.8 33.3 -0.22 水素は、全体的に、圧縮係数が1に近いせいか相対誤差は、全般的に
小さい値になりました。10%位の誤差が認められ場合は、
理想気体の状態方程式でも問題なく適用できそうです。
窒素 28.01 33.5 126.2 0.04 全体的に、相対誤差は、あまりないみたいです。
アンモニア 17.03 111.3 405.5 0.25 低温、高圧では、かなり、誤差が出ました。圧縮係数も0.5以下の
範囲も広く、SRK式を利用するときは、注意が必要みたいです。
酸素 32 49.7 154.4 0.021 黄色の部分も多いのですが、赤い部分は、結構少ないです。
常温では、少ない誤差で、利用できそうです。