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

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

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

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

 'フレネル正弦積分 (C)BlogCat

 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

 'フレネル余弦積分 (C)BlogCat

 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$ の積分を計算するマクロも載せておきます。

 '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

 '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関数と ICN関数をワークシートで使用するときは

=ISN(x,n)
=ICN(x,n)

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

 VBA ISN関数とICN関数
 ≫ VBA 数値計算メニュー

スポンサーリンク
末尾広告
末尾広告

コメントをどうぞ

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください