ONLY DO WHAT ONLY YOU CAN DO

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

VB.NET で非線形方程式を解く (2分法)

非線形方程式の解法(2分法)を利用して2の平方根を求める

f:id:fornext1119:20140531160605p:plain
1. まず, 条件 a < b, f(a) < 0, f(b) > 0 を満たす点 a, b を考えると,
関数 f(x) の解は, 区間 (a,b) の中に存在する.
2. 次に, 区間 (a,b) の中点 c = (a + b) / 2 を考えると,
f(c) < 0 であれば, 解は区間 (c,b) の中に存在し,
同様に, f(c) > 0 であれば, 区間 (a,c) の中に存在する.
3. この作業を繰り返して, 区間を絞り込んで行くことで解を求める.

※ちなみに, 区間 (a,b) とは, 両端を含まない数の集合で, 開区間という
 (a, b) = \{x | a < x < b\}
また, 両端を含む数の集合は, 閉区間という
 [a, b] = \{x | a ≤ x ≤ b\}

Option Explicit

Module VB0901
    Public Sub Main()

        Dim a As Double = 1.0
        Dim b As Double = 2.0
        Dim c As Double

        Do While(True)
            '区間 (a, b) の中点 c = (a + b) / 2
            c = (a + b) / 2
            Console.WriteLine(String.Format("{0,12:F10}{3}{1,12:F10}{3}{2,12:F10}", a, b, c, vbTab))

            Dim fc As Double = f(c)
            If Math.Abs(fc) < 0.0000000001 Then Exit Do
          
            If fc < 0 Then
                'f(c) < 0 であれば, 解は区間 (c, b) の中に存在
                a = c
            Else
                'f(c) > 0 であれば, 解は区間 (a, c) の中に存在
                b = c
            End If
        Loop

        Console.WriteLine(string.Format("{0,12:F10}{2}{1,12:F10}", c, Math.Sqrt(2), vbTab))
    End Sub

    Private Function f(ByVal x As Double) As Double
        Return x * x - 2.0
    End Function
End Module
1.0000000000    2.0000000000    1.5000000000
1.0000000000    1.5000000000    1.2500000000
1.2500000000    1.5000000000    1.3750000000
1.3750000000    1.5000000000    1.4375000000
1.3750000000    1.4375000000    1.4062500000
1.4062500000    1.4375000000    1.4218750000
1.4062500000    1.4218750000    1.4140625000
1.4140625000    1.4218750000    1.4179687500
1.4140625000    1.4179687500    1.4160156250
1.4140625000    1.4160156250    1.4150390625
1.4140625000    1.4150390625    1.4145507813
1.4140625000    1.4145507813    1.4143066406
1.4140625000    1.4143066406    1.4141845703
1.4141845703    1.4143066406    1.4142456055
1.4141845703    1.4142456055    1.4142150879
1.4141845703    1.4142150879    1.4141998291
1.4141998291    1.4142150879    1.4142074585
1.4142074585    1.4142150879    1.4142112732
1.4142112732    1.4142150879    1.4142131805
1.4142131805    1.4142150879    1.4142141342
1.4142131805    1.4142141342    1.4142136574
1.4142131805    1.4142136574    1.4142134190
1.4142134190    1.4142136574    1.4142135382
1.4142135382    1.4142136574    1.4142135978
1.4142135382    1.4142135978    1.4142135680
1.4142135382    1.4142135680    1.4142135531
1.4142135531    1.4142135680    1.4142135605
1.4142135605    1.4142135680    1.4142135642
1.4142135605    1.4142135642    1.4142135624
1.4142135624    1.4142135624
参考文献