My portfolio

Menu▼

  • Top
  • About
  • Portfolio
  • Diary
  • Privacy policy
  • ExcelVbaを用いた数値解析-線形反復法とエイトケンのδ2乗法-

    概要-エクセルVBAによる非線形方程式の解法-

    非線形方程式の解を求めることは多くの分野において重要な問題の一つである。

    ここでは、非線形方程式の一種である線形反復法とAitkenのΔ2乗法の解説と、それらを行うためのプログラムをエクセルVBAで作成した。
    関連: ニュートン法による数値解析

    線形反復法

    方程式f(x)=0を変形しx=g(x)の形にすることができれば、方程式の解を漸化式の形で得ることができる。
    これを利用した方法を線形反復法(Linear interation)といい、式1-1の様な方法で解を得ることができる。

    線形反復法

    線形反復法の収束条件

    線形反復法で解を得るためには上式1-1が収束する必要がある。ここではそのための条件を述べる。

    方程式の解がx=αの時、α=g(α)と書くことができる。
    式1-1からこれを引くと式1-2になる。

    収束条件の式

    ここで、式1-2の右辺に平均値の定理を使うと、式1-3が得られる。

    収束条件の式

    次に式1-3の右辺にあるg’(x)の絶対値の最大値をKとする。(式1-4)

    絶対値

    式1-4に式1-3の絶対値を取ったものに代入すると式1-5が得られる。

    収束条件の式

    以上より、K<1の時に線形反復法は収束するとわかる。

    VBAによる線形反復法プログラム

    今回は方程式x 2-x-2=0の解を線形反復法により求めた。(下記コード)
    これを変形しx=x 2 -2と変形し、xの初期値を3(x 0=3)とし、これに式1-1を適用して解を求めた。

    Option Explicit Private x As Double '次のxを求める 収束した場合trueを返す 'これを外部から呼び出すことにより近似解を求める Public Function NextStep() As Boolean NextStep = False Dim nextX As Double nextX = 1 + (2 / x) If Abs(nextX - x) < 0.00001 Then NextStep = True End If x = nextX End Function Public Property Let x0(x0 As Double) x = x0 End Property Public Property Get x0() As Double x0 = x End Property

    上記プログラムを実行すると、17回の反復で収束し解の1つであるx=2に近い値を得ることができた。

    AitkenのΔ2乗法

    式1-6からわかるようにK≒1の時、収束の速度は遅い。
    AitkenのΔ2乗法を用いると収束を加速させることができる。

    Kを定数と見なし式1-2を用いると式2-1の2式が得られる。

    エイトケンのδ2乗法

    上式を用いると、αの近似値が得られる(式2-2)。

    エイトケンのδ2乗法

    上式のαををx i+3の近似値と見なし解を得る方法をAitkenのΔ2乗法という。

    これを用い、繰り返し計算により解を得るためには、x 0,x 1,x 2を用いx 3を得る、
    次いでx 3,x 4,x 5を用いx 6を得るというように。x 3,x 6,x 9・・・に対しAitkenのΔ2乗法を用い、ほかに対して線形反復法を用いる。

    VBAによるAitkenのΔ2乗法プログラム

    線形反復法と同様に、x 2-x-2=0の解をAitkenのΔ2乗法により求めた。(下記コード)

    Option Explicit Private step As Integer '次に結果を代入するターゲット Private xmiddle(2) As Double '次のxを求める 収束した場合trueを返す Public Function NextStep() As Boolean step = step + 1 NextStep = False Dim xi As Double Dim xi1 As Double Dim xi2 As Double If step Mod 3 <> 0 Then xi = xmiddle((step + 2) Mod 3) xmiddle(step Mod 3) = 1 + (2 / xi) Else xi = xmiddle(step Mod 3) '-3=6=0 mod 3 xi1 = xmiddle((step + 1) Mod 3) '-2=4=1 mod3 xi2 = xmiddle((step + 2) Mod 3) '-1=2=2 mod3 xmiddle(step Mod 3) = xi - (((xi1 - xi) ^ 2) / (xi2 - (2 * xi1) + xi)) End If If Abs(xmiddle(step Mod 3) - xmiddle((step + 2) Mod 3)) < 0.00001 Then NextStep = True End If End Function Public Property Let x0(x0 As Double) xmiddle(step Mod 3) = x0 End Property Public Property Get x0() As Double x0 = xmiddle(step Mod 3) End Property

    線形反復法と同様に解の1つである、x=2に近い値を得ることができた。 加えて収束の速度が改善されていることが確認できた。(下図)

    収束の状況

    まとめ

    線形反復法とAitkenのΔ2乗法プログラムを作成し、方程式の解を求めた。
    いずれの方法でも解の近似値を得ることができた。