[VBA] フレネル積分とクロソイド

 この記事では、VBA を用いてフレネル積分を計算し、そのデータをもとに、Excel のワークシートでグラフを描画します。

フレネル積分

 フレネル正弦積分およびフレネル余弦積分は次のように定義されます。
 
\[\begin{align*}\mathrm{S}\,(x)=\int_{0}^{x}\sin^2tdt\\[6pt]\mathrm{C}\,(x)=\int_{0}^{x}\cos^2tdt\end{align*}\tag{A}\]
 あるいは次のように定義される場合もあります。
 
\[\begin{align*}\mathrm{S}\,(x)=\int_{0}^{x}\sin\frac{\pi t^2}{2}dt\\[6pt]\mathrm{C}\,(x)=\int_{0}^{x}\cos\frac{\pi t^2}{2}dt\end{align*}\tag{B}\]
 これらをまとめて フレネル積分 (Fresnel integrals) とよびます。
 シンプソンの公式を用いてフレネル積分を計算するユーザー定義関数を実装します。

'[VBA] フレネル正弦積分

Function FRESNEL_S(x As Double, Optional t As Boolean = False) As Double

  Dim p As Double, q As Double, r As Double
  Dim h As Double, s As Double, d As Double
  Dim m As Integer, k As Integer

  m = 256
  h = x / (2 * m)
  d = 2 * Atn(1)
  s = 0

  If t = False Then

    For k = 0 To m - 1
      p = 2 * k * h
      q = (2 * k + 1) * h
      r = (2 * k + 2) * h
      s = s + Sin(p ^ 2) + 4 * Sin(q ^ 2) + Sin(r ^ 2)
    Next k

  Else

    For k = 0 To m - 1
      p = 2 * k * h
      q = (2 * k + 1) * h
      r = (2 * k + 2) * h
      s = s + Sin(d * p ^ 2) + 4 * Sin(d * q ^ 2) + Sin(d * r ^ 2)
    Next k

  End If

  FRESNEL_S = s * h / 3

End Function

'VBA フレネル余弦積分

Function FRESNEL_C(x As Double, _
Optional t As Boolean = False) As Double

  Dim p As Double, q As Double, r As Double
  Dim h As Double, s As Double, d As Double
  Dim m As Integer, k As Integer

  m = 256
  h = x / (2 * m)
  d = 2 * Atn(1)
  s = 0

  If t = False Then

    For k = 0 To m - 1
      p = 2 * k * h
      q = (2 * k + 1) * h
      r = (2 * k + 2) * h
      s = s + Cos(p ^ 2) + 4 * Cos(q ^ 2) + Cos(r ^ 2)
    Next k

  Else

    For k = 0 To m - 1
      p = 2 * k * h
      q = (2 * k + 1) * h
      r = (2 * k + 2) * h
      s = s + Cos(d * p ^ 2) + 4 * Cos(d * q ^ 2) + Cos(d * r ^ 2)
    Next k

  End If

  FRESNEL_C = s * h / 3

End Function

 FRESNEL_S関数をワークシートで使用するときは

=FRESNEL_S(x[,関数の種類])

と入力します。[関数の種類] に False か 0 を指定する、あるいは省略すると定義式 (A) で計算します。True または 1 を指定すると定義式 (B) で計算します。FRESNEL_C関数をワークシートで使用するときは

=FRESNEL_C(x[,関数の種類])

と入力してください。[関数の種類] に False か 0 を指定する、あるいは省略すると定義式 (A) で計算します。True または 1 を指定すると定義式 (B) で計算します。この関数を使ってワークシートにグラフを描くと次のようになります。

 ExcelVBAフレネル積分のグラフ

クロソイド(オイラーの螺旋)

 $t$ を媒介変数とした $(x(t),\:y(t))=(C(t),\:S(t))$ は非常に美しい曲線を描きます。

 Excelクロソイド(オイラーの螺旋)

 この曲線は クロソイド または オイラーの螺旋(オイラーのスパイラル)とよばれています。この曲線は光学の回折現象などを幾何学的に表現するために用いられましたが、近年ではその曲率変化の特性を生かして、高速道路のカーブの設計にも応用されています。

 より一般的に $\sin^nx$ と $\cos^n x$ の積分を計算するマクロも載せておきます。

'[VBA] sin^n(x)積分

Function ISN(x As Double, n As Integer) As Double

  Dim p As Double, q As Double, r As Double
  Dim h As Double, s As Double
  Dim m As Integer, k As Integer

  m = 512
  h = x / (2 * m)
  s = 0

  For k = 0 To m - 1
    p = 2 * k * h
    q = (2 * k + 1) * h
    r = (2 * k + 2) * h
    s = s + Sin(p ^ n) + 4 * Sin(q ^ n) + Sin(r ^ n)
  Next k

  ISN = s * h / 3

End Function

'VBA cos^n(x) 積分

Function ICN(x As Double, n As Integer) As Double

  Dim p As Double, q As Double, r As Double
  Dim h As Double, s As Double
  Dim m As Integer, k As Integer

  m = 512
  h = x / (2 * m)
  s = 0

  For k = 0 To m - 1
    p = 2 * k * h
    q = (2 * k + 1) * h
    r = (2 * k + 2) * h
    s = s + Cos(p ^ n) + 4 * Cos(q ^ n) + Cos(r ^ n)
  Next k

  ICN = s * h / 3

End Function

 ISN関数をワークシートで使用するときは

=ISN(x,n)

 ICN関数をワークシートで使用するときは

=ICN(x,n)

と入力します。x は任意の数値、n は整数を指定してください。この関数を用いて計算した $\sin^3x$ と $\cos^3x$ の 0 から $x$ までの積分は次のようなグラフになります。

 VBA ISN関数とICN関数

コメント