'===========================================================
'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
|