VB.NETで関数の近似(ラグランジュ補間)


をラグランジュ補間で近似する
n+1個の点 (x0, y0), (x1, y1) … (xn, yn)
が与えられているとき, これらすべての点を通る n次式は次のように表すことができる.

この式を使って, 与えられた点以外の点の値を求める.
Module VB0701
Private Const N As Integer = 5 'データ点の数
Public Sub Main()
Dim x(N) As Double
Dim y(N) As Double
'0.25刻みで -0.5〜0.5 まで, 5点だけ値をセット
For i As Integer = 0 To (N - 1)
Dim d As Double = i * 0.25 - 0.5
x(i) = d
y(i) = f(d)
Next
'0.05刻みで 与えられていない値を補間
For i As Integer = 0 To 20
Dim d As Double = i * 0.05 - 0.5
Dim d1 As Double = lagrange(d, x, y)
Dim d2 As Double = f(d)
'元の関数と比較
Console.WriteLine(string.Format("{0,5:F2}: {1,8:F5} - {2,8:F5} = {3,8:F5}", d, d1, d2, d1 - d2))
Next
End Sub
'元の関数
Private Function f(ByVal x As Double) As Double
Return 4 * Math.Pow(x,4) + 3 * Math.Pow(x,3) - 2 * Math.Pow(x,2) - x + 1
End Function
'Lagrange (ラグランジュ) 補間
Private Function lagrange(ByVal d As Double, ByVal x() As Double, ByVal y() As Double) As Double
Dim sum As Double = 0
For i As Integer = 0 To (N - 1)
Dim prod As Double = y(i)
For j As Integer = 0 To (N - 1)
If j <> i Then
prod *= (d - x(j)) / (x(i) - x(j))
End If
Next
sum += prod
Next
Return sum
End Function
End Module
Z:\>vbc -nologo VB0701.vb Z:\>VB0701 -0.50: 0.87500 - 0.87500 = 0.00000 -0.45: 0.93565 - 0.93565 = 0.00000 -0.40: 0.99040 - 0.99040 = 0.00000 -0.35: 1.03640 - 1.03640 = 0.00000 -0.30: 1.07140 - 1.07140 = 0.00000 -0.25: 1.09375 - 1.09375 = 0.00000 -0.20: 1.10240 - 1.10240 = 0.00000 -0.15: 1.09690 - 1.09690 = 0.00000 -0.10: 1.07740 - 1.07740 = 0.00000 -0.05: 1.04465 - 1.04465 = 0.00000 0.00: 1.00000 - 1.00000 = 0.00000 0.05: 0.94540 - 0.94540 = 0.00000 0.10: 0.88340 - 0.88340 = 0.00000 0.15: 0.81715 - 0.81715 = 0.00000 0.20: 0.75040 - 0.75040 = 0.00000 0.25: 0.68750 - 0.68750 = 0.00000 0.30: 0.63340 - 0.63340 = 0.00000 0.35: 0.59365 - 0.59365 = 0.00000 0.40: 0.57440 - 0.57440 = 0.00000 0.45: 0.58240 - 0.58240 = 0.00000 0.50: 0.62500 - 0.62500 = 0.00000
参考文献