| クラスモジュールを利用してシンプルなコードを書く | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 今回は、クラスモジュールを利用して、コードをシンプルにしてみた。 例として、化学での気体の状態方程式で、気体の密度を計算してみた。 気体の密度は、化学便覧に載っている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以上%の所を意味します。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||