ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

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
参考文献