[VBA] ニュートン・ラフソン法による方程式の近似解の求め方

ニュートン・ラフソン法

 高次方程式 $f(x)=0$ の近似解を求めるときには ニュートン・ラフソン法 がよく用いられます。

 Excel VBA ニュートン・ラフソン法による方程式の数値解

 上の図のように適当な初期値 $x_0$ を与えます。
 このとき $A(x_0,f(x_0))$ に接線を引いて、$x$ 軸と交わる点を $x_1$ とします。
 すると $A$ 点における接線の勾配は
 
\[f '(x_0)=\frac{f(x_0)}{x_0-x_1}\]
と表すことができます。これを変形すると
 
\[x_1=x_0-\frac{f(x_0)}{f '(x_0)}\]
というように $x$ 軸との交点の座標が求まります。今度は $B(x_1,f(x_1))$ に接線を引いて $x$ 軸と交わる点を $x_2$ とすると、$x$ 軸との交点の座標は
 
\[x_2=x_1-\frac{f(x_1)}{f '(x_1)}\]
で与えられます。これを繰り返すと交点は $f(x)=0$ の解に近づいていきます。一般に $n+1$ 回目の解は
 
\[x_{n+1}=x_n-\frac{f(x_n)}{f '(x_n)}\]
で表されますが、$|x_{n+1}-x_n|$ があらかじめ定めた収束判定定数 EPS より小さくなったところで計算を打ち切り、そのときの $x_{n+1}$ を方程式の近似解とします。
 

ニュートン・ラフソン法で 2 次方程式を解きます

 $x^2-2x-3=0$ の近似解をニュートン・ラフソン法で計算するマクロです。

 'ニュートン・ラフソン法

 Sub NewtonA()

 Dim eps As Double
 Dim x0 As Double
 Dim xn As Double
 Dim k As Integer

 '初期値

 x0 = InputBox("初期値を入力してください")

 '収束判定定数

 eps = 0.001

 '|sn-s0|が eps より大きい間は処理を繰り返します

 Do While Abs(xn - x0) > eps And k < 100

 k = k + 1

 xn = x0

 x0 = xn - (xn ^ 2 - 2 * xn - 3) / (2 * xn - 2)

 Loop

 If k < 100 Then
 MsgBox xn

 Else
 MsgBox "解はみつかりませんでした"

 End If

 End Sub

 実行すると初期値の入力が促されるので「 5 」を入れてみると

3.00060975609756

という近似解が表示されます(真の解は $x=3$)。初期値を「 -5 」とすると、もう 1 つの解

-1.00006103608759

が得られます。eps の値を小さくするほど精度が上がります。

Do While Abs(xn - x0) > eps And k < 100

の "And k < 100" は安全装置で、ループの中でカウント数 k を 1 つずつ増やして k が 100 になっても解がみつからない場合は繰り返し処理を停止させます(無限ループを回避します)。試しに

x0 = xn - (xn ^ 2 - 2 * xn - 3) / (2 * xn - 2)

の部分を

x0 = xn - (xn ^ 2 + 1) / (2 * xn)

に変えて実行してみてください。これは $x^2+1=0$ の解を求めさせようとするものですが、当然実数範囲に解はないので処理を途中でやめて

解はみつかりませんでした

というメッセージが表示されます。 ≫ VBA 数値計算

スポンサーリンク
スポンサーリンク
末尾広告
末尾広告

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください