ニュートン法 その2
前回お話したニュートン法を,EXCELで利用するためのVBAモジュールについてお話します
EXCELにはゴールシーク等数値解を探索するツールもあるんですがちょっと使いにくいので・・・('A`)
newton.xls
【書式】
= newton(expr, a)
expr : 数式(文字列)
a : 初期値(Double)
- 非線形方程式 expr = 0 の解をニュートン法で一次探索し,得られた数値解を返します
- exprはxの関数として表現して下さい
- 数値解は初期値aに依存します
- 所定の探索回数(imax=1000)で収束しなかった場合は 10^99 を返します
- 数式を直接記入する場合は,数式を""で囲んで下さい(他セルから参照させる場合は不要です)
【入力例】
F列 : 解きたい非線形方程式を入力( = 0 は省略)
a列 : 初期値を入力
x列 : "=newton(F列, a列)"を入力,返値は数値解
F(x)列 : "=f(F列, x列), "を入力,返値は数値解における残差
入力例の3つとも残差がほぼ0となっているため,十分な精度の数値解が得られていることが解ります
※標準モジュールに下記を追加し,マクロを有効にして下さい
Function newton(expr As String, a As Double) As Double Dim i, imax As Integer Dim eps, Xnew, X As Double imax = 1000 eps = 10 ^ -6 X = a For i = 1 To imax Xnew = X - f(expr, X) / df(expr, X) If (Abs(Xnew - X) < eps * a) Then Exit For X = Xnew Next i If (i = imax) Then Xnew = 10 ^ 99 newton = Xnew End Function Function f(expr, X As Double) As Double f = Evaluate(Replace(expr, "x", X)) End Function Function df(expr, X As Double) As Double dx = X * 10 ^ -4 df = (f(expr, X + dx) - f(expr, X)) / dx End Function