日記として残しておきたくて書きます。
年末から正月にかけて勉強していたベッセル関数・Γ(ガンマ)関数。
地震時,水の入った水槽の側面・底面に作用する動水圧を求める
速度ポテンシャル法による式に用います。
まだ,奥が深くてこの式による答えが出ていません。
ネット検索でVBによるソースプログラムがありました。
これをEXCELのVBAに書き換えたかったのですが途中になっています。
式とVBの抜粋です。
詳しくは ”ホームページ WANtaroHP”をご覧下さい。
Pow:POWER関数 CDbl:CDBL関数 FIはfloor関数でなく上記式Fi値 rbh=r/Hの記述は必要ないか?
ここまでの変数宣言等は省略
NN = 30
dz = 0.5
z = -dz
Do
z = z + dz 'サージタンク底面からの距離
sum = 0.0
For i = 0 To NN
lambda = (2.0 * CDbl(i) + 1.0) / 2.0 * Math.PI
sum = sum + Math.Pow(-1.0, CDbl(i)) / lambda * FI(r / H, lambda) * Math.Cos(lambda * z / H)
Next i
'地震時動水圧強度(速度ポテンシャル)
pp = gamma * kh * r * Math.Cos(theta) * sum
Private Function FI(ByVal rbh As Double, ByVal lambda As Double) As Double
Dim frbh As Double
frbh = 2.0 / rbh * FMBF(1, lambda * rbh) / (lambda * FMBF(0, lambda * rbh) - FMBF(1, lambda * rbh) / rbh)
Return frbh
End Function
Private Function FMBF(ByVal nu As Integer, ByVal z As Double) As Double
'第1種変形Bessel関数
Dim sum As Double
Dim i As Integer
sum = 0.0
For i = 0 To NN
sum = sum + 1.0 / GAMMAF(CDbl(i + 1)) / GAMMAF(CDbl(nu + i + 1)) * Math.Pow(0.5 * z, CDbl(2 * i))
Next i
Return Math.Pow(0.5 * z, CDbl(nu)) * sum
End Function
Private Function GAMMAF(ByVal z As Double) As Double
'ガンマ関数
Dim a As Double
a = z / Math.E * Math.Sqrt(z * Math.Sinh(1.0 / z) + 1.0 / 810.0 / Math.Pow(z, 6.0))
Return Math.Sqrt(2.0 * Math.PI / z) * Math.Pow(a, z)
End Function