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

フレネル積分

 フレネル正弦積分 および フレネル余弦積分 は次のように定義されます。

\[\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}\]

 これらをまとめてフレネル積分とよびます。
 

フレネル積分を計算します

 シンプソンの公式を用いてフレネル積分を計算するユーザー定義関数です。

'VBA フレネル正弦積分

Function FS(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

  FS = s * h / 3

End Function

'VBA フレネル余弦積分

Function FC(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

  FC = s * h / 3

End Function

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

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

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

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

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

 ExcelVBAフレネル積分のグラフ
 

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

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

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

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

cosnx, sinnx の積分

 より一般的に $\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関数


 

コメントをどうぞ

メールアドレスが公開されることはありません。