7. 非線形方程式 (1変数)

XLPackによる1変数の非線形方程式の解き方 (一般の非線形関数のゼロ点の求め方) の例を示します。

例題

次の方程式を解く。

    f(x) = x3 - 2x - 5 = 0

f(x) の形を確認するためにグラフを描いてみます。

07-01

ゼロ点は x=2 付近にあることがわかるので、ゼロ点を挟む区間として [1, 3] を採用することにします。

VBAプログラムを使用した解き方 (1)

VBAサブルーチンDfzeroを使ったプログラム例を示します。

Function F(X As Double) As Double
    F = X ^ 3 - 2 * X - 5
End Function

Sub Start()
    Dim Ax As Double, Bx As Double, Rx As Double, Re As Double, Ae As Double, Info As Long
    '--- Input data
    Ax = 1
    Bx = 3
    Rx = Ax
    Re = 0.000000000000001 '1e-15
    Ae = Re
    '--- Compute zero of equation
    Call Dfzero(AddressOf F, Ax, Bx, Rx, Re, Ae, Info)
    '--- Output zero
    MsgBox Str(Ax) & " (Info = " & Str(Info) & ")"
End Sub

目的関数を外部関数として用意し、区間と要求精度を指定して呼び出すだけで簡単に使うことができます。ただし、確実にゼロ点を挟む区間を与えるように注意が必要です。

このプログラムを実行すると、X = 2.0945514815 が得られました。

VBAプログラムを使用した解き方 (2)

リバースコミュニケーション版のVBAサブルーチンDfzero_rを使ったプログラム例を示します。

Sub Start()
    Dim Ax As Double, Bx As Double, Rx As Double, Re As Double, Ae As Double, Info As Long
    Dim XX As Double, YY As Double, IRev As Long
    '--- Input data
    Ax = 1
    Bx = 3
    Rx = Ax
    Re = 0.000000000000001 '1e-15
    Ae = Re
    '--- Compute zero of equation
    IRev = 0
    Do
        Call Dfzero_r(Ax, Bx, Rx, Re, Ae, Info, XX, YY, IRev)
        If IRev <> 0 Then YY = XX ^ 3 - 2 * XX - 5
    Loop While IRev <> 0
    '--- Output zero
    MsgBox Str(Ax) & " (Info = " & Str(Info) & ")"
End Sub

目的関数を外部関数として与えるのではなく、IRev = 1のときにXXの値を使って関数値を計算しYYに入れて再度Dfzero_rを呼び出します。リバースコミュニケーション版の詳細についてはこちらを参照してください。

このプログラムを実行すると上と同じ結果が得られます。

Top