「スプライン補間」の編集履歴(バックアップ)一覧はこちら

スプライン補間」(2010/02/17 (水) 12:15:43) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

#asciiart(blockquote){ #N88BASIC /*********************************************************** spline.c -- スプライン補間 ***********************************************************/ /* 非周期関数用 */ Const N = 5 Dim x[ELM(N)] = [ 0, 10, 20, 30, 40 ] As Double Dim y[ELM(N)] = [ 610.66, 1227.4, 2338.1, 4244.9, 7381.2 ] As Double Dim z[ELM(N)] As Double Dim h[ELM(N)] As Double, d[ELM(N)] As Double'static Sub maketable(x As *Double, y As *Double, z As *Double) Dim i As Long Dim t As Double z[0] = 0: z[N - 1] = 0 /* 両端点での y''(x) / 6 */ For i=0 To N-2 h[i ] = x[i + 1] - x[i] d[i + 1] = (y[i + 1] - y[i]) / h[i] Next z[1] = d[2] - d[1] - h[0] * z[0] d[1] = 2 * (x[2] - x[0]) For i = 1 To N - 3 t = h[i] / d[i] z[i + 1] = d[i + 2] - d[i + 1] - z[i] * t d[i + 1] = 2 * (x[i + 2] - x[i]) - h[i] * t Next z[N - 2] = z[N - 2] - h[N - 2] * z[N - 1] For i = N - 2 To 1 Step -1 z[i] = (z[i] - h[i] * z[i + 1]) / d[i] Next End Sub Function spline(t As Double, x As *Double, y As *Double, z As *Double) As Double Dim i As Long, j As Long, k As Long Dim d As Double, h As Double i = 0: j = N - 1 While i < j k = (i + j) / 2 If x[k] < t Then i = k + 1 Else j = k Wend If i > 0 Then i=i-1 h = x[i + 1] - x[i]: d = t - x[i] spline = (((z[i + 1] - z[i]) * d / h + z[i] * 3) * d _ + ((y[i + 1] - y[i]) / h _ - (z[i] * 2 + z[i + 1]) * h)) * d + y[i] End Function 'main Dim i As Long maketable(x, y, z) For i = 10 To 30 Print i, spline(i,x,y,z) Next }

表示オプション

横に並べて表示:
変化行の前後のみ表示: