これはエクセルVBAのプログラムです。 これを走らせると、表に、座標データが出力されますので、それを、散布図でグラフ化すれば曲線が見られます。 -------------------------------------------------------------------------------- '**************************** 'クロソイド曲線を描く ' 2005.5.11 崩彦 '**************************** Option Explicit '変数宣言を強制 Const Pi = 3.14159265358979 '円周率πを定数宣言 Sub clothoid() '----------変数宣言------------------------------------------------------------------ Dim x As Double, y As Double 'グラフの座標 Dim a As Double, b As Double, h As Double 'a, b は積分範囲, h は分割区間幅 Dim div As Integer '積分範囲の分割数 Dim i As Integer 'ループ変数 Dim v As Double 'パラメーター(曲線の長さに対応) Dim n As Integer 'vの分割数 Dim delta As Double 'vの増し分 Dim row As Integer 'シートに座標データを書き込むための行番号 '----------初期値-------------------------------------------------------------------- v = 5 'パラメーターvは5まで n = 1000 '曲線を1000に分割して伸ばしていく div = 1000 '積分区間の分割数は1000 a = 0 '積分区間の初期値 b = 0 '同上 row = 0 '行番号の初期値 '------------------------------------------------------------------------------------ delta = v / n For i = 1 To n b = b + delta '----------シンプソン則による数値積分-------------------------------------------- x = simpson(a, b, div, 0) y = simpson(a, b, div, 1) '-------------------------------------------------------------------------------- row = row + 1 Cells(row, 1).Value = x Cells(row, 2).Value = y Next i End Sub '----------------------------------------------------------------------------------- '引数:a, b は積分区間。m は積分区間の分割数。flag は被積分関数の切り替え用フラグ '----------------------------------------------------------------------------------- Function simpson(a As Double, b As Double, m As Integer, flag As Integer) As Double Dim d As Double, sum As Double Dim x As Double Dim i As Integer d = (b - a) / (2 * m) If (flag = 0) Then sum = f(a) For i = 1 To 2 * m - 1 x = a + i * d If (i Mod 2) = 0 Then sum = sum + 2 * f(x) Else sum = sum + 4 * f(x) End If Next i sum = sum + f(b) ElseIf (flag = 1) Then sum = g(a) For i = 1 To 2 * m - 1 x = a + i * d If (i Mod 2) = 0 Then sum = sum + 2 * g(x) Else sum = sum + 4 * g(x) End If Next i sum = sum + g(b) End If simpson = sum * d / 3 End Function ================================================================================ これは、上のプログラムを十進BASIC用に書き換えたものです。 「!」はREMですので、それ以降は実行時、無視されます。 !----------変数宣言------------------------------------------------------------------ ! Dim x As Double, y As Double 'グラフの座標 ! Dim a As Double, b As Double, h As Double 'a, b は積分範囲, h は分割区間幅 ! Dim div As Integer '積分範囲の分割数 ! Dim i As Integer 'ループ変数 ! Dim v As Double 'パラメーター(曲線の長さに対応) ! Dim n As Integer 'vの分割数 ! Dim delta As Double 'vの増し分 ! Dim row As Integer 'シートに座標データを書き込むための行番号 !------------------------------------------------------------------------------- DECLARE EXTERNAL FUNCTION simpson DECLARE EXTERNAL FUNCTION f DECLARE EXTERNAL FUNCTION g SET WINDOW -0.1, 1,-0.1, 1 SET POINT STYLE 1 DRAW AXES !'------------------------------------------------------------------------------------ LET v = 6 !'パラメーターvは6まで LET n = 1000 !'曲線を1000に分割して伸ばしていく LET div = 1000 !'積分区間の分割数は1000 LET a = 0 !'積分区間の初期値 LET b = 0 !'同上 !'------------------------------------------------------------------------------------ LET delta = v / n FOR i = 1 TO n LET b = b + delta !'----------シンプソン則による数値積分-------------------------------------------- LET x = simpson(a, b, div, 0) LET y = simpson(a, b, div, 1) !'-------------------------------------------------------------------------------- !PLOT POINTS:x, y PLOT LINES:x, y; NEXT i END !'----------------------------------------------------------------------------------- !'引数:a, b は積分区間。m は積分区間の分割数。flag は被積分関数の切り替え用フラグ !'----------------------------------------------------------------------------------- external Function simpson(a, b, m, flag) LET d = (b - a) / (2 * m) IF (flag = 0) THEN LET sum = f(a) FOR i = 1 TO 2 * m - 1 LET x = a + i * d IF (MOD(i , 2) ) = 0 THEN LET sum = sum + 2 * f(x) ELSE LET sum = sum + 4 * f(x) END IF NEXT i LET sum = sum + f(b) ELSEIF (flag = 1) THEN LET sum = g(a) FOR i = 1 TO 2 * m - 1 LET x = a + i * d IF MOD(i, 2) = 0 THEN LET sum = sum + 2 * g(x) ELSE LET sum = sum + 4 * g(x) END IF NEXT i LET sum = sum + g(b) END IF LET simpson = sum * d / 3 END FUNCTION !'----------被積分関数-------------------------------------------------------------------- EXTERNAL FUNCTION f(x) LET f = Cos((Pi * x * x) / 2) END FUNCTION EXTERNAL FUNCTION g(x) LET g = Sin((Pi * x * x) / 2) END FUNCTION ================================================================================