数値解析において、ステフェンセン法は、ヨハン・フレデリック・ステフェンセンにちなんで名付けられた反復法であり、数値根探索法として、割線法やニュートン法に類似している。ステフェンセン法は導関数を用いずに2次収束を達成するのに対し、より一般的なニュートン法も2次収束するが導関数を必要とし、割線法は導関数を必要としないが2次収束よりも収束速度が遅い。
ステフェンセン法は、ステップごとに2回の関数評価が必要となるという欠点がある。一方、割線法はステップごとに1回の評価しか必要としないため、それぞれの反復回数によっては、計算コストの面で最も効率的とは限らない。ニュートン法も、ステップごとに2つの関数(関数とその導関数)を評価する必要があり、その計算コストは、最良の場合は割線法と同じ、最悪の場合はステフェンセン法と同じとなる。ほとんどの関数では、導関数の計算は元の関数の計算と同じくらい計算コストがかかるため、通常はニュートン法とステフェンセン法のコストは同程度となる。[ a ]
ステフェンセンの方法は、エイトケンのデルタ二乗法を不動点反復に適用したものとして導出できます。このように考えると、ステフェンセンの方法は、バナッハの不動点定理によって不動点の存在が保証され、不動点反復が収束することが保証されている場合(収束速度は遅い場合もある)、一般的なバナッハ空間における効率的な不動点計算に自然に一般化されます。
ステフェンセン法の公式の最も単純な形式は、実関数の零点を求める際に用いられる。つまり、真の値を求める満たす解決策の近く関数の導関数、完全に、またはほぼ満たす必要がある[ b ] 一部の関数では、この条件が満たされなくてもステフェンセンの方法が有効ですが、その場合、開始値は実際の解に非常に近いものでなければならないまた、解への収束が遅くなる場合もあります。後述するように、この手法の中間ステップのサイズを調整することで、こうしたケースの一部において収束を改善できる可能性があります。
適切な初期値を与えると値のシーケンス以下の式を使用して生成できます。うまく機能すると、数列の各値は解に非常に近くなります。以前の値よりも。現在のステップから値が生成されます次のステップでは、式[ 1 ]を使用します。
のために傾き関数元の関数の合成です式で与えられる
あるいはもっと明確に言うと、
どこは、最後の反復ポイント間のステップサイズです。そして補助ポイントは
技術的には、その機能はこれは、2点間の[ c ]実際には、これは傾きの平均値です関数の最後のシーケンスポイントの間そして補助点は中間ステップのサイズ(およびその方向)は、
価値がは、の近似値です。その値は、条件を満たしているかどうかを確認するためにオプションでチェックできます。これは、ステフェンセンのアルゴリズムの収束を保証するために必要な条件です。わずかな不適合は必ずしも深刻な問題ではありませんが、条件から大きく逸脱すると、ステフェンセンの方法が失敗する可能性があることを警告し、代替アルゴリズム(例えば、より堅牢なイリノイアルゴリズム、または単純なregula falsi)を一時的に使用することが推奨されます。
それはただ見つけるためだけのものですこの補助点では、関数の値は以下の要件を満たさなければならない[ b ]計算の他のすべての部分については、ステフェンセンの方法では関数のみが必要です連続的であり、実際に近傍に解が存在すること。[ 1 ]ステップのいくつかの小さな修正傾きの式で使用される関数に対応するために、 1 / 2や3/4を掛けるなどの方法が存在する 。 要件を完全に満たしていないもの。
ステフェンセン法の主な利点は、ニュートン法と同様に二次収束性を持つことである[ 1 ]。つまり、どちらの方法も方程式の根を見つける。同じように「素早く」。この場合、「素早く」とは、どちらの方法でも、各ステップごとに正解の桁数が倍になることを意味します。しかし、ニュートン法の公式では、関数の導関数を評価する必要があります。機能も同様にステフェンセンの方法では、それ自体が重要です。これは、デリバティブが容易に、あるいは効率的に入手できない場合に特に重要です。
迅速な収束の代償は、関数評価の2倍です。そして計算する必要があるが、時間がかかる可能性があるは複雑です。比較のために、regula falsiと割線法はどちらも、ステップごとに 1 つの関数評価しか必要としません。割線法は、 ステップごとに正しい桁数を「わずか」約 1.6 倍に増やしますが、与えられた時間内に割線法の 2 倍のステップを実行できます。割線法は Steffensen の方法と同じ時間で 2 倍のステップを実行できるため、[ d ]実際には、両方のアルゴリズムが成功した場合、割線法は Steffensen の方法よりも速く収束します。割線法は、2 ステップ (2 つの関数評価) ごとに約(1.6) 2 ≈ 2.6倍の桁数を達成しますが、Steffensen の方法では 1 ステップ (2 つの関数評価) ごとに2倍になります。
他のほとんどの反復根探索アルゴリズムと同様に、ステフェンセン法の決定的な弱点は、「十分に近い」初期値を選択することにある。値が実際の解決策に「十分近い」とは言えないこの方法は失敗する可能性があり、値のシーケンスは2つ(またはそれ以上)の極端な状態の間を不規則に揺れ動くか、無限大に発散するか、あるいはその両方になる可能性がある。
以下のMATLABコードに実装されているSteffensen法のバージョンは、収束加速のためのAitkenのデルタ二乗法を用いて見つけることができます。以下の式を上記のセクションの式と比較するには、次の点に注意してください。この方法は、線形収束する数列から始めて、その数列の収束速度を上げることを前提としています。同意して数列の望ましい限界に「十分近い」すると仮定できる
となることによって
数列の目的の極限を求める与える:
その結果、より速やかに収束する数列が得られる。
以下は、 MATLABで実装された Steffensen 法のソースコードです。
function Steffensen ( f, p0, tol ) % この関数は、固定点反復関数 f、% 固定点の初期推定値 p0、および許容値 tol を入力として受け取ります。% 固定点反復関数は、% インライン関数として入力されることを前提としています。 % この関数は、式 f(x) = p が指定された許容値 tol の範囲内で真となる固定点 p を計算して返します。format compact % 出力が短くなります。format long % 小数点以下の桁数が増えます。for i = 1 : 1000 % 多数だが有限の反復回数を実行する準備をします。% これは、メソッドが収束しない場合に、% 無限ループに陥らないようにするためです。p1 = f ( p0 ) + p0 ; % 固定点の次の 2 つの推定値を計算します。p2 = f ( p1 ) + p1 ; p = p0 - ( p1 - p0 ) ^ 2 / ( p2 - 2 * p1 + p0 ) % エイトケンのデルタ二乗法を使用して、% p0 のより良い近似値を見つけます。if abs ( p - p0 ) < tol % 許容範囲内かどうかをテストします。break % 許容範囲内であれば、反復を停止します。これで答えが得られました。end p0 = p ; % 次の反復のために p0 を更新します。endif abs ( p - p0 ) > tol % 許容値を満たせない場合は、失敗メッセージを出力します。'1000回の反復で収束しませんでした。' end以下は、Steffensenの手法をPythonで実装したソースコードです。
from typing import Callable , Iterator Func = Callable [[ float ], float , float ]def g ( f : Func , x : float , fx : float ) -> float : """1 階除算差分関数。 引数: f: g への関数入力 x: g を評価する点 fx: x で評価された関数 f """ return f ( x + fx ) / fx - 1defsteff(f:Func,x:float,tol:float)->Iterator[float]:"""Steffensen algorithm for finding roots. This recursive generator yields the x_{n+1} value first then, when the generator iterates, it yields x_{n+2} from the next level of recursion. Arguments: f: Function whose root we are searching for x: Starting value upon first call, each level n that the function recurses x is x_n """n=0whileTrue:ifn>1000:print("failed to converge in 1000 iterations")breakelse:n=n+1fx=f(x)ifabs(fx)<tol:breakelse:gx=g(f,x,fx)x=x-fx/gx# Update to x_{n+1}yieldx# Yield valueSteffensen's method can also be used to find an input for a different kind of function that produces output the same as its input: for the special value Solutions like are called fixed points. Many of these functions can be used to find their own solutions by repeatedly recycling the result back as input, but the rate of convergence can be slow, or the function can fail to converge at all, depending on the individual function. Steffensen's method accelerates this convergence, to make it quadratic.
Momentarily ignoring the issues of a more general Banach space vs. basic real numbers for the sake of an example: To re-orient the reader to the earlier section, a simple toy model fixed-point function, using any root function can be made with Here is a constant with the appropriate sign that is small enough in magnitude to make stable under iteration, but large enough for the non-linearity of the function to be appreciable.
This method for finding fixed points of a real-valued function has been generalized for functions that map a Banach spaceそれ自体に、あるいはさらに一般的にあるバナッハ空間からの地図別のバナッハ空間へ一般化された方法は、有界線形演算子の族を仮定します。関連するそして(局所的に)条件[ 2 ]を満たすように考案することができる。
オペレーターこれは、要素がすべてベクトル引数の関数である行列とほぼ同等です。そしてもう一度、単純な関数を参照してください。最初のセクションで説明したように、関数は単に実数を入力として受け取り、実数を出力するだけです。これは分割差分です。ここでの一般化された形式では、演算子はこれは、バナッハ空間で使用するための分割差分の類似物です。
バナッハ空間で除算が可能な場合、線形演算子入手先は
これは何らかの洞察を与えてくれるかもしれない。このように表現すると、線形演算子はこれは分割差の精緻なバージョンとしてより容易に理解できる上記第1節で説明したとおりです。商形式は、ここでは理解を助けるためだけに示したものであり、必ずしも必要ではありません。また、バナッハ空間内での除算は、詳細なステフェンセンの方法が有効であるために必要ではありません。唯一の要件は、演算子が(1)を満たす。
ステフェンセン法は、分割差分を用いる点を除けば、ニュートン法と非常によく似ている。導関数の代わりに引数については、ある固定点に近い不動点関数およびそれらの線形演算子条件(1)を満たす、どこは恒等演算子です。
バナッハ空間で除算が可能な場合、一般化された反復式は次のように与えられる。
のために除算が不可能なより一般的なケースでは、反復式は解を求める必要がある。近いそのために
言い換えれば、解決策を求めることもできる。やや縮小された形
角括弧内のすべての値は独立している :} 括弧内の項はすべて、しかし、2番目の形式は1番目の形式ほど数値的に安定していない可能性があります。1番目の形式は(願わくば)小さな差の値を求めるため、反復値の過度に大きな変化や不規則な変化を数値的に回避できる可能性が高くなります。
線形演算子満たす
ある正の実定数に対してすると、この方法は2次収束して固定点に収束する。初期近似値の場合望ましい解に「十分近い」満たす