VBAで微小振幅波の波長計算のためのプロシージャ作成と実行

プログラミングの勉強

 VBAで微小振幅波の波長の繰り返し収束計算の定式化で示した定式化に基づいて、プロシージャを作成して実行します。ゴールシークを用いた繰り返し計算を実施するよりも、確実に収束し、計算時間も圧倒的に少なくなります。

 なお、以下に示す内容は、Excel2013VBAで作成実行させたもので、他のバージョンでの確認はしていませんのでご注意ください。

プロシージャの計算手順

  1. 各サブルーチンで共通に使用する変数を定義
  2. メインプログラムからサブルーチンとしてSub 入力、Sub 波長計算を指定
  3. Sub 入力()にて定数の入力と、Excel上のデータを読み込み、各変数に入力
  4. Sub 波長計算()にて、長波の波長を計算。ただし、十分長波の領域にある場合(X(0)≧50)には、 解をX(0)とおいて終了
  5. 定式化で示した繰り返し計算を実行して、収束条件を満たせば、Excelシートに数値を書き込んで終了

なお、プロシージャの書き方、変数の定義、Excelシート上からの数値の読み込み・書き込み等の基本的な部分について知りたい方は、次の記事を参考にしてください。                          → VBAで鋼管杭の断面諸元計算を実行する!

収束計算の定式化については、次の記事で説明しています。                        → VBAで微小振幅波の波長の繰り返し収束計算の定式化

 今回は、つぎのようにプロシージャを書いています。

プロシージャの内容

 プロシージャの内容を以下に示しますので、勉強や確認のためにModuleにコピーして実行していただいて結構です(※ただし、計算結果を保証するものではありませんので、その点はご注意ください)。

Option Explicit
Dim H0, T0, TDL, SBL, DWL, WLG, L0, g, pi As Double
-----------------------------------------------------------------
Sub メインプログラム()
    Call 入力
    Call 波長計算
End Sub
-----------------------------------------------------------------
Sub 入力()
    g = 9.8
    pi = 3.14159265359
    H0 = Range("C3").Value
    T0 = Range("C4").Value
    TDL = Range("C5").Value
    SBL = Range("C6").Value
    DWL = TDL - SBL
    Range("C7").Value = DWL
    If T0 <= 0# Then
        MsgBox "周期が0.0以下です。計算を終了します。", vbOKOnly
        End
    End If
    If DWL <= 0# Then
        MsgBox "水深が0.0以下です。計算を終了します。", vbOKOnly
        End
    End If
End Sub
------------------------------------------------------------------
Sub 波長計算()
  Dim A, X(2), Th, Sh As Double
  Dim i As Integer
  L0 = g / 2# / pi * T0 * T0
  A = 2# * pi * DWL
  X(0) = A / L0
  If X(0) >= 50 Then
      WLG = L0
      Range("C8").Value = WLG
      Exit Sub
  End If
  X(1) = X(0)
  For i = 0 To 100
      Th = WorksheetFunction.Tanh(X(1))
      Sh = WorksheetFunction.Sinh(X(1))
      X(2) = X(1) - (X(1) - X(0) / Th) / (1 + X(0) / Sh ^ 2)
  If Abs(1 - X(1) / X(2)) <= 0.001 Then
      WLG = A / X(2)
      Range("C8").Value = WLG
      Exit Sub
  Else
      X(1) = X(2)
  End If
  Next i
      MsgBox "波長計算が収束しません。計算を終了します。", vbOKOnly
     End
End Sub

 以下、今回のプロシージャ内で使用している関数について、説明を加えます。

sinh tanh関数

sinh、tanh関数は、VBAではつぎのように記入します。Excelシート上での関数利用より面倒くさいですね。
WorksheetFunction.Sinh(数値)
WorksheetFunction.Tanh(数値)

MsgBox関数 メッセージボックス

MsgBox “表示する文言,表示させるボタン

表示させるボタンには、
 vbOKOnly  [OK]ボタンのみ表示
 vbOKCancel [OK]ボタンと[キャンセル]ボタンを表示
等のように表示させるボタンが決まっており、どのボタンを押したかによって値(0とか1など)を返します。

 ただし、ここでは入力ミスや計算が収束しなかった事を知らせることを目的に使用していますので、[OK]ボタンのみを表示させ、計算を終了させています。

 たとえば、設計周期に0.00sを入力して、プロシージャを実行すると、下図のようなメッセージボックスが表示され、[OK]ボタンを押すとプロシージャの実行が終了します。(メッセージボックスの[×]を押しても同様)

プロシージャの実行

設計波高、設計周期、潮位、海底地盤高を入れて、プロシージャを実行させます。

結果は下図のようにEXcelシート上に書き込まれます。今回の定式化では、繰り返し回数が数回でほぼ収束します。

また、ゴールシークを用いた繰り返し計算を実施するよりも、確実に収束が可能で、計算時間も圧倒的に少なくて済みます。

少しでも皆さんの参考になれば幸いです。

なお、同様の計算をPythonで実行してみました。興味がある方は、Pythonで微小振幅波の波長を繰り返し収束計算してみた!のページへどうぞ。

コメント

タイトルとURLをコピーしました