§Algorithm§


☆ニュートン法☆

 ニュートン法を用いても非線形方程式を解くことができますが、 一般的に二等分割法よりも解を得る収束が早いといわれています。 二等分割法のように求める解を挟まなくて良いので、 より柔軟な計算がおこなえます。  しかし、1部分で割り算を用いていることから、0除算,0に限りなく近い値 の除算→オーバーフローがエラーとして考えられ、そのための工夫が必要 となってきます。  また、次の数学的知識も必要です。

非線形方程式 y(x) の (a,y(a)) における接線の傾きは、
y(x) をxで微分したy'(x) に、x=a を代入した値である。

 例えば、 y = x^3 + x - 5
の点 (2,5) における接線の傾きは、
y'=3x^2 + 1 より 傾き m = 3 * (2)^2 + 1 = 13
となります。

このように微分を用いるので、微分が困難な方程式では二等分割法を用います。 このことを理解された上で、下のコードをご覧いただければ幸いです。


 二等分割法と同様に、非線形方程式の実数解は、非線形図形 y=f(x) における x 軸との交点と考えることができます。  まず、実数解と予想される値に近い値を x=x0 として、その値に対しての y=y0 値を求めます。そこで、(x0,y0) における接線の傾きを求め、その傾きと (x0,y0) の値から接線の切片を求め、接線の方程式が求まります。  次にその接線と x軸との交点を求め、この点を (x1,y1) として、また 同じように、この点における接線を求め・・・というようにしていくと、 y=0 に近い値で収束し、解が求まります。以下のコードでは、y の値を収束 の条件としており、その誤差範囲を引数 neZero により指定できるように してあります。
−注意−
下のコードではサンプルプログラムに合わせるために、y値の代入に 引数に指定された式データを用いていますが、実際はlogやCosやSinなどを用いた方程式も 多いかと思います。その都度、コードを変更してお使い下さい。

'===========================================================
'Newton   ニュートン法により、非線形方程式(多次方程式)を解く
'---------引数----------------------------------------------
'nc:次数
'cValue():式データ(cValue(0)=2,cValue(1)=1の場合、2+x^2=0)
'limit:ループ回数の限界値
'neZero:解はy=0の時であるが、
'        それをAbs(y)<Abs(neZero)にすること
'nearX:求める解に近いxの値
'---------戻り値--------------------------------------------
'解を返すが、解が得られなかった時は0.0を返す。
'===========================================================
Public Function Newton(nc As Long, cValue() As Double, _
                     limit As Long, neZero As Double, _
                     nearX As Double) As Double
    Dim y As Double, y1 As Double '式のy値とその微分値y1
    '座標(nearX,y)におけるyの接戦の傾きmと切片b
    Dim dx As Double, m As Double, b As Double
    Dim i As Long, j As Long 'カウンタ
    Dim errorValue As Double

    errorValue = 0.00001 '傾きmの除算によるオーバーフロー除け
    i = 0& '初期化
    For i = 0& To limit - 1&
        y = 0#: y1 = 0# '初期化
        '引数に指定された式データからy値とその微分値y1を求める
        For j = 0& To nc
            y = y + cValue(j) * (nearX ^ j)
            If j <> 0# Then y1 = y1 + j * cValue(j) * _
                                 (nearX ^ (j - 1&))
        Next j
        '誤差の値以下ならそれを解とする
        If Abs(y) < Abs(neZero) Then
            Newton = nearX: Exit Function
        End If
        m = y1 'y1は、座標(nearX,y)におけるyの接戦の傾きm
        If Abs(m) < errorValue Then Exit Function
        b = y - m * nearX
        dx = (-b) / m
        nearX = dx '解である可能性の範囲を狭める
    Next i
    'このプロシージャでは、0.0 を解とするものをエラーと考える
    Newton = 0# '収束しなかった時
End Function

 この計算方法でも二等分割法と同様に、接線の傾きが0に近づいた場合や 重解をもつ(傾きが0)場合における処理が難しいものとなっています。


(サンプルプログラムの動作確認)

機種 PC-9821V13S
OS Windows95
開発ツール Visual Basic Ver.4.0
更新日 00/04/15

ダウンロード Newton.lzh(2.70KB)

Visual Basic Ver.5.0,Ver.6.0でも問題なく動作すると思います。
なお、このコーナーに掲載されているプログラムコード、およびプログラムファ イルが原因で起きた損害などに関して一切の責任を負うことはできません。

★このコーナーに掲載されているプログラムコード、およびプログラムファ イルを無断で配布・転載することは、原則として禁止です。


Algorithmインデックス トップ


Copyright(C)2000 Tomoya. All rights reserved.