セカント法
📂数値解析セカント法
メソッド

f,f’,f’’ が α の近傍で連続であり、f(α)=0,f′(α)=0 とする。
α に十分近い初期値 x0,x1 に対して
xn+1:=xn−f(xn)f(xn)−f(xn−1)xn−xn−1
と定義された数列 {xn} はn→∞ の時 α に 21+5 次で収束する。
説明
黄金比
収束次数はかなり馴染み深いものがあるはずだ。それはまさに黄金比の 21+5=1.618⋯ であり、数列の定義から3つの連続した項を使用して証明中にフィボナッチ数列が出現する。セカントメソッドの有用性を言及する前にかなり興味深い現象である。この次数は、セカント法がバイセクションメソッドよりも早いが、ニュートン・ラフソン法よりは遅いことを意味する。
ニュートン・ラフソン法がより早いにも関わらず、このような方法を考案した理由は、導関数を求めることが過度に難しい場合があるからである。さらに、計算量においては収束次数が低いため、ニュートン・ラフソン法に比べて計算回数は多いが、一回一回の計算コストの面ではセカントメソッドが良い場合がある。どの方法がより良いかは問題による。(しかし、正直に言ってニュートン法以外はほとんど使わない。)
初期値問題

ニュートン・ラフソン法と同様に、初期値が間違って与えられた場合、十分に α に近くなければ収束しないことがある。
証明
- H{a,b,c,⋯} は a,b,c,⋯ を含む最小の区間を表示する。
パート1. 差分表
f[x0,x1]:=f[x0,x1,x2]:=x1−x0f(x1)−f(x0)x2−x0f[x1,x2]−f[x0,x1]
を定義する。これらを差分表と呼び、f’(ξ)=f[x0,x1] と 21f’’(ζ)=f[x0,x1,x2] を満たす
ξ∈ζ∈H{x0,x1}H{x0,x1,x2}
が存在する。
パート2. α−xn+1=−(α−xn−1)(α−xn)2f’(ξn)f′′(ζn)
xn+1=xn−f(xn)f(xn)−f(xn−1)xn−xn−1 の両辺に −1 を掛けて α を加えると
α−xn+1=α−xn+f(xn)f(xn)−f(xn−1)xn−xn−1
であり、
α−xn+1=========α−xn+f(xn)−f(xn−1)xnf(xn)−xn−1f(xn)f(xn)−f(xn−1)xnf(xn)−xn−1f(xn)+αf(xn)−xnf(xn)−αf(xn−1)+xnf(xn−1)f(xn)−f(xn−1)1[−xn−1f(xn)+αf(xn)−αf(xn−1)+xnf(xn−1)]f(xn)−f(xn−1)1[(α−xn−1)f(xn)−(α−xn)f(xn−1)]−f(xn)−f(xn−1)(α−xn−1)(α−xn)[xn−αf(xn)−f(xn−1)]−f(xn)−f(xn−1)(α−xn−1)(α−xn)[xn−αf(xn)−f(α)−xn−1−αf(xn−1)−f(α)]−(α−xn−1)(α−xn)f(xn)−f(xn−1)1[f[xn,α]−f[xn−1,α]]−(α−xn−1)(α−xn)f(xn)−f(xn−1)xn−xn−1[xn−xn−1f[xn,α]−f[xn−1,α]]−(α−xn−1)(α−xn)f[xn−1,xn]f[xn−1,xn,α]
である。整理すると
α−xn+1=−(α−xn−1)(α−xn)f[xn−1,xn]f[xn−1,xn,α]
であり、差分表の性質により次のことが得られる。
α−xn+1=−(α−xn−1)(α−xn)2f’(ξn)f′′(ζn)
パート3. 収束性
全ての与えられた仮定を満たす α の近傍で十分に小さい I:=[α−δ,α+δ] を考える。
M:=2minx∈I∣f′(x)∣maxx∈I∣f′′(x)∣
と定義すると、パート1で得られた結果により
∣α−xn+1∣≤∣α−xn∣∣α−xn−1∣M
両辺に M を掛けると
∣α−xn+1∣M≤(∣α−xn∣M)⋅(∣α−xn−1∣M)
十分に小さい I を仮定したなら、
ε:=max{(∣α−xn∣M),(∣α−xn−1∣M)}<1
を設定することで
∣α−xn+1∣M≤ε2
∣α−xn+3∣M≤(∣α−xn+2∣M)⋅(∣α−xn+1∣M)≤ε2⋅ε=ε3
∣α−xn+4∣M≤(∣α−xn+3∣M)⋅(∣α−xn+2∣M)≤ε3⋅ε2=ε5
このような方法で不等式
∣α−xn+m+1∣M≤(∣α−xn+m∣M)⋅(∣α−xn+m−1∣M)≤εqm⋅εqm−1=εqm+1
を得る。
フィボナッチ数列の一般項: 数列 {Fn} が Fn+1:=Fn+Fn−1 として定義されているとする。F0=F1=1 の場合、r0:=21+5 と r1:=21−5 に対して Fn=r0−r1r0n+1−r1n+1
{qm} は他ならぬフィボナッチ数列で、十分に大きな m に対して
qm∼51(1.618)m+1
である。したがって
∣α−xn+m∣≤M1εqm
であり、n→∞ の時 xn→α であり、さらには
21+5∼1.618
次で収束することが確認できる。
■
実装
以下は Rで記述されたコードである。
itmax
オプションは、最大反復回数であり、デフォルトでは 1000 回反復しても十分に精度の高い解が得られない場合、計算を諦める。
Secant<-function(f,x0,x1,itmax=10^3,tol=10^(-8))
{
if(f(x0)==f(x1)){stop('Wrong Initial Values')}
x2 = x1 - f(x1) \ast ( ( x1 - x0 ) / ( f(x1) - f(x0) ) )
for(i in 1:itmax)
{
x0 = x1
x1 = x2
x2 = x1 - f(x1) \ast ( ( x1 - x0 ) / ( f(x1) - f(x0) ) )
if(abs(x2-x1)<tol) {return(x2)}
}
stop('Maybe Wrong Initial Point')
}
f<-function(x) {x^3 + 8}
Secant(f,-7,7)
g<-function(x) {x^6 - x - 1}
Secant(g,0,3)
h<-function(x) {exp(x)-1}
Secant(h,-2,-1)
上記のコードを実行した結果は以下の通りである。
